SELinux(Security Enhanced Linux)html
系統資源都是經過進程來讀取更改的,爲了保證系統資源的安全,傳統的Linux使用用戶、文件權限的概念來限制資源的訪問,經過對比進程的發起用戶和文件權限以此來保證系統資源的安全,這是一種自由訪問控制方式(DAC);可是隨着系統資源安全性要求提升,出現了在Linux下的一種安全強化機制(SELinux),該機制爲進程和文件加入了除權限以外更多的限制來加強訪問條件,這種方式爲強制訪問控制(MAC)。這兩種方式最直觀的對比就是,採用傳統DAC,root能夠訪問任何文件,而在MAC下,就算是root,也只能訪問設定容許的文件。node
目錄linux
SELinux的工做原理apache
工做模式和工做類型centos
安全上下文瀏覽器
SELinux日誌管理
安全
1、SELinux的工做原理
bash
先說下SELinux下的幾個基本的概念網絡
主體 # SELinux管理的主體爲進程
ssh
目標 # 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、工做模式和工做類型
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、安全上下文
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
4、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.再用瀏覽器訪問查看結果,此次成功。