SELinux(Security Enhanced Linux)
系統資源都是通過程序來讀取更改的,為了保證系統資源的安全,傳統的Linux使用使用者、檔案權限的概念來限制資源的通路,通過對比程序的發起使用者和檔案權限以此來保證系統資源的安全,這是一種自由通路控制方式(DAC);但是随着系統資源安全性要求提高,出現了在Linux下的一種安全強化機制(SELinux),該機制為程序和檔案加入了除權限之外更多的限制來增強通路條件,這種方式為強制通路控制(MAC)。這兩種方式最直覺的對比就是,采用傳統DAC,root可以通路任何檔案,而在MAC下,就算是root,也隻能通路設定允許的檔案。
目錄
- SELinux的工作原理
- 工作模式和工作類型
- 安全上下文
- SELinux日志管理
一、SELinux的工作原理
先說下SELinux下的幾個基本的概念
主體 # SELinux管理的主體為程序
目标 # SELinux通過管理程序,來限制程序通路的目标,指檔案
工作模式 # 決定SELinux機制的啟動與否
enforcing ===>強制模式,SELinux已經啟動
permissive===>寬容模式,SELinux已經啟動,但不會禁止,隻是會提出警告資訊
disabled ===>關閉模式,關閉SELinux
工作類型(SELinux type) # 表示SELinux具體的安全性政策
strict ===>每個程序都受限制(僅在centos5)
targeted===>預設類型為targeted,主要限制網絡服務
minimum ===>簡化版的targetd,限制部分網絡服務(centos7)
mls ===>多級安全限制,較為嚴格
安全上下文(security context)
這個是我們主要修改的地方,程序必須和檔案的安全上下文對應(不是必須一樣)才能對其進行通路。
ls -Z 檔案名 # 檢視檔案的安全上下文
ps -eZ # 檢視程序的安全上下文
sestatus # 檢視SELinux的具體的工作狀态
工作原理如下圖:
二、工作模式和工作類型
2.1 工作模式
getenforce可以檢視目前SELinux的工作模式;setenforce可以修改SELinux的工作模式,不過僅能在permissive和enforcing之間切換。
[root@CentOS6 ~]# setenforce 0|1 分别代表permissive、enforcing
使用指令修改工作模式隻在目前有效,想要開機生效,而且如果想要在disabled和其他兩種模式之間切換,隻有修改配置檔案參數然後重新開機,該配置檔案是/etc/selinux/config,另外也可以通過/etc/sysconfig/selinux檔案修改,其實該檔案是/etc/selinux/config的軟連結檔案
notice:SELinux從disabled切換到其他模式的時候,系統的重新開機會花費很長的時間,因為需要為每個受管制的程序和檔案寫入安全上下文,我的小夥伴以為是配置過程中出錯然後直接恢複快照了。
2.2 工作類型
SELinux下存在不同的規則,SELinux根據不同的工作類型對這些規則打開或關閉(on|off<布爾值1|0>),然後通過規則的開啟與關閉具體地限制不同程序對檔案的讀取。
getsebool -a 或者 sestatus -b # 檢視目前工作類型下各個規則的開啟與否
setsebool -P 規則名稱 [0|1] # 修改目前工作類型下指定規則的開啟關閉,-P表示同時修改檔案使永久生效
三、安全上下文
3.1 security context介紹
安全上下文存在于程序與檔案中,context随程序一起存入記憶體中,檔案的context存放在其對應的inode中,是以程序在通路檔案時,要先讀取inode,再判斷是否能夠通路該檔案。
ls -Z # 顯示檔案的安全上下文
ps -eZ # 顯示所有程序的安全上下文
context可以有5個字段,以:為分割符,分别代表的含義如下
user | role | type | sensitivity | category |
身份識别 unconfined_u不受限的使用者或檔案 system_u受限的程序或檔案 | 檔案、程序、使用者 object_r檔案 system_r程序和使用者 | 資料類型,重要 何種類型程序通路何種檔案 | 安全級别 s0最低 隻要在msl下才有意義 | 劃分的不同分類,當它不存在了 |
context查詢工具seinfo、sesearch
seinfo -u # 查詢所有的user字段的種類
seinfo -r # 查詢所有的role字段的種類
seinfo -t # 查詢所有的type字段的種類
sesearch -A 可以查詢什麼類型程序可以讀取什麼type類型的檔案
sesearch -A -s 程序type # 查詢type類型的程序能夠讀取的檔案type
sesearch -A -b 規則(規則的boolean值,是以為-b選項,了解為bool規則)
# 查詢指定規則下放行的程序能夠讀取的檔案type
3.2 目前context和期望context
系統中的每個檔案都會有context,我們使用ls -Z查詢出來的我們看到的context就是目前context;那期望context又是什麼呢,系統會把每個檔案的預設context記錄下來并儲存,這樣系統記錄下來的就是期望context。semanage指令可以管理每個檔案的期望context,也叫期望标簽。
semanage fcontext -l # 檢視所有的期望SELinux标簽
semanage fcontext -a -t type 目标目錄 # 添加期望SELinux标簽
semanage fcontext -m -t type 目标目錄 # 修改期望SELinux标簽
semanage fcontext -d -t type 目标目錄 # 删除期望SELinux标簽
修改規範:
~]# semanage fcontext -a -t type 目錄(/.*)?
3.3 修改目前context
使用chcon指令手動修改security context,格式chcon 選項 目标檔案
chcon # 手動修改檔案的context,-R選項可以遞歸修改目錄,-v選項可以顯示context的修改前後的結果
chcon -t # 修改檔案的context的type字段
chcon -u # 修改檔案的context的user字段
chcon -r # 修改role字段
chcon -l # 修改安全級别
chcon -h # 針對軟連結檔案的修改,不加-h則會修改軟連結對應的原檔案
chcon --reference=file # 以file的context為模闆修改
使用restorecon指令修改context為期望context,格式restorecon 選項 目标檔案,
restorecon -R # 遞歸修改目錄
restorecon -v # 顯示修改的過程
3.3 semanage修改程序通路的端口号
雖然聽起來是修改端口号的,但是到底還是修改安全上下文的,我們用semanage工具,指令為semanage port
查詢某個服務的context type字段
文法:semanage port -l |grep 服務名
添加某個端口為指定服務的通路端口
文法:semanage port -a -t type -p 協定 端口号(不要與常用端口重複)
例如添加ssh服務的端口号,預設為22
四、SELinux日志管理
SELinux阻止的程序的日志記錄存放在/var/log/audit/audit.log檔案中,但是該檔案中的内容使用者閱讀體驗很差,可以去cat /var/log/audit/audit.log看看,是以系統為我們提供了sealert工具,幫助我們整理該日志檔案,sealert工具處理日志檔案的時候需要花費一點時間,請耐心等待。
另外SELinux的日志功能需要auditd.service服務的開啟。
結合案例(apache SELinux配置)來了解sealert工具:
1.確定本機配置了httpd服務并處于開啟狀态,httpd服務配置方法請參考部落格:Apache部署httpd服務
2./usr/sbin/httpd指令會開啟程序去讀取/var/www/html/目錄下以.html結尾的檔案,現在在家目錄下建立檔案~/index.html,随意編寫内容,之後把新建立的檔案移動至/var/www/html/下。
3.我們通過浏覽器,在位址欄輸入本機IP,檢視成功與否,當出現如下界面的時候表示通路失敗。
4.我們在配置服務的時候确定了沒有問題,這時候我們要想到可能是SELinux阻止了我們通路。我們通過指令
sealert -a /var/log/audit/audit.log
檢視SELinux日志,我們找到httpd的關鍵字,閱讀内容,下圖中的内容是我們主要關注的部分,其他則是/var/log/audit/audit.log的内容,我們可以忽略。最後我們優先考慮改動最小的解決方案,即修改SELinux标簽。
5.執行指令restorecon -v /var/www/html/index.html,就是修改該檔案為httpd能夠通路的預設标簽
6.再用浏覽器通路檢視結果,這次成功。