?SELinux
概述
SELinux(Secure Enhanced Linux)是美國國家安全局(NSA)和SCC開發的Linux的一個強制訪問控制的安全模塊。2000年以GNU GPL發布,Linux內核2.6版本后集成在內核中。它能夠限制權限,進程只能訪問那些在他的任務中所需要文件。
Selinux是根據最小權限模型去限制進程在對象
(如文件,目錄,端口,網絡接口等)上的訪問或執行其他的操作的權限,這些限制可以在之后根據需要進行修改。簡單來說,系統只給主體的基本功能所需要的權限。
舉例來說:如果系統上的Apache被發現存在一個漏洞,使得攻擊者可以訪問系統上的敏感文件(比如 /etc/passwd 來獲得系統已存在用戶) ,而修復該安全漏洞的 Apache 更新補丁尚未出現。此時 SELinux 可以起到安全效果,因為 /etc/passwd 文件不具有 Apache 的訪問標簽,所以 Apache 對于 /etc/passwd 的訪問會被 SELinux 阻止。因此Selinux能有效的防范0day類的攻擊。
Tips:0day漏洞,是已經被發現(有可能未被公開),而官方還沒有相關補丁的漏洞。
【注意】:SELinux是在標準Linux基礎上增加了類型強制(TE: Type Enforcement),這就意味著標準Linux和SELinux訪問控制都必須滿足才能能訪問一個對象,例如:如果我們對某個文件有SELinux寫入權限,但沒有該文件的w許可,那么也不能寫該文件
標準Linux | SELinux | |
---|---|---|
進程 | 真實有效的用戶和組ID | 安全上下文 |
文件 | 訪問列表、文件用戶和組ID | 安全上下文 |
訪問控制基礎 | 進程用戶/組ID和文件的訪問模式,此訪問模式基于文件的用戶/組ID | 在進程類型和文件類型之間允許的許可 |
了解SELinux
DAC、MAC
Linux 上傳統的訪問控制標準是自主訪問控制(DAC),如果一個用戶被授權允許訪問,意味著程序也被授權訪問,那么惡意程序也將有同樣的訪問權。 DAC最根本的弱點是主體容易受到多種多樣的惡意軟件的攻擊,使得惡意程序控制系統。
強制訪問控制(MAC)是基于策略規則決定控制的嚴格程度,策略被用來定義被限制的進程能夠使用哪些資源,默認情況下,沒有被明確允許的行為將被拒絕。
只有同時滿足了【標準Linux訪問控制】和【SELinux訪問控制】時,主體才能訪問對象
安全上下文
存放在Inode的擴展屬性域的安全元素控制
對象
的訪問所有文件和端口資源和進程都具備安全標簽即安全上下文(security context)
USER:ROLE:TYPE[LEVEL[:CATEGORY]]
USER:類似Linux系統中的UID,提供身份識別,用來記錄身份
? user_u :普通用戶登錄系統后的預設,在targeted policy中users不是很重要
? system_u :開機過程中系統進程的預設
? root :root 登錄后的預設
ROLE:對象的角色
? 文件、目錄和設備的role:通常是 object_r;
? 程序的role:通常是 system_r;
? 用戶的role:targeted policy為system_r
? ? 用戶role類似系統中的GID,不同角色具備不同的的權限
? ? 用戶可以具備多個role,但是同一時間內只能使用一個role
TYPE:給subject和object劃分為不同的組,給每個主體和系統中的客體定義一個類型;為進程運行提供最低的權限環境;
? type是SElinux security context 中最重要的信息,是 SELinux Type Enforcement的核心,預設值以 _t 結尾
? 當一個TYPE與執行中的進程
相關聯時,其type也稱為domain,Domain標簽能夠執行的操作由安全策略里定義。
? 當一個文件為多服務共用時,其type為public_content_t
LEVEL:定義層次和分類,只用于mls策略中
? LEVEL:代表安全等級,默認為s0目前已經定義的安全等級為s0-s15,等級越來越高
? CATEGORY:代表分類,如FBI Secret,NSA secret,目前已經定義的分類為c0-c1023實際上下文
存放在文件系統中
ls -Z #檢查文件、目錄的安全上下文
ps -Z #檢查進程的安全上下文,如 ps -eo user,label,pid,comm 或 ps axo …
id -Z #顯示了你的shell的安全上下文期望上下文(默認):存放在二進制的SELinux策略庫中
semanage fcontext -l文件的Security Contex規則
? rpm包安裝的:會根據rpm包內記錄來生成安全上下文;
? 手動創建的文件:會根據policy中規定的來設置安全上下文,如default_t;
? cp:會重新生成安全上下文;
? mv:安全上下文則不變;SELinux工作流程
當一個subject(進程)試圖訪問一個object(文件),Kernel中的策略執行服務器將檢查AVC (訪問矢量緩存Access Vector Cache), 在AVC中,subject和object的權限被緩存(cached),如果基于AVC中的數據不能做出決定,則請求安全服務器,安全服務器查找“應用+文件”的安全環境。然后根據查詢結果允許或拒絕訪問,拒絕日志在/var/log/messages
中
SElinux 的狀態
Enforcing(強制模式):越權行為會被記錄并且會被強制拒絕。
Permissive(寬容模式):越權行為只會被記錄,不會被拒絕。
Disabled(關閉):禁用Selinux,訪問不受控制;
工作模式
strict: centos5,每個進程都受到selinux的控制
targeted: 用來保護常見的網絡服務,僅有限進程受到selinux控制,只監控容易被入侵的進程,rhel4只保護13個服務,rhel5保護88個服務
minimum:centos7,修改過的targeted,只對選擇的網絡服務
mls:提供MLS(多級安全)機制的安全性
minimum和mls穩定性不足,未加以應用
配置SELinux
Selinux偽文件系統
/selinux目錄,這是一個偽文件系統,存放策略文件,類似于/proc 目錄,我們不需要操作它
Selinux的配置文件
/boot/grub/grub.conf
使用參數selinux=0禁用SELinux/etc/sysconfig/selinux = /etc/selinux/config
SELINUX={enforcing|permissive|disabled}
SELINUXTYPE={targeted|mls}
如果需要修改文件和目錄的 SELinux 類型屬性時可以使用三個命令:chcon、semanage fcontext 和 restorecon 命令 。說明:使用 chcon 對文件的類型進行重新標識,重啟系統時將不保留標識。對于文件類型的永久性改變,需要采用 semanage 命令。
查看當前SELinux信息
getenforce #查看Current mode
setenforce 0|1 #0: 設置為permissive,1: 設置為enforcing
sestatus -v #查看status、Current mode、file mode、關鍵進程Process context(Init,mingetty,sshd)、關鍵文件File contexts(passwd,shadow,login,bash,agetty)
chcon – change file SELinux security context
chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…
chcon [OPTION]… –reference=RFILE FILE…
-R:遞歸
CentOS系統自帶的chcon工具只能修改文件、目錄的安全標簽,不能修改端口進行修改
restorecon – restore file(s) default SELinux security contexts.
restorecon[-R] /path/file #根據現有的策略庫進行還原,通過chcon修改的type將被還原
semanage – SELinux Policy Management tool
yum -y install policycoreutils-python
管理文件的安全上下文(主要是Type)
【查看】semanage fcontext -l
? semanage fcontext -l | grep ‘/var/www’ 查看 /var/www 目錄的上下文
【增加】semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?’
【刪除】semanage fcontext -d -t Type ‘target’
? semanage fcontext -d -t httpd_sys_content_t ‘/website(/.*)?’管理端口的安全上下文
【查看】semanage port -l
? semanage port -l | grep -w ‘22’
? semanage port -l | grep ‘http’
【增加】semanage port -a -t port_label-p tcp|udp PORT
? semanage port -a -t http_port_t -p tcp 8520
【刪除】semanageport -d -t port_label-p tcp|udp PORT
? semanage port -d -t http_port_t -p tcp 8520
【修改】semanageport -m -t port_label-p tcp|udp PORT
? semanageport -m -t http_port_t-p tcp 8520 #把已經存在的端口給http管理boolean值
【查看】getsebool [-a] [boolean] #off還是on
? semanage boolean -l #(current , default),有一句簡單的描述
? semanage boolean -l | grep httpd_enable_homedirs
? semanage boollean -l -C #修改過的布爾值
? getsebool -a | grep httpd_enable_homedirs
? getsebool httpd_enable_homedirs【設置】setsebool[-P] BOOLEAN [on|off]
? setsebool httpd_enable_homedirs on #重啟丟失
? setsebool -P httpd_enable_homedirs on #永久生效,修改default日志管理
通過分析日志找到問題,并根據提示修改SELinux的設置
安全審計日志 /var/log/audit/audit.log #包含了SELinux的錯誤信息
系統整體日志 /var/log/messages
日志分析工具安裝
yum install setroublesshoot*(重啟生效)圖形化的分析工具
命令行分析工具
? grep ‘setroubleshoot’ /var/log/messages
? sealert-l UUID #復制messages中的run 后面的sealert -l xxxx到shell執行
? sealert-a /var/log/audit/audit.log #掃描分析審計日志中的SELinux信息,列出問題和解決辦法SELinux的常見警告類型和解決辦法
標簽錯誤
SELinux 的核心概念就是label
,無論是文件系統、目錄、文件、文件描述符、端口、消息接口還是網絡接口,一切對象都被貼上了標簽,主體只能訪問功能所需的對象。如 apache 進程被黑客入侵且取得了 uid=0 的管理員權限,但是SELinux策略限制了apache 所能訪問的對象。
SELinux 彈出標簽類型的警告可以使用圖形化的 sealert 工具查看,根據提示解決問題。也可以在系統日志中過濾 setroubleshoot 找到問題,根據執行 sealert -l UUID獲得解決辦法,或者sealert -a 掃描 audit.log 審計日志,也可以找到解決辦法。
布爾值錯誤
SELinux 策略中記錄了許多程序的默認運行范圍,并且只賦予了基本功能所需的權限。當我們開啟了程序的其他功能時,如打開 apache 訪問私人網站的功能,SELinux會限制 boolen 為 off 的越權行為。
Apache 能夠進入用戶的網站目錄,但是無法訪問文件內容,SELinux 會在系統日志中記錄相應的問題,并給出解決辦法。
SELinux 策略或引用程序配置有問題
如果你沒有修改過程序的配置卻 SELinux 的警告,原因可能是 SELinux 策略有問題,這時可以查看系統日志或審計日志,使用 sealert 工具進行分析。
萬般無奈之下可以 setenforce 0 停止 SELinux
也可以只對某個進程不啟用 SELinux ,執行 semanage permissive -a httpd_t 則對httpd進程不啟用 SELinux
程序被入侵
SELinux 并非入侵檢測系統,所以目前 SELinux 除錯工具無法主動的甄別出入侵企圖,不過當您發現警告內容包含有如下特征時,很有可能對應進程已被黑客攻破了:
嘗試關閉 SELinux (/etc/selinux) 或者設定某個 SELinux 布爾值;
嘗試載入內核模塊、寫入內核目錄或者引導器鏡像;
嘗試讀取 shadow_t 標簽的文件,如 /etc/passwd 那里通常包含了用戶信息;
嘗試覆蓋寫入日志文件;
嘗試連接不需要的隨機端口或者郵件端口;
SELinux下配置Apache服務
SELiniux給httpd定義的文件Type
httpd_sys_content_t 定義http主體可以訪問/var/www(/.*)? 目錄及其文件,創建的文件或復制到的 /var/www/html的文件都有httpd_sys_content_t 類型的標記
httpd_sys_script_exec_t 主要用于設置 /var/www/cgi-bin/ 目錄下的 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 類型
修改 DocumentRoot 到 /website
查看默認的上下文
semanage fcontext -l | grep '/var/www'
顯示/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0修改配置文件 /website 作為DocumentRoot
vi /etc/httpd/conf/httpd.conf
編輯DocumentRoot “/website”
【測試】:訪問顯示錯誤頁面給 /website 目錄增加httpd進程可訪問的安全標簽
chcon -Rv -t httpd_sys_content_t '/website'
#一次性生效,立即生效chcon -Rv --reference /var/www/html /website
#參考原來的設置,一次性生效,在這種情況下,執行restorecon
-R 命令將恢復為default_t 的標簽semanage fcontext -a -t httpd_sys_content_t '/website(/.*)?'
再restorecon -Rv /website/
#此時 http 的標簽已經是默認標簽了,無需重啟就生效了,訪問也能正常顯示小結:SELinux限制了httpd進程可以訪問的靜態頁面路徑必須包含 httpd_sys_content_t 標簽,否則修改了DocumentRoot設置將導致httpd不可訪問
讓 Apache 偵聽非標準端口
查看允許的端口
semanage prot -l | grep http
顯示http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000修改conf文件默認偵聽的端口
vim /etc/httpd/conf/httpd.conf
修改Listen 8520
【測試】httpd服務啟動失敗,錯誤提示沒有權限使用該端口,如果是圖形界面也會有相應的SELinux警報顯示SELinux策略添加httpd可訪問的端口
semanage port -a -t http_port_t -p tcp 8520
#增加httpd的端口
查看semanage prot -l | grep http
顯示http_port_t tcp 8520, 80, 81, 443, 488, 8008, 8009, 8443, 9000再次啟動httpd服務并測試能否訪問:
允許 Apache 訪問創建私人網站
若是希望用戶可以通過在 ~user/public_html/ 放置文件的方式創建自己的個人網站的話,那么需要在 Apache 策略中允許該操作執行
用戶自己創建 ~/public_html 目錄
alice] echo “alice’s test page” > ~/public_html/index.html修改conf文件,打開UserDir的訪問
vi /etc/httpd/conf/httpd.conf
注釋掉UserDir disabled
打開#UserDir public_html
【測試1】不給 apache 賬戶public_html 目錄的訪問權限,即不滿足 DAC的條件增加 ~alice 訪問控制權限,或 other 的 x 權限
setfacl -m u:apache:x ~alice
【測試2】給apache用戶 ~alice 目錄的訪問權限,根據umask值public_html是可以被訪問的。此時的結果表明httpd進程已經能夠進入 ~alice/public_html/ 目錄,但是訪問不了網頁文件,SELinux也有相應的報警,此時只滿足DAC的條件修改SELinux的httpd_enable_homedirs布爾值
查看當前開關getsebool -a | grep httpd_enable_h
打開開關setsebool httpd_enable_homedirs on
【測試3】此時同時滿足DAC和MAC條件,即apache用戶可以訪問 public_html 目錄且SELinux允許httpd訪問pbulic_html小結:httpd只有同時滿足【標準Linux訪問控制】【SELinux訪問控制】的條件才能訪問一個對象。
Apache 的其他SELinux布爾量
? 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 正在使用正向或反向代理。
? 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 掛載。
獲取幫助
[root@cent6]~>yum install selinux-policy-doc [root@cent6]~>makewhatis [root@cent7]~>yum install selinux-policy-devel [root@cent7]~>mandb [root@cent7]~>man -k _selinux httpd_php_selinux (8) - Security Enhanced Linux Policy for the httpd_ph... httpd_rotatelogs_selinux (8) - Security Enhanced Linux Policy for the h... httpd_selinux (8) - Security Enhanced Linux Policy for the httpd pro... httpd_suexec_selinux (8) - Security Enhanced Linux Policy for the httpd... httpd_sys_script_selinux (8) - Security Enhanced Linux Policy for the h... [root@cent7]~>man 8 httpd_selinux
以上是對 SELinux 功能和基本配置的介紹,對于 Linux 系統的網絡服務,如 Apache 、Smaba、NFS、vsftp、MySQL、Bind DNS 服務等都受到SELinux 策略的嚴格限制,SELinux 僅開放了最基本的運行需求,當這些服務進程需要訪問更多的對象時需要配置 SELinux 策略。至于連接外部網絡、運行腳本、訪問用戶目錄、共享文件等,必須經過一定的 SELinux 策略調整才能充分發揮網絡服務器的作用。
很多用戶一直覺得 SELinux 的安全級別設置十分麻煩,因此有人裝完系統就禁用 SELinux 但這是不安全的行為。因此系統管理員要權衡易用性和安全性的關系,在不同應用場景達到二者的平衡。
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/47463
寫的不錯,贊一個。