SELinux介紹
DAC:自由通路控制
MAC: 強制通路控制
DAC環境下程序是無束縛的
MAC環境下政策的規則決定控制的嚴格程度
MAC環境下程序可以被限制
政策被用來定義被限制的程序能夠使用哪些資源(檔案和端口)
預設情況下,沒有被明确允許的行為将被拒絕

- Selinux政策
對象(object):所有可以讀取的對象,包括檔案、目錄和程序、端口等
主體:程序稱為主體(subject)
Selinux中所有的檔案都賦予一個type的檔案類型标簽,對于所有的程序也賦予格子衣domain的标簽。domain标簽能夠執行的操作由安全政策裡定義
當一個subject試圖通路一個object,Kernel中的政策執行伺服器将檢查AVC(通路矢量緩存Access Vector Cache),在AVC中,subject和object的權限被緩存,查找“應用+檔案”的安全環境。然後根據查詢結果允許或拒絕通路
安全政策:定義主體讀取對象的規則類資料庫,規則中記錄了哪個類型的主體使用哪個方法讀取哪一個對象是允許還是拒絕,并且定義了哪種行為是允許或拒絕
- Selinux安全上下文
傳統Linux,一切接檔案,由使用者,組,權限控制通路
在Selinux中,一切皆對象(object),由存放在inode的擴充屬性域的安全元素所控制其通路
所有檔案和端口資源和程序都具備安全标簽:安全上下文(security context)
安全上下文有五個元素組成:
user:role:type:sensitivity:category
user_u:object_r:tmp_t:s0:c0
實際上下文:存放在檔案系統中,ls -Z;ps -Z可以檢視詳細資訊
期望(預設)上下文:存放在二進制的SElinux政策庫(映射目錄和期望安全上下文)
semanage fcontext -l
- 五個安全元素
User:訓示登入系統的使用者類型,如root,user_u,system_u,多數本地程序都屬于自由(unconfined)程序
Role:定義檔案,程序和使用者的用途:檔案:object_r,程序和使用者:system_r
Type:指定資料類型,規則中定義何種程序類型通路何種檔案Target政策基于type實作,多服務公用:public_conten_t
Sensitivity:限制通路的需要,由組織定義的分層安全級别,如unclassified,secret,top,secret,一個對象有且隻要一個sensitivity,分0-15級,s0最低,Target政策預設使用s0
Category:對于特定組織劃分不分層的分類,如FBI Secret,NSA secret,一個對象可以有多個catagroy,c0-c1-23共1024個分類,Target政策不适用category
- Selinux配置檔案
Selinux配置檔案(configuration)或政策檔案(policy)位于/etc/目錄下
/etc/sysconfig/selinux是一個符号連結,真正的配置檔案為:/etc/selinux/config
- Selinux常用工具
chcon指令修改檔案安全上下文
chcon [options] CONTEXT files
說明:
CONTEXT為要設定的安全上下文
files對象(檔案)
options
-f: 強迫修改
-R:遞歸修改對象的安全上下文
-r ROLE:修改安全上下文角色的配置
-t TYPE:修改安全上下文類型的配置
-u USER:修改安全上下文使用者的配置
在我們的實際生産環境中跟檔案權限最相關的是位于第三字段的資料類型,下面我們就用具體的示例來講解一下修改檔案的type類型導緻檔案權限的變更
我們通過更改/var/log/messages檔案的安全上下文類型來做一下示範
首先檢視messages檔案的原有标簽
ls -Z /var/log/messages
現将message更改成default_t類型
因為我們更改了messages檔案的安全上下文所有導緻此檔案與/var/log目錄上下文标簽不比對是以所有日志都将無法寫入此檔案
更改回原來的标簽類型
chcon -t var_log_t /var/log/messages
還可以使用第二種方法直接恢複
首先查詢selinux政策的資料庫種messages對應的标簽類型,然後使用restorecon後面跟/var/log/message直接恢複即可
semanage fcontext -l | grep /var/log/message
注意:此指令要求Selinux的政策資料庫中必須曾經記錄過此檔案的标簽
假設此時我們需要自己建立一個網頁檔案,那麼該怎樣設定它的檔案标簽呢?
首先建立一個目錄/data
在目錄中任意建立幾個檔案a.txt,b.txt
我們使用ls -Z /data檢視會發現新建立的檔案的标簽預設為default_t
這裡我們可以知道自己手動常見的檔案因為selinux安全測錄==政策資料庫中沒有記載,是以一律為defaults_t标簽類型
檢視一下在/httpd服務的主目錄下的檔案标簽類型為httpd_sys_content_t,此類型标簽代表了使用者可以從主目錄進入通路的标簽類型
防火牆政策放行httpd服務之後用浏覽器通路
浏覽器可以正常通路登入
那麼如果我們自己從新在/data目錄下定義一個網頁會怎樣?
首先修改httpd的配置檔案
在/data目錄下建立一個名為test2.html的網頁檔案
并添加内容test2 page!!!
将DocumentRoot主目錄定義到/data下,并通過浏覽器重新通路
此時我們檢視一下手動建立的test2.html檔案它的标簽為default_t類型
此類型的标簽導緻我們通路失敗
然後我們修改test2.html的檔案類型标簽,之後重新開機服務并重新通路
chcon -t httpd_sys_content_t test2.html
備注:我們在為自己建立的檔案設定标簽時,首先的知道此類型的檔案需要打上哪種标簽,可以到selinux的安全政策庫中查詢一下。
當然我們如果每次都手動設定每個檔案會比較麻煩,是以我們可以直接将/data父目錄設定成httpd類型的标簽,并将此目錄加到selinux的安全政策庫中
使用如下指令:
這樣以後所有在/data目錄下建立的檔案都會自動打上http_sys_content_t标簽類型
接下來說一下端口的定義:
- Selinux端口标簽
檢視端口标簽
semanage port -l
添加端口
semanage port -a -t port_label -p tcp|upd PORT
semanage port -a -t http_port_t -p tcp 8998
删除端口
semanage port -d -t port_lable -p tcp|udp PORT
semanage port -d -t http_port_t -p tcp 8998
修改現有端口為新标簽
semanage port -m -t port_label -p tcp|upd PORT
semanage port -m -t http_port_t -p tcp 8998
我們檢視一下系統中httpd服務支援的端口
使用semanage port -a -t http_port_t -p tcp 8998
可以看到httpd服務支援的幾個端口
然後我們手動将8998端口定義到httpd服務支援的端口中,并修改httpd服務的配置檔案讓它監聽在8998端口上,重新開機服務之後,使用浏覽器通路網站
可以看到網站監聽在新的端口上,并且能夠正常通路。
最後我們在來說一下Selinux的布爾值
SELinux布爾值
布爾值規則
getsebool
setsebool
檢視bool指令
getsebool [-a] [boolean]
semanage boolean -l
semanage boolean -l -C :檢視修改過的布爾值
設定bool值指令
setsebool [-P] boolean value(on ,off)
setsebool [-P] Boolean value(0,1)
例如檢視一下ftp服務目前所有生效的布爾型值
如果希望ftp支援匿名上傳可以将第一項ftpd_anon_write -->off改為on
setsebool ftpd_anon_write=1
備注:此指令更改的隻是記憶體中的資料,隻起到臨時生效的作用
想讓更改永久生效則使用 -P 選項