2011年5月30日 星期一

SELinux 設定說明

SELinux 的設定檔

* /etc/selinux/config # This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted
若要停用 SELinux,則把 SELINUX=enforcing 改成 SELINUX=disabled 後重新開機即可

SELinux 的一些相關指令

* sestatus
查看 SELinux 是否啟用及目前狀態如何的指令
如:
1.SELinux Disabled $ sestatus

SELinux status:         disabled
2.SELinux Enabled
mode: enforcing
Policy: targeted $ sestatus

SELinux status:         disabled
SELinux status:         enabled
SELinuxfs mount:        /selinux
Current mode:           enforcing
Mode from config file:  enforcing
Policy version:         18
Policy from config file:targeted

Policy booleans:
...skip...
httpd_builtin_scripting active
httpd_disable_trans     active
httpd_enable_cgi        active
httpd_enable_homedirs   active
httpd_ssi_exec          active
httpd_tty_comm          inactive
httpd_unified           active
...skip...
* system-config-securitylevel
圖形化介面的工具程式,除了可以設定防火牆(iptables)外,也可以設定 SELinux
* setenforce
在 SELinux 啟動為 enforcing 的狀況下,可以執行 “setenforce 0“ 來將 SELinux 暫時停用
* getsebool and setsebool
/etc/selinux/targeted/booleans 這個檔裡面放的就是各個 Policy 的布林值,不過,在 FC5 之後,已經沒有這個檔了,你可以用
$ getsebool -a
來查看所有的 booleans 設定狀況
或是使用如:
$ setsebool -P httpd_disable_trans 1
來將 httpd_disable_trans 停用,這樣其實也就等於是停用 SELinux 對 httpd 的保護了
* chcon
傳統的 chmod 指令是用來設定檔案或目錄的權限的,而同樣的 chcon 指令則是用來設定 SELinux 對檔案或目錄的 content 標籤的
* fixfiles
fixfiles check 指令可以用來檢查檔案或目錄的 SELinux content
fixfiles restore 指令則可以用來修正(還原)檔案或目錄的 SELinux content
fixfiles relabel 則是會重新修正(還原)所有的檔案及目錄的 SELinux content

如何在 SELinux 啟動為 enforcing 的狀況下也讓 Web Server(httpd) 能正常運作?

前面提到,我們可以將 SELinux 停用(disabled) 或是執行 “setsebool -P httpd_disable_trans 1“ 來停用 SELinux 對 httpd 的保護,這樣,httpd 就可以跟平常一樣的運作了
那如果我們要啟用 SELinux 且讓 httpd 也可以正常運作呢?
舉個例子來說: [root@acer:~] pwd

/root
[root@acer:~] echo "< ? phpinfo(); ?>" > index.php
[root@acer:~] mv index.php /var/www/html/
`index.php' -> `/var/www/html/index.php'
[root@acer:~]
在上述的指令中,我在 root 的 $HOME 目錄下產生了一個 index.php 的檔案,內容為顯示 phpinfo
然後把再把這個檔案搬移到 /var/www/html 目錄底下,然後開 browser 來瀏覽 http://localhost/index.php 這個頁面,得到的畫面卻是: Forbidden


You don't have permission to access /index.php on this server.

Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request.
沒錯,無法存取,我們來看一看到底是怎麼回事: [root@acer:~] ls -Z /var/www/html/index.php

-rw-r--r--  root     root     root:object_r:user_home_t        /var/www/html/index.php
[root@acer:~]
[root@acer:~] ls -Z /var/www/
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_script_exec_t cgi-bin/
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t error/
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t html/
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t icons/
drwxr-xr-x  root     root     system_u:object_r:httpd_sys_content_t manual/
因為 index.php 的 content type 為 user_home_t 而不是 httpd_sys_content_t 所以無法存取
因此,我們可以執行: [root@acer:~] chcon -u system_u -t httpd_sys_content_t /var/www/html/index.php

[root@acer:~] ls -Z /var/www/html/index.php
-rw-r--r--  root     root     system_u:object_r:httpd_sys_content_t /var/www/html/index.php
請再開一次 browser (or reload),現在是不是可以正常存取 index.php 頁面了呢?
再看另一個例子: [root@acer:~] wget http://wordpress.org/latest.tar.gz

--13:36:59--  http://wordpress.org/latest.tar.gz
           => `latest.tar.gz'
Resolving wordpress.org... 72.232.44.122
Connecting to wordpress.org|72.232.44.122|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/octet-stream]

    [                     < =>             ] 505,475       90.49K/s

13:37:07 (90.28 KB/s) - `latest.tar.gz' saved [505475]

[root@acer:~] tar zxf latest.tar.gz
[root@acer:~] mv wordpress /var/www/html/wp
`wordpress' -> `/var/www/html/wp'
瀏覽 http://localhost/wp/ 的結果一樣被拒絕存取,因為 content 的問題 [root@acer:~] ls -dZ /var/www/html/wp

drwxr-xr-x  1025     1011     root:object_r:user_home_t        /var/www/html/wp/
同樣的,我們可以用 chone -R 指令來修正 content [root@acer:~] chcon -R -u system_u -t httpd_sys_content_t /var/www/html/wp/
或是使用 fixfiles restore 指令也可以 [root@acer:~] fixfiles restore /var/www/html/wp/
修正過後的狀況: [root@acer:~] ls -dZ /var/www/html/wp

drwxr-xr-x  apache   apache   system_u:object_r:httpd_sys_content_t /var/www/html/wp/

相關參考文件

Comments are closed. 

沒有留言: