Ich verwende seit inzwischen doch geraumer Zeit h2o als Reverse-Proxy auf einem meiner Server. Da ich es immer aus dem Git-Depot kompiliere, habe ich ein bißchen Sorge, daß die Version, die ich laufen lasse, gravierende Sicherheitslücken haben könnte. Deshalb habe ich mir eine SELinux-Policy für h2o zusammengeschustert, die etwaige Gefahren ein wenig eindämmen soll. Teile davon habe ich handgestrickt, andere mittels audit2allow semiautomatisch generiert und kurz überflogen. Ich kann allerdings nicht garantieren, daß die Policy nicht irgendwelche großen Angriffstüren sperrangelweit offen läßt. Insofern würde ich mich sehr freuen, wenn ihr mir Feedback zu ihr geben könntet. Ihr könnt aber auch einfach töricht sein und sie ungeprüft übernehmen. In diesem Fall wünsche ich schon mal viel Glück.

### h2o.te ###

policy_module(h2o, 1.0.0)
require {
  type urandom_device_t;
  type unconfined_t;
  type fs_t;
  type bin_t;
  type usr_t;
  type proc_t;
  type shell_exec_t;
  type http_port_t;
  type http_cache_port_t;
}

type h2o_t;
type h2o_exec_t;
init_daemon_domain(h2o_t, h2o_exec_t)

type h2o_log_t;
logging_log_file(h2o_log_t)

type h2o_var_run_t;
files_pid_file(h2o_var_run_t)

type h2o_share_t;
allow unconfined_t h2o_share_t:file { setattr read write open relabelto getattr unlink };
allow unconfined_t h2o_share_t:dir { search setattr read write open relabelto getattr unlink };
allow h2o_share_t fs_t:filesystem associate;

allow h2o_t self:capability { setgid setuid kill };
allow h2o_t self:process { getpgid setrlimit getsession signal };
allow h2o_t self:fifo_file rw_fifo_file_perms;
allow h2o_t self:unix_stream_socket create_stream_socket_perms;

allow h2o_t cert_t:file { open read getattr ioctl lock };
allow h2o_t h2o_share_t:file { execute_no_trans execute open read getattr ioctl lock };

manage_dirs_pattern(h2o_t, h2o_log_t, h2o_log_t)
manage_files_pattern(h2o_t, h2o_log_t, h2o_log_t)
manage_lnk_files_pattern(h2o_t, h2o_log_t, h2o_log_t)
logging_log_filetrans(h2o_t, h2o_log_t, { dir file lnk_file })

manage_dirs_pattern(h2o_t, h2o_var_run_t, h2o_var_run_t)
manage_files_pattern(h2o_t, h2o_var_run_t, h2o_var_run_t)
manage_lnk_files_pattern(h2o_t, h2o_var_run_t, h2o_var_run_t)
files_pid_filetrans(h2o_t, h2o_var_run_t, { dir file lnk_file })

domain_use_interactive_fds(h2o_t)

files_read_etc_files(h2o_t)

auth_use_nsswitch(h2o_t)

miscfiles_read_localization(h2o_t)

sysnet_dns_name_resolve(h2o_t)

allow h2o_t fs_t:filesystem getattr;
allow h2o_t usr_t:file execute;
allow h2o_t bin_t:file { execute execute_no_trans };
allow h2o_t proc_t:file { read getattr open };
allow h2o_t shell_exec_t:file { execute execute_no_trans };
allow h2o_t urandom_device_t:chr_file { getattr open ioctl read };
allow h2o_t http_port_t:tcp_socket name_bind;
allow h2o_t http_port_t:tcp_socket name_connect;
allow h2o_t self:capability { dac_override net_bind_service };
allow h2o_t self:tcp_socket { accept listen };
allow h2o_t tmp_t:dir { write rmdir setattr read remove_name create add_name };
allow h2o_t tmp_t:file { write create unlink open };
allow h2o_t http_cache_port_t:tcp_socket name_connect;
allow h2o_t tmp_t:sock_file { create write unlink setattr };
allow h2o_t self:unix_stream_socket connectto;
allow h2o_t self:capability chown;
### h2o.fc ###

/usr/local/stow/h2o/bin/h2o             --      gen_context(system_u:object_r:h2o_exec_t,s0)

/usr/local/stow/h2o/share/h2o/.*                gen_context(system_u:object_r:h2o_share_t,s0)

/var/log/h2o(/.*)?                              gen_context(system_u:object_r:h2o_log_t,s0)

/var/run/h2o(/.*)?                              gen_context(system_u:object_r:h2o_var_run_t,s0)