SELinux 的配置小解
【转载】
SELinux 是从FC3和AS4起,所提供的一个高级安全特性。
它可以对系统上运行的任何一个应用程序做权限上的控制。
版本低于FC3/AS4的Linux,没有提供SELinux特性,或者默认就是禁用这个特性的。
为了运行Plesk,需要对SELinux做一些修改,否则可能会造成某些服务运行不正常或者启动失败。
SElinux把所有的拒绝信息输出到:/var/log/messages 位置。
如果某个服务比如bind不能正常启动,请查询messages文件来确认是否是SELinux造成服务不能运行。
这些信息可以很简单的使用/usr/bin/audit2allow来更改规则。
运行如下命令,查看哪些程序的访问被SELinux拦截掉了:
cat /var/log/messages | /usr/bin/audit2allow
然后,把列出的被拒绝的访问加入到SELinux的配置文件中。
通常,建议加入如下内容:
/etc/selinux/targeted/src/policy/domains/program/apache.te
----------------------------------------------------------------
allow httpd_sys_script_t var_t:file { execute getattr };
allow httpd_t self:tcp_socket connect;
allow httpd_t usr_t:dir write;
allow httpd_t var_log_t:file { append getattr setattr };
allow httpd_sys_script_t devlog_t:sock_file write;
allow httpd_sys_script_t self:unix_dgram_socket { connect create write };
allow httpd_sys_script_t ld_so_cache_t:file execute;
allow httpd_sys_script_t syslogd_t:unix_dgram_socket sendto;
allow httpd_sys_script_t var_t:dir { add_name remove_name write };
allow httpd_sys_script_t var_t:fifo_file write;
allow httpd_sys_script_t var_t:file { create execute_no_trans link read unlink write };
----------------------------------------------------------------
/etc/selinux/targeted/src/policy/domains/program/named.te
----------------------------------------------------------------
allow named_t named_zone_t:chr_file read;
allow ndc_t named_zone_t:file { getattr read write };
allow named_t named_zone_t:dir { add_name write read remove_name };
allow named_t named_zone_t:file { create unlink write };
----------------------------------------------------------------
/etc/selinux/targeted/src/policy/domains/program/syslogd.te
----------------------------------------------------------------
allow syslogd_t usr_t:file append;
allow syslogd_t usr_t:file ioctl;
-------------------------------------------------------------------------
最后使用如下命令重新加载SELinux:
make -C /etc/selinux/targeted/src/policy reload
重灌 server 並啟用 SELinux 以後,發現 asp.net 應用程式無法啟動.
經過研讀文件之後,大致上對 SELinux 有一定的瞭解.
SELinux 本身純粹是作安全性的加強,所以不管是 user, file, directory, socket, process...等等的,都另外有了 security context,作為安全性的第二道防線.
當系統要存取這些資源的時候,首先會使用原有的 unix permission 去作檢查,接著 SELinux 會再依照 security context 作第二道檢查,當檢查沒問題之後,才會允許存取.
SELinux 裡面有所謂的 identity, domain, type, security context, target context 等等物件...
大致上來說, identity 決定身份, domain 決定 process 能幹麼, type 決定 process 以外的物件可以幹麼, security context, target context 則是 identity + domain + type 的組合. policy 則用來定義 security context, target context 可以存取哪些物件. (這些組合,真的很讓人頭暈.)
存取的指令也蠻多的:
要看檔案目錄的 security context, 可以加上 -Z (ls -Z)
要看process的 security context, 也可以用 -Z (ps axZ)
要看自己的security context,可以用 id
要改security context, 可以用 chcon
要 reset security context, 可以用 restorecon
...
整個研讀完之後,發現應該是 policy 問題.
今天下午用Google去找到這篇文章,發現有這麼個工具 - audit2allow,他是在 policycoreutils 套件裡面的指令,可以根據 warning message 產生 policy,省掉不少編寫的麻煩.
為了要能重新編譯 policy, 你需要安裝 selinux-policy-targeted-sources 這個套件
yum install selinux-policy-targeted-sources
再使用 audit2allow 這個指令,從 dmesg 裡面分析 warning, 並將產生以後的 policy 寫入到 mono.policy 檔案中.
audit2allow -d -o mono.policy
接著把 mono.policy 更名為 local.te, 放到 /etc/selinux/targeted/src/policy/domains/misc/ .
放完之後,切換到 /etc/selinux/targeted/src/policy
強制 selinux 重新編譯 policy
make load
最後重新啟動我的 Apache server,就大功告成了.