selinux 安全機制

長久以來,每當遇到授權問題或者新安裝的主機,我的第一反應是通setenforce 0命令禁用SELinux,來減少產生的權限問題,但是這並不是一個良好的習慣。這篇文章嘗試對SELinux的基本概念和用法進行簡單介紹,並且提供一些更深入的資料。


Linux下默認的接入控制是DAC,其特點是資源的擁有者可以對他進行任何操(讀、寫、執行)。當一個進程準備操作資源時,Linux內核會比較進程和資源的UID和GID,如果權限允許,就可以進行相應的操作。此種方式往往會帶來一些問題,如果一個進程是以root的身份運行,也就意味著他能夠對系統的任何資源進行操作,而且不被限制。 假如我們的軟件存在漏洞呢?這個往往是一個災難性的問題。因此,就引出了另外的一種安全接入控制機制MAC,Linux下的一種現實是SELinux,也就是我們將要討論的內容。


SELinux 屬於MAC的具體實現,增強了Linux系統的安全性。MAC機制的特點在於,資源的擁有者,並不能決定誰可以接入到資源。具體決定是否可以接入到資源,是基於安全策略。而安全策略則是有一系列的接入規則組成,並僅有特定權限的用戶有權限操作安全策略。


一個簡單的例子,則是一個程序如果要寫入某個目錄下的文件,在寫入之前,一個特定的系統代碼,將會依據進程的Context和資源的Context查詢安全策略,並且根據安全策略決定是否允許寫入文件


SELinux的軟件設計架構是參照Flask,Flask是一種靈活的操作系統安全架構,並且在Fluke research operating system中得到了實現。Flask的主要特點是把安全策略執行代碼和安全策略決策代碼,劃分成了兩個組件。安全策略決策代碼在Flask架構中稱作Security Server。除了這兩個組件以外,另外一個組VectorCache(AVC), 主要提供策略決策結果的緩存,以此提高Security Server的性能。其具體執行流程為,安全策略執行代碼通過AVC查詢Security Server的安全策略決策結果,並將其緩存以備下次使用。


前面兩部分介紹了MAC機制和Flask架構,最終SELinux的實現是依賴於Linux提供的Linux Security Module框架簡稱為LSM。其實LSM的名字並不是特別準確,因為他並不是Linux模塊,而是一些列的hook,同樣也不提供任何的安全機制。LSM的的重要目標是提供對linux接入控制模塊的支持。


LSM 在內核數據結構中增加了安全字段,並且在重要的內核代碼(系統調用)中增加了hook。可以在hook中註冊回調函數對安全字段進行管理,以及執行接入控制。


SELinux,Security-Enhanced Linux:是由美國NSA國家安全局提供的一套基於內核的增強 的強制安全保護機制,針對用戶、進程、文檔標記安全屬性並實現保護性限制。

SELinux安全體系直接集成在Linux內核中,包括三種運行模式:

disabled:徹底禁用,內核在啟動時不加載SELinux安全體系

enforcing:強制啟用,內核加載SELinux安全體系,並強制執行保護策略

permissive:寬鬆模式,內核加載SELinux安全體系,只記錄不執行


執行getenforce可以查看當前所處的模式。


在disabled模式與enforcing、permissive模式之間切換時,需要重新啟動Linux系統;而在 enforcing模式與permissive模式之間切換時,並不需要重啟,可以直接執行

setenforce 1|0 操 作 ######1 強制 0 寬鬆

為selinux在運行模式建立固定配置----》修改配置文件/etc/selinux/config

SELINUX=disabled #寬鬆模式

例子: 現在在server1部署一個httpd服務 ,httpd要讀取頁面/var/www/html/index.html

我們首先關閉Selinux ,答案是可以訪問

[root@server1 ~]# systemctl start httpd

[root@server1 ~]# echo redhat >> index.html

[root@server1 ~]# mv index.html /var/www/html/

mv: overwrite '/var/www/html/index.html'? y

[root@server1 ~]# curl http://localhost

redhat

[root@server1 ~]#


開啟:selinux

[root@server1 ~]# setenforce 1


[root@server1 ~]# curl http://localhost -I

HTTP/1.1 403 Forbidden 權限拒絕

Date: Sat, 31 Aug 2019 06:53:23 GMT

Server: Apache/2.4.37 (Red Hat Enterprise Linux)

Last-Modified: Wed, 06 Feb 2019 14:46:32 GMT

ETag: "f91-5813acaad6200"

Accept-Ranges: bytes

Content-Length: 3985

Content-Type: text/html; charset=UTF-8



分享到:


相關文章: