看完了的感覺不是很好
幾乎都沒提到什麼是 SELinux?SELinux 的運作機制是什麼?
大部份提到的解決辦法,都是 “請把 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/