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.再用瀏覽器訪問查看結果,這次成功。