玩轉SELINUX
SELinux 全稱 Security Enhanced Linux (安全強化 Linux),由美國國家安全部(National Security Agency)領導開發的GPL項目,它擁有一個靈活而強制性的訪問控制結構,旨在提高Linux系統的安全性,提供強健的安全保證,可防禦未知攻擊,是 MAC (Mandatory Access Control,強制訪問控制系統)的一個實現,目的在於明確的指明某個進程可以訪問哪些資源(文件、網路埠等)。
強制訪問控制系統的用途在於增強系統抵禦 0-Day 攻擊(利用尚未公開的漏洞實現的攻擊行為)的能力,所以它不是網路防火牆或 ACL 的替代品,在用途上也不重複。
而SELinux則基於強制存取控制方法,即MAC,透過強制性的安全策略,應用程序或用戶必須同時符合DAC及對應SELinux的MAC才能進行正常操作,否則都將遭到拒絕或失敗,而這些問題將不會影響其他正常運作的程序和應用,並保持它們的安全系統結構。
DAC 自主訪問控制: 用戶自主決定屬於自己的文件許可權
MAC 強制訪問控制: 內核定義了所有用戶包括root 的許可權由selinux決定,由內核實現
進程是用戶獲取資源的代理 ,一個進程在運行過程中對哪些文件具有訪問許可權 是由進程的發起者的許可權決定的.
例如: 如果你的web伺服器是以apache這個用戶的身份運行的 他對系統中所有o上置r的文件都具有讀許可權 如果某個人劫持了web伺服器 那麼他就獲得了apache的所有許可權 他可以利用緩衝區溢出漏洞、set uid等多種方式獲得許可權提升 進而劫持整個系統 此時 傳統的DAC模式就無法防範這種攻擊
SELinux系統比起通常的Linux系統來,安全性能要高的多,它通過對於用戶,進程許可權的最小化,即使受到攻擊,進程或者用戶許可權被奪去,也不會對整個系統造成重大影響。
在一個進程需要運行以完成某種任務時 selinux為此進程規定了一個運行環境,此環境限制了此進程可以進行的操作和可以訪問的文件,此時這個進程可以活動的範圍就由selinux限定 如果是傳統的DAC 此進程的行為許可權則由運行它的用戶的許可權決定,此時 它的活動範圍是整個系統
Selinux是一組可確定哪個進程能訪問哪些文件、目錄、埠等的安全規則。每個文件、進程、目錄和埠都具有專門的安全標籤,稱為selinux上下文,上下文只是一個名稱,selinux策略使用它來確定某個進程是否能訪問文件、目錄或埠。
selinux將進程分類, 將資源分類, 定義了那個進程在哪個範圍內運行 ,只能訪問哪些資源 ,此時不管它對其它的資源有讀寫許可權此時只要selinux不允許 它就不能訪問。
Selinux控制規則及相關概念
DAC(自主存取控制)依據程序運行時的身份決定許可權,是大部分操作系統的許可權存取控制方式。也就是依據文件的own,group,other/r,w,x許可權進行限制。Root有最高許可權無法限制。r,w,x許可權劃分太粗糙,無法針對不同的進程實現限制。
MAC(強制存取控制)依據條件決定是否有存取許可權。可以規範個別細緻的項目進行存取控制,提供完整的徹底化規範限制。可以對文件,目錄,網路,套接字等進行規範,所有動作必須先得到DAC授權,然後得到MAC授權才可以存取。
TE(類型強制)所有操作系統訪問控制都是以關聯的客體和主體的某種類型的訪問控制屬性為基礎的。在SELinux中,訪問控制屬性叫做安全上下文。所有客體(文件、進程間通訊通道、套接字、網路主機等)和主體(進程)都有與其關聯的安全上下文,一個安全上下文由三部分組成:用戶(u)、角色(r)和類型(t)標識符。
以上簡單了解即可,下面的是要重點掌握的
Selinux狀態查看與配置
Selinux的配置文件位置:/etc/selinux/config,它還有個鏈接在/etc/sysconfig/selinux
使用config文件來配置selinux(通過配置文件修改selinux的狀態屬於永久修改,要重啟系統才生效)
配置文件內容如下
SELINUX=enforcing-----#此項定義selinux狀態
#enforcing—是強制模式系統受selinux保護,就是你違反了策略,你就無法繼續
#permissive—是提示模式系統不會受到selinux保護,只是收到警告信息。permissive就是Selinux有效,但是即使你違反了策略的話它讓你繼續操作,但是把你的違反的內容記錄下來(警告信息)
#disabled-----#禁用selinux
# SELINUXTYPE= type of policy in use. Possible values are:
#
#targeted - Only targeted network daemons are protected.
#
#strict - Full SELinux protection.
SELINUXTYPE=targeted
#此項定義selinux使用哪個策略模塊保護系統
#targeted:紅帽開發的策略,只對apache ,sendmail, bind,postgresql,nfs,cifs等網路服務保護,不屬於那些domain的就都讓他們在unconfined_t里,可導入性高,可用性好但是不能對整體進行保護。
# strict:是NAS開發的,能對整個系統進行保護,但是設定複雜。
#mls:是一個較新的安全策略
以上策略配置都放置在/etc/selinux目錄中,目錄和策略名稱相同
使用selinux相關命令查看和修改狀態:(屬於臨時性的)
1、sestatus 查詢selinux工作狀態
2、selinuxenabled檢查selinux是否開啟,配合echo $?.傳回值是0為開啟,1為關閉.
3、getenforce查看selinux的狀態
4、setenforce設定selinux運行狀態,1開啟(Enforcing),0關閉(Permissive)
查看和設置selinux的boolean值
selinux策略中定義許多boolean值,用戶自定義要讓selinux開啟保護某些程序,或者是關閉對某些程序、程序中的某個項目的保護.目錄位置/selinux/boolean/下相關文件.
查看boolean值:
也可用semanage命令
設置boolean值,-P為設置永久生效
實驗1
啟動vsftp伺服器後以本地帳戶登陸伺服器,你將會看到本地帳號不能登錄,使用以下命令允許本地帳戶進入自家目錄(off是禁止本地帳戶切換到家目錄)
再次使用本地賬戶登錄,你將會看到登錄成功。
實驗2:與nfs服務有關的boolean值的設置
實驗3:與samba服務有關的boolean值的設置
實驗4:apache實現個人主頁:
Apache以RPM包安裝實現個人主頁,修改httpd.conf文件,如下圖所示,以系統用戶lining為例:
在/home/lining/創建public_html目錄並在其中創建一個測試頁
設置其他用戶對lining用戶的主目錄的x許可權:chmod o+x /home/lining
在瀏覽器中輸入http://web伺服器的IP/~lining會發訪問失敗
如何解決呢?
方法:執行setsebool命令修改如下與httpd有關的boolean值
再訪問就會成功
查看安全上下文相關命令
許多處理文件的命令具有一個用於顯示或設置selinux上下文的選項(通常是-Z),例如:ps、ls、cp、和mkdir都使用-Z選項顯示或設置selinux上下文。
查看用戶安全上下文,下面是普通用戶和超級用戶的安全上下文,從第一個欄位依次為用戶標識,角色,域類型.
# id -Z
查看文件安全上下文
#ls -Z 文件名或目錄
查看進程的安全上下文
#ps axZ 查看進程的selinux標籤(以下就是vsftpd進程和httpd進程的安全上下文:vsftpd進程的安全上下文域類型為ftpd_t;httpd進程的安全上下文域型為httpd_t)
安全上下文以用戶:角色:類型(域)的形式出現.(這裡的用戶指的是selinu用戶)
以下是複製和移動文件時安全上下文的變化:
更改安全上下文
chcon 意思是change context
-t type 類型
-R recursive 遞歸(特別適用於改變某個目錄下所有文件的context)
-u user
-r role
實驗1:啟動ftp伺服器,在伺服器上打開匿名用戶上傳許可權,並給目錄可寫許可權,以匿名帳戶登陸伺服器看匿名帳戶能否上傳文件?selinux策略默認是不允許匿名用戶上傳文件的。
以匿名賬戶訪問FTP伺服器,上傳文件,會顯示失敗,如下圖所示:
現在使用以下命令允許匿名帳戶可以上傳文件
再以匿名賬戶訪問FTP伺服器,上傳文件,成功。
實驗2:讓 Apache 可以訪問位於非默認目錄下的網站文件
apache以RPM包安裝,在網頁文檔根目錄/var/www/html下創建一個index.html文件:
用 semanage fcontext -l | grep "/var/www" 獲知默認 /var/www 目錄的 SELinux 上下文:顯示如下
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
也可以用ls –Z /var/www/html查看index.html文件或/var/www目錄的安全上下文:
在瀏覽器中訪問http://web伺服器的ip,發現可以成功訪問index.html頁面
從中可以看到 Apache 只能訪問包含 httpd_sys_content_t 標籤的文件
在/var目錄中創建一個目錄如:web; mkdir /var/web
將index.html文件拷貝到新建的目錄中,並用ls -Z查看安全上下文
修改httpd.conf文件,添加/var/web目錄的虛擬目錄,如下圖:
重啟httpd服務,在瀏覽器中訪問,http://web伺服器的IP/cw 失敗
解決方法:
用chcon命令修改/var/web/index.html文件的安全上下文,如下圖:
再訪虛擬目錄發現成功
實驗3:讓 Apache 偵聽非標準埠
默認情況下 Apache 只偵聽 80 和 443 兩個埠,若是直接指定其偵聽 888 埠的話,會在 service httpd restart 的時候報錯:
解決方法:
semanage port -a -t http_port_t -p tcp 888
要執行semanage須安裝下列包。
policycoreutils-python: 提供 semanage, audit2allow, audit2why and chcat,
policycoreutils: 提供restorecon, secon, setfiles, semodule,load_policy, and setsebool
這時重啟httpd服務就正常了。
semanage命令是selinuxpolicy維護工具,
semanage fcontext -l | grep "/var/www" 獲知默認 /var/www 目錄的 SELinux 上下文:
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
假設希望 Apache 使用 /srv/www 作為網站文件目錄,那麼就需要給這個目錄下的文件增加 httpd_sys_content_t 標籤,分兩步實現:
首先為 /srv/www 這個目錄下的文件添加默認標籤類型:
semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"
然後用新的標籤類型標註已有文件:
restorecon -Rv /srv/www 之後 Apache 就可以使用該目錄下的文件構建網站了。
其中 restorecon 在 SELinux 管理中很常見的命令,起到恢復文件默認標籤的作用。比如當從用戶主目錄下將某個文件複製到 Apache 網站目錄下時,Apache 默認是無法訪問,因為用戶主目錄的下的文件標籤是 user_home_t。此時就需要 restorecon 將其恢復為可被 Apache 訪問的httpd_sys_content_t 類型:
恢復文件安全上下文的默認值:restorecon [-r -F]
恢復文件安全上下文的默認值,-r遞歸 –F強制.默認值在/etc/selinux/targeted/contexts/files/file_contexts文件中定義.
Selinux相關的日誌:/var/log/audit/audit.log和/var/log/message文件,必須安裝setroubleshoot-server軟體包,才能將selinux消息發送至/var/log/messages
Selinux綜合實戰與排錯
一、Selinux 下匿名FTP的使用---方法1
確認已經啟用了Selinux、啟動FTP:
在匿名訪問目錄下創建2個文件進行測試,一個是在該目錄下手動創建,這樣
該文件會自動繼承/var/ftp/pub下的目錄上下文的值,一個用mv命令從root目錄下移
動過來,這樣的文件會保留root目錄下的安全上下文,如下
使用匿名登錄測試:
發現這裡看不到root.txt文件
已知系統啟動了Selinux,先查看系統日誌,有兩個工具可以收集到Selinux產生的
日誌,一個是setroubleshoot,對應的軟體包為setroubleshoot-server-2.0.5-5.el5
一個是audit,對應的軟體包名稱是audit-1.7.13-2.el5,先使用audit工具,使用方法
如下:
系統中提供了audit相關的命令,常用的有audit2why和audit2allow,audit產生的日誌
放在/var/log/audit, 由於此文件記錄的信息很多不宜直接查看,可以藉助audit2why
命令,首先啟動audit
在客戶端登錄FTP伺服器時會出發audit deamon產生日誌:
AVC 是 access vector cache 的縮寫, 目的是記錄所有與 SELinux 有關的存取統計資料。
根據日誌中的建議,使用audit2allow命令查看給出的建議如下:
使用sesearch命令確認上述策略是否存在,結果如下:
通過search策略集確實存在上述策略,但日誌裡面還有一個建議如下:
注意,sesearch命令對應的軟體包setools
驗證布爾值中有關FTP的定義
發現ftp_home_dir --> off,文件root.txt 的類型剛好是root:object_r:user_home_t:s0
所以更改此bool值就可以
(-P是把該修改寫到文件,下次啟動仍然有效)
客戶端登錄測試,發現root.txt文件就可以訪問了。
二、Selinux 下匿名FTP的使用---方法2
通過進程知道FTP服務啟動後的主體名稱是ftpd_t, 使用下面的方法可以知道這個
主體可以訪問什麼樣類型的客體
既然/var/ftp/pub/test.txt可以訪問,那麼策略里肯定是allow的,且/var/ftp/pub/test.txt
的安全上下文如下:
-rwxr-xr-x root root root:object_r:public_content_t:s0 /var/ftp/pub/test.txt
通過下面的命令驗證一下策略集中是否有該定義
那麼根據這個思路可以更改/var/ftp/pub/root.txt的安全上下文即可,可用chcon命令
先對剛才的改變進行還原:
另外在系統啟用了SElinux偽系統後的文件都有默認的安全上下文,既然在
/var/ftp/fub下創建的文件可以自動繼承,那麼下面其他不同安全上下文的文件
如果也繼承了,那麼就達到了目的,使用semanage 可以查看目錄或文件的默認
定義的安全上下文
在系統中默認目錄和文件默認的安全上下文的定義文件放在:
使用restorecon恢復系統定義的安全上下文
(其中R是遞歸,v是把操作顯示在屏幕上)
三、Selinux 基於用戶的FTP
用創建的帳號登錄FTP伺服器,如下:
使用audit2way和audit2allow分析selinux日誌
解決方法:
再測試訪問就OK了
編輯/Alex 美編/Mary


※徹底解放你,Linux 無人值守安裝
※Linux的兩種共享服務搭建
TAG:網路消防員 |