Linux桌面需要强制访问控制,RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...
RHCSA 認(rèn)證:SELinux 精要和控制文件系統(tǒng)的訪問
盡管作為第一級別的權(quán)限和訪問控制機制是必要的,但它們同樣有一些局限,而這些局限則可以由安全增強 Linux(Security Enhanced Linux,簡稱為 SELinux)來處理。
這些局限的一種情形是:某個用戶可能通過一個泛泛的 chmod 命令將文件或目錄暴露出現(xiàn)了安全違例,從而引起訪問權(quán)限的意外傳播。結(jié)果,由該用戶開啟的任意進(jìn)程可以對屬于該用戶的文件進(jìn)行任意的操作,最終一個惡意的或有其它缺陷的軟件可能會取得整個系統(tǒng)的 root 級別的訪問權(quán)限。
考慮到這些局限性,美國國家安全局(NSA) 率先設(shè)計出了 SELinux,一種強制的訪問控制方法,它根據(jù)最小權(quán)限模型去限制進(jìn)程在系統(tǒng)對象(如文件,目錄,網(wǎng)絡(luò)接口等)上的訪問或執(zhí)行其他的操作的能力,而這些限制可以在之后根據(jù)需要進(jìn)行修改。簡單來說,系統(tǒng)的每一個元素只給某個功能所需要的那些權(quán)限。
在 RHEL 7 中,SELinux 被并入了內(nèi)核中,且默認(rèn)情況下以強制模式(Enforcing)開啟。在這篇文章中,我們將簡要地介紹有關(guān) SELinux 及其相關(guān)操作的基本概念。
SELinux 的模式
SELinux 可以以三種不同的模式運行:
強制模式(Enforcing):SELinux 基于其策略規(guī)則來拒絕訪問,這些規(guī)則是用以控制安全引擎的一系列準(zhǔn)則;
寬容模式(Permissive):SELinux 不會拒絕訪問,但對于那些如果運行在強制模式下會被拒絕訪問的行為進(jìn)行記錄;
關(guān)閉(Disabled)?(不言自明,即 SELinux 沒有實際運行).
使用 getenforce 命令可以展示 SELinux 當(dāng)前所處的模式,而 setenforce 命令(后面跟上一個 1 或 0) 則被用來將當(dāng)前模式切換到強制模式(Enforcing)或?qū)捜菽J?Permissive),但只對當(dāng)前的會話有效。
為了使得在登出和重啟后上面的設(shè)置還能保持作用,你需要編輯 /etc/selinux/config 文件并將 SELINUX 變量的值設(shè)為 enforcing,permissive,disabled 中之一:
#getenforce
#setenforce0
#getenforce
#setenforce1
#getenforce
#cat/etc/selinux/config
設(shè)置 SELinux 模式
通常情況下,你應(yīng)該使用 setenforce 來在 SELinux 模式間進(jìn)行切換(從強制模式到寬容模式,或反之),以此來作為你排錯的第一步。假如 SELinux 當(dāng)前被設(shè)置為強制模式,而你遇到了某些問題,但當(dāng)你把 SELinux 切換為寬容模式后問題不再出現(xiàn)了,則你可以確信你遇到了一個 SELinux 權(quán)限方面的問題。
SELinux 上下文
一個 SELinux 上下文(Context)由一個訪問控制環(huán)境所組成,在這個環(huán)境中,決定的做出將基于 SELinux 的用戶,角色和類型(和可選的級別):
一個 SELinux 用戶是通過將一個常規(guī)的 Linux 用戶賬戶映射到一個 SELinux 用戶賬戶來實現(xiàn)的,反過來,在一個會話中,這個 SELinux 用戶賬戶在 SELinux 上下文中被進(jìn)程所使用,以便能夠明確定義它們所允許的角色和級別。
角色的概念是作為域和處于該域中的 SELinux 用戶之間的媒介,它定義了 SELinux 可以訪問到哪個進(jìn)程域和哪些文件類型。這將保護(hù)您的系統(tǒng)免受提權(quán)漏洞的攻擊。
類型則定義了一個 SELinux 文件類型或一個 SELinux 進(jìn)程域。在正常情況下,進(jìn)程將會被禁止訪問其他進(jìn)程正使用的文件,并禁止對其他進(jìn)程進(jìn)行訪問。這樣只有當(dāng)一個特定的 SELinux 策略規(guī)則允許它訪問時,才能夠進(jìn)行訪問。
下面就讓我們看看這些概念是如何在下面的例子中起作用的。
例 1:改變 sshd 守護(hù)進(jìn)程的默認(rèn)端口
在 RHCSA 系列(八): 加固 SSH,設(shè)定主機名及啟用網(wǎng)絡(luò)服務(wù) 中,我們解釋了更改 sshd 所監(jiān)聽的默認(rèn)端口是加固你的服務(wù)器免受外部攻擊的首要安全措施。下面,就讓我們編輯 /etc/ssh/sshd_config 文件并將端口設(shè)置為 9999:
Port9999
保存更改并重啟 sshd:
#systemctlrestartsshd
#systemctlstatussshd
重啟 SSH 服務(wù)
正如你看到的那樣, sshd 啟動失敗,但為什么會這樣呢?
快速檢查 /var/log/audit/audit.log 文件會發(fā)現(xiàn) sshd 已經(jīng)被拒絕在端口 9999 上開啟(SELinux 的日志信息包含單詞 "AVC",所以這類信息可以被輕易地與其他信息相區(qū)分),因為這個端口是 JBoss 管理服務(wù)的保留端口:
#cat/var/log/audit/audit.log|grepAVC|tail-1
查看 SSH 日志
在這種情況下,你可以像先前解釋的那樣禁用 SELinux(但請不要這樣做!),并嘗試重啟 sshd,且這種方法能夠起效。但是, semanage 應(yīng)用可以告訴我們在哪些端口上可以開啟 sshd 而不會出現(xiàn)任何問題。
運行:
#semanage port-l|grepssh
便可以得到一個 SELinux 允許 sshd 在哪些端口上監(jiān)聽的列表:
Semanage 工具
所以讓我們在 /etc/ssh/sshd_config 中將端口更改為 9998 端口,增加這個端口到 sshportt 的上下文,然后重啟 sshd 服務(wù):
#semanage port-a-tssh_port_t-p tcp9998
#systemctlrestartsshd
#systemctlis-activesshd
semanage 添加端口
如你所見,這次 sshd 服務(wù)被成功地開啟了。這個例子告訴我們一個事實:SELinux 用它自己的端口類型的內(nèi)部定義來控制 TCP 端口號。
例 2:允許 httpd 訪問 sendmail
這是一個 SELinux 管理一個進(jìn)程來訪問另一個進(jìn)程的例子。假如在你的 RHEL 7 服務(wù)器上,你要為 Apache 配置 mod_security 和 mod_evasive,你需要允許 httpd 訪問 sendmail,以便在遭受到 (D)DoS 攻擊時能夠用郵件來提醒你。在下面的命令中,如果你不想使得更改在重啟后仍然生效,請去掉 -P 選項。
#semanage boolean-1|grephttpd_can_sendmail
#setsebool-P httpd_can_sendmail1
#semanage boolean-1|grephttpd_can_sendmail
允許 Apache 發(fā)送郵件
從上面的例子中,你可以知道 SELinux 布爾設(shè)定(或者只是布爾值)分別對應(yīng)于 true 或 false,被嵌入到了 SELinux 策略中。你可以使用 semanage boolean -l 來列出所有的布爾值,也可以管道至 grep 命令以便篩選輸出的結(jié)果。
例 3:在一個特定目錄而非默認(rèn)目錄下提供一個靜態(tài)站點服務(wù)
假設(shè)你正使用一個不同于默認(rèn)目錄(/var/www/html)的目錄來提供一個靜態(tài)站點服務(wù),例如 /websites 目錄(這種情形會出現(xiàn)在當(dāng)你把你的網(wǎng)絡(luò)文件存儲在一個共享網(wǎng)絡(luò)設(shè)備上,并需要將它掛載在 /websites 目錄時)。
a). 在 /websites 下創(chuàng)建一個 index.html 文件并包含如下的內(nèi)容:
SELinux test
假如你執(zhí)行
#ls-lZ/websites/index.html
你將會看到這個 index.html 已經(jīng)被標(biāo)記上了 default_t SELinux 類型,而 Apache 不能訪問這類文件:
檢查 SELinux 文件的權(quán)限
b). 將 /etc/httpd/conf/httpd.conf 中的 DocumentRoot 改為 /websites,并不要忘了 更新相應(yīng)的 Directory 塊。然后重啟 Apache。
c). 瀏覽 http://,則你應(yīng)該會得到一個 503 Forbidden 的 HTTP 響應(yīng)。
d). 接下來,遞歸地改變 /websites 的標(biāo)志,將它的標(biāo)志變?yōu)?httpd_sys_content_t 類型,以便賦予 Apache 對這些目錄和其內(nèi)容的只讀訪問權(quán)限:
#semanage fcontext-a-thttpd_sys_content_t"/websites(/.*)?"
e). 最后,應(yīng)用在 d) 中創(chuàng)建的 SELinux 策略:
#restorecon-R-v/websites
現(xiàn)在重啟 Apache 并再次瀏覽到 http://,則你可以看到被正確展現(xiàn)出來的 html 文件:
確認(rèn) Apache 頁面
總結(jié)
在本文中,我們詳細(xì)地介紹了 SELinux 的基礎(chǔ)知識。請注意,由于這個主題的廣泛性,在單篇文章中做出一個完全詳盡的解釋是不可能的,但我們相信,在這個指南中列出的基本原則將會對你進(jìn)一步了解更高級的話題有所幫助,假如你想了解的話。
假如你有任何的問題或評論,請不要猶豫,讓我們知曉吧。
本文由 LCTT 原創(chuàng)翻譯,Linux中國 榮譽推出
總結(jié)
以上是生活随笔為你收集整理的Linux桌面需要强制访问控制,RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: continue break
- 下一篇: 天涯明月刀如何修改登录服务器,天涯明月刀