SELinux 的安全防護措施主要集中在各種網路服務的存取控制。對於像 Apache 、Samba、NFS、vsftp 、MySQL、Bind dns 等服務來說,SELinux 僅僅開放了最基本的運行需求。至於串連外部網路、運行指令碼、訪問使用者目錄、共用檔案等,必須經過一定的 SELinux 策略調整才能充分發揮網路伺服器的作用,在安全和效能直接擷取平衡。
SELinux 環境下的 Apache 配置
Apache 的 SELinux 的檔案類型
當啟用 SELinux 是,Apache HTTP 伺服器httpd)預設情況下在受限的 httpd_t 域中運行,並和其他受限制的網路服務分開。即使一個網路服務被攻擊者破壞,攻擊者的資源和可能造成的損害是有限的。下面的樣本示範的是 SELinux 下的 httpd 進程。
$ ps -eZ | grep httpd unconfined_u:system_r:httpd_t:s0 2850 ? 00:00:00 httpd unconfined_u:system_r:httpd_t:s0 2852 ? 00:00:00 httpd …… |
和 SELinux 上下文相關的 httpd 進程是 system_u:system_r:httpd_t:s0。 httpd 進程都運行在 httpd_t 域中。檔案類型必須正確設定才能讓 httpd 訪問 。例如 httpd 可以讀取檔案類型是 httpd_sys_content_t,但不能寫和修改。此外 httpd 不能訪問 samba_share_t 類型的檔案Samba 存取控制的檔案),也不能訪問使用者主目錄中被標記為與 user_home_t 檔案類型,主要是防止 httpd 讀寫使用者主目錄中的檔案並且繼承其存取權限。httpd 可以讀寫的檔案類型是 httpd_sys_content_rw_t。Apache 預設的主目錄類型是 httpd_sys_content_t。除非另外設定 httpd 只能訪問 / var/www/html/ 目錄中的 httpd_sys_content_t 類型的檔案和子目錄。此外 SELinux 還針對 httpd 定義了一些檔案類型:
- httpd_sys_content_t 主要用於提供靜態內容服務的檔案,如 HTML 靜態網站使用的檔案。這種類型的標記檔案可以訪問唯讀)httpd 和執行指令碼 httpd。預設情況下,這種類型的檔案和目錄標記不能被寫入或修改 httpd 或其他進程。注意:預設情況下,建立的檔案或複製到的 /var/www/html/httpd_sys_content_t 類型的標記。
- httpd_sys_script_exec_t 主要用於設定 /var/www/cgi-bin/ 目錄下的 cgi 指令碼。預設情況下 SELinux 策略防止 httpd 執行 CGI 指令碼。
- httpd_sys_content_rw_t 使用 httpd_sys_content_rw_t 的類型標籤讀取和寫指令碼標記檔案 httpd_sys_script_exec_t 的類型。
- httpd_sys_content_ra_t 使用 httpd_sys_content_ra_t 的類型標籤將讀取和附加標記的指令檔 httpd_sys_script_exec_t 類型。
如果需要修改檔案和目錄的 SELinux 類型屬性時可以使用三個命令:chcon、 semanage fcontext 和 restorecon 命令 。說明:使用 chcon 命令來對檔案的類型進行重新標識。然而,這樣的標識不是永久性的修改,一旦系統重啟,該標識就會改變回去。對於檔案類型的永久性改變,需要採用 semanage 命令。chcon、 semanage fcontext 和 restorecon 三個命令是本文的重點下面首先介紹一下使用方法:
1)chcon 命令
作用:chcon 命令用來改變 SELinux 檔案屬性即修改檔案的安全上下文
用法:chcon [ 選項 ] CONTEXT 檔案
主要選項 :
-R:遞迴改變檔案和目錄的上下文。
--reference:從源檔案向目標檔案複製安全上下文
-h, --no-dereference:影響目標連結。
-v, --verbose:輸出對每個檢查檔案的診斷。
-u, --user=USER:設定在目標使用者的安全上下文。
-r,--role=ROLE:設定目標安全領域的作用。
-t, --type=TYPE:在目標設定的安全上下文類型。
-l, --range=RANGE:設定 set role ROLE in the target security context 目標安全領域的範圍。
-f:顯示少量錯誤資訊。
2)restorecon 命令
作用:恢複 SELinux 檔案屬性檔案屬性即恢複檔案的安全上下文
用法:restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]
主要選項 :
-i:忽略不存在的檔案。
-f:infilename 檔案 infilename 中記錄要處理的檔案。
-e:directory 排除目錄。
-R – r:遞迴處理目錄。
-n:不改變檔案標籤。
-o outfilename:儲存檔案清單到 outfilename,在檔案不正確情況下。
– v:將過程顯示到螢幕上。
-F:強制恢複檔案安全語境。
說明;restorecon 命令和 chcon 命令類似,但它基於當前策略預設檔案上下文檔案設定與檔案有關的客體的安全上下文,因此,使用者沒有指定一個安全上下文,相反,restorecon 使用檔案上下文檔案的條目匹配檔案名稱,然後應用特定的安全上下文,在某些情況下,它是在還原正確的安全上下文。
3)semanage fcontext 命令
作用:管理檔案安全上下文
用法:
semanage fcontext [-S store] -{a|d|m|l|n|D} [-frst] file_spec
semanage fcontext [-S store] -{a|d|m|l|n|D} -e replacement target
主要選項 :
-a:添加
-d:刪除
-m:修改
-l:列舉
-n:不列印說明頭
-D:全部刪除
-f:檔案
-s:使用者
-t:類型
r:角色
Apache 的 SELinux 的布爾變數
對於網路服務而言,SElinux 僅僅開放了最低運行需求,為了發揮 Apache 伺服器的功能還必須把布爾值必須開啟,以允許某些行為包括允許 httpd 指令碼網路訪問, 允許 httpd 訪問 NFS 和 CIFS 檔案系統, 允許執行通用閘道介面CGI)指令碼 。可以使用命令 getsebool 查詢當前布爾變數。然後可以使用下面的 setsebool 命令開放布爾變數:
#setsebool – P httpd_enable_cgi on |
下面是常用的布爾變數:
- allow_httpd_anon_write 禁用時這個布爾變數允許的 httpd 到只有標記檔案 public_content_rw_t 類型的讀取存取。啟用此布爾變數將允許的 httpd 寫入到檔案標記與一個公用檔案目錄包 含一個公用檔案傳輸服務,如 public_content_rw_t 類型。
- allow_httpd_mod_auth_pam 啟用此布爾變數允許 mod_auth_pam 模組訪問 httpd。
- allow_httpd_sys_script_anon_write 這個布爾變數定義 HTTP 指令碼是否允許寫訪問到檔案標記在一個公用檔案傳輸服務 public_content_rw_t 類型。
- httpd_builtin_scripting 這個布爾變數定義 httpd 的指令碼的訪問。在這個布爾變數啟用,往往需要為 PHP 內容。
- httpd_can_network_connect 禁用時這個布爾變數防止從網路或遠程連接埠發起串連的 HTTP 指令碼和模組。開啟這個布爾變數允許這種訪問。
- httpd_can_network_connect_db 禁用時這個布爾變數防止發起一個串連到資料庫伺服器的 HTTP 指令碼和模組。開啟這個布爾變數允許這種訪問。
- httpd_can_network_relay 開啟這個當布爾變數的 httpd 正在使用正向或反向 Proxy。
- httpd_can_sendmail 禁用時這個布爾變數防止發送郵件的 HTTP 模組。這可以防止垃圾郵件的攻擊漏洞中發現的 httpd。開啟這個布爾變數允許 HTTP 模組發送郵件。
- httpd_dbus_avahi 關閉時這個布爾變數拒絕服務的 avahi 通過 D-BUS 的 httpd 訪問。開啟這個布爾變數允許這種訪問。
- httpd_enable_cgi 禁用時這個布爾變數防止 httpd 的執行 CGI 指令碼。開啟這個布爾變數讓 httpd 的執行 CGI 指令碼。
- httpd_enable_ftp_server 開放這個布爾變數會容許的 httpd 作為 FTP 伺服器的 FTP 連接埠和行為。
- httpd_enable_homedirs 禁用時這個布爾變數阻止訪問使用者主目錄的 httpd。開啟這個布爾變數允許 httpd 訪問使用者主目錄。
- httpd_execmem 啟用時這個布爾變數允許 httpd 的執行程式需要的記憶體位址。建議不要啟用這個布爾變數從安全形度來看,因為它減少了對緩衝區溢位,但是某些模組和應用程式如 Java 和 Mono 應用)的保護需要這種特權。
- httpd_ssi_exec 這個布爾變數定義伺服器端包含SSI)的網頁中的元素是否可以執行。
- httpd_tty_comm 這個布爾變數定義的 httpd 是否被允許訪問的控制終端。這種訪問通常是不需要的,但是,如配置 SSL 憑證檔案的情況下,終端訪問所需的顯示和處理一個密碼提示。
- httpd_use_cifs 開啟這個布爾變數允許 httpd 訪問 CIFS 檔案系統上標記的檔案,如通過 Samba 掛載的檔案系統,cifs_t 類型。
- httpd_use_nfs 開啟這個布爾變數允許 httpd 訪問 NFS 檔案系統上的標記檔案 nfs_t 類型,如檔案系統,通過 NFS 掛載。
幾個配置執行個體:
1) 運行一個靜態 web 網頁
假設使用如下命令:mkdir /mywebsite ,建立一個檔案夾作為 Apache 伺服器的主目錄。可以使用如下命令查看其檔案屬性:
# ls -dZ /mywebsite drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /mywebsite |
按照 SELinux 策略規定和繼承原則,/mywebsite 目錄和其中的檔案會具有 default_t 類型,,包括以後建立的檔案或者子目錄也會繼承和擁有這種類型,這樣受限的 httpd 進程是不能訪問的,可以使用 chcon 和 restorecon 命令修改 /mywebsite 的檔案類型屬性,確保之後建立的檔案和複製的檔案具有相同 httpd_sys_content_t 的類型,從而使受限的 httpd 進程能夠訪問。
# chcon -R -t httpd_sys_content_t /mywebsite # touch /mywebsite/index.html # ls -Z /mywebsite /website/index.html -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /mywebsite /index.html |
下面修改 /etc/httpd/conf/httpd.conf 檔案,改為:
#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite" |
然後重啟 Apache 伺服器。
如果要要徹底修改 /mywebsite 的檔案類型屬性,使之重新啟動後設定還有效,可以使用 semanage fcontext 和 restorecon 命令
# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?" # restorecon -R -v /mywebsite |
2) 共用 NFS 和 CIFS 檔案系統
預設情況下,在用戶端的 NFS 掛載 NFS 檔案系統的政策定義一個預設的上下文標記這個預設的上下文使用 nfs_t 類型。此外預設情況下,Samba 共用用戶端上安裝有策略的定義一個預設的上下文標記。這個預設的上下文使用 cifs_t 類型。根據 SELinux 策略配置,Apache 服務可能無法讀取 nfs_t 或 cifs_t 類型。通過設定布爾值開啟或關閉來控制哪個服務被允許訪問 nfs_t 和 cifs_t 類型。
例如使用 setsebool 命令開啟 httpd_use_nfs 布爾變數後,httpd 即可訪問 nfs-t 類型的 nfs 共用資源了:
# setsebool -P httpd_use_nfs on |
例如使用 setsebool 命令開啟 httpd_use_cifs 布爾變數後,httpd 即可訪問 cifs_t 類型的 cifs 共用資源了:
# setsebool -P httpd_use_cifs on |
3)更改連接埠號碼
根據策略配置,服務可能只被允許運行在特定的連接埠號碼 。試圖改變服務啟動並執行連接埠,在不改變政策,可能導致啟動失敗的服務。首先查看一下 SELinux 允許 HTTP 偵聽 TCP 通訊埠,使用命令:
# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
可以看到預設情況下,SELinux 允許 HTTP 偵聽 TCP 通訊埠 80,443,488,8008,8009 或 8443。假設要把連接埠號碼 80 修改為 12345 ,下面看看修改連接埠號碼的方法:
修改設定檔 /etc/httpd/conf/httpd.conf 為
# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) #Listen 12.34.56.78:80 Listen 10.0.0.1:12345 |
使用命令修改:
# semanage port -a -t http_port_t -p tcp 12345 |
然後確認一下:
# semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443 |
SELinux 環境下 Samba 配置
Samba 的 SELinux 的檔案類型
SELinux 環境中,Samba 伺服器的 smbd 和 nmbd 守護進程都是在受限的 smbd_t 域中運行。並且和其他受限的網路服務相互隔離。下面的樣本示範的是 SELinux 下的 smb 進程
$ ps -eZ | grep smb unconfined_u:system_r:smbd_t:s0 16420 ? 00:00:00 smbd unconfined_u:system_r:smbd_t:s0 16422 ? 00:00:00 smbd |
預設情況下,smbd 只能讀寫 samba_share_t 類型的檔案 , 不能讀寫 httpd_sys_content_t 類型的檔案。如果希望 smbd 能讀寫 httpd_sys_content_t 類型的檔案,可以重新標記檔案的類型。另外還可以修改布爾值如允許 Samba 提供 NFS 檔案系統等共用資源。如果需要修改檔案和目錄的 SELinux 類型屬性時可以使用三個命令:chcon、 semanage fcontext 和 restorecon 命令 。
Samba 的 SELinux 的布爾變數
SELinux 也為 Samba 提供了一些布爾變數用來調整 SELinux 策略,如果希望 Samba 伺服器共用 NFS 檔案系統,可以使用如下命令:
# setsebool -P samba_share_nfs on
下面是常用的布爾變數;
- allow_smbd_anon_write 開放此布爾變數啟用允許 smbd 保留一個地區的共同檔案。
- samba_create_home_dirs 開放此布爾變數啟用允許 Samab 獨立建立新的主目錄。這通常是用於 PAM 機制。
- samba_domain_controller 當啟用此布爾變數時允許 Samba 作為網域控制站,以及賦予它的許可權執行相關的命令,如使用 useradd,groupadd 的 和 passwd 。
- samba_enable_home_dirs 啟用此布爾變數允許 Samba 共用使用者的主目錄。
- samba_export_all_rw 啟用此布爾變數允許公布任何檔案或目錄,允許讀取和寫入許可權。
- samba_run_unconfined 啟用此布爾變數允許允許的 Samba 運行 / var / lib/samba/ scripts 目錄中的指令碼。
- samba_share_nfs 啟用此布爾變數將允許 Samba 共用 NFS 檔案系統。
- use_samba_home_dirs 啟用此布爾變數可以使用遠程伺服器 Samba 的主目錄。
- virt_use_samba 允許虛擬機器訪問 CIFS 檔案。
配置執行個體
1) 共用一個建立的目錄
受限建立一個目錄作為 Samba 的共用資源,然後在目錄下建立一個檔案檢驗共用是否成功。
#mkdir /myshare #touch /myshare/file1 |
設定建立目錄和目錄中檔案的類型
#semanage fcontext -a -t samba_share_t "/myshare(/.*)?" # restorecon -R -v /myshare |
修改 Samba 設定檔 /etc/samba/smb.conf,添加共用資源定義包括如下行::
[myshare] comment = My share path = /myshare public = yes writeable = yes 建立一個 samba 使用者 # smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser. |
啟動 Samba 服務
查詢可以使用的共用資源:
$ smbclient -U testuser -L localhost |
使用 mount 命令掛載共用資源,並且檢驗檔案:
#mount //localhost/myshare /test/ -o user= testuser # ls /test/ |
2)共用一個網頁
如果要共用一個網頁檔案目錄如 Apache 伺服器的 /var/www/html,是不能使用檔案類型的。此時可以使用 samba_export_all_ro 和 samba_export_all_rw 兩個布爾值變數,達到共用目錄和檔案的目的。步驟如下:
修改 samba 設定檔,添加如下行:
[website] comment = Sharing a website path = /var/www/html/ public = yes writeable = yes |
開放 samba_export_all_ro 布爾值變數
#setsebool -P samba_export_all_ro on |
設定許可權:
#chmod 777 /var/www/html/ |
共用目錄:
#mount //localhost/myshare /test/ -o user= testuser # ls /test/ |
回頁首
SELinux 環境下 NFS 配置
NFS 的 SELinux 的檔案類型
SELinux 環境中,nfs 伺服器的守護進程都是在受限的 nfs_t 域中運行。並且和其他受限的網路服務相互隔離。SELinux 策略不允許使用 NFS 共用遠程檔案。如果一定要共用遠程檔案,可以使用 nfs_export_all_ro 和 nfs_export_all_rw 等布爾值變數調整 SELinux 的策略。按照 SELinux 的策略規定用戶端安裝 NFS 檔案系統採用的預設檔案系統是 nfs_t,此外 SELinux 還針對 nfsd 定義了一些檔案類型:
- var_lib_nfs_t 這種類型用於現有的和新的檔案複製或在建立的 /var/lib/nfs 目錄中。在正常運行這種類型應該不需要改變。要恢複到預設設定,可以使用超級使用者權限運行命令:restorecon -R -v /var/lib/nfs。
- nfsd_exec_t /usr/sbin/rpc.nfsd 程式檔案和其他涉及到 NFS 可執行檔和庫都是這種類型。其他檔案不使用此類型的任何檔案。
NFS 的 SELinux 的布爾變數
SELinux 提供了幾個布爾變數用來調整 NFS,你可以在系統安全和 NFS 功能之間取得平衡。例如:
將原生 NFS 共用設定成可讀可寫,需要開放相關布爾值變數:
#setsebool -P nfs_export_all_rw on |
如果你想要將遠程 NFS 的家目錄共用到本機,需要開放相關布爾值變數:
#setsebool -P use_nfs_home_dirs on |
下面是常用的布爾變數;
- allow_ftpd_use_nfs 當啟用時這個布爾變數允許 ftpd 訪問 NFS 掛載。
- allow_nfsd_anon_write 當啟用時這個布爾變數允許寫入到一個公用目錄匿名 nfsd。
- httpd_use_nfs 當啟用時這個布爾變數容許的 httpd 訪問一個 NFS 檔案系統上儲存的檔案。
- nfs_export_all_ro 當啟用時這個布爾變數允許任何檔案或目錄通過 NFS 匯出,允許唯讀許可權。
- nfs_export_all_rw 當啟用時這個布爾變數允許任何通過 NFS 匯出的檔案或目錄,允許讀取和寫入許可權。
- qemu_use_nfs 當啟用時這個布爾變數允許 QEMU 使用 NFS 檔案系統。
- samba_share_nfs 啟用此布爾變數將允許 Samba 共用 NFS 檔案系統。
- use_nfs_home_dirs 當啟用時這個布爾變數允許將支援 NFS 主目錄。
- virt_use_nfs 當啟用時這個布爾變數允許虛擬機器訪問 NFS 檔案。
- xen_use_nfs 當啟用時這個布爾變數允許 Xen 使用 NFS 檔案。
一個例子
這個例子中 NFS 伺服器的 IP 位址 192.168.1.1,NFS 用戶端的 IP 位址為 192.168.1.10,兩台主機在同一子網192.168.1.0/24)。
首先在 NFS 伺服器端使用 setsebool 命令確保 nfs_export_all_rw 布爾變數已經開啟,使得 NFS 用戶端能夠以唯讀方式安裝 NFS 檔案系統。然後建立一個頂級目錄,作為共用資源,然後在目錄中建立一個檔案提供給用戶端訪問,命令如下:
#setsebool -P nfs_export_all_rw on #mkdir – p /share/nfs #cp /etc/profile /share/nfs/test # chmod - R 777 /share/nfs |
下面編輯 /etc/exports 檔案把共用資源加入。
/share/nfs 192.168.1.10(rw) |
確保防火牆修改設定正確。然後啟動 nfs 服務
# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ] |
運行 exports 命令確保共用資源公布,使用 showmount 命令查詢共用資源。
#exportfs -rv exporting 192.168.1.10:/share/nfs # showmount -e Export list for nfs-srv: /share/nfs 192.168.1.10 |
下面在 NFS 用戶端可以使用命令掛載 NFS 伺服器的共用資源了 :
# mount.nfs 192.168.1.1:/share/nfs /mnt # ls /mnt total 0 -rwxrwxrwx. 1 root root 0 2012-01-16 12:07 test |
原文:http://www.ibm.com/developerworks/cn/linux/l-cn-selinux-services1/index.html?ca=drs-