SElinux的概念:
SELinux[Security Enhanced Linux (安全強化 Linux)],是工作在內核中的MAC (Mandatory Access Control,強制訪問控制系統)的一個實現,目的在於明確的指明某個進程可以訪問哪些資源(文件、網絡端口等)。強制訪問控制系統的用途在於增強系統抵御 0-Day 攻擊(利用尚未公開的漏洞實現的攻擊行為)的能力。所以它不是網絡防火牆或 ACL 的替代品,在用途上也不重復。
DAC和MAC的聯系和區別:
一般系統上采用的DAC的環境,selinux則是MAC(強制訪問控制)
DAC環境下進程是無束縛的
MAC環境下策略的規則決定控制的嚴格程度
MAC環境下進程可以被限制的
策略被用來定義被限制的進程能夠使用那些資源(文件和端口)
默認情況下,沒有被明確允許的行為將被拒絕
對於selinux的通俗理解:
selinux,它給一些特定程序(這些程序也在不斷增加)做了一個沙箱,它將文件打上了一個安全標簽,這些標簽屬於不同的類,也只能執行特定的操作,也就是規定了某個應用程序設定了你可以訪問那些文件或目錄。
subject operation object
主體:進程稱為主體(subject)
對象(object):所有可以讀取的對象,包括文件、目錄和進程,端口等,
SELinux中對所有的文件都賦予一個type的文件類型標簽,對於所有的進程也賦予各自的一個domain的標簽。Domain標簽能夠執行的 操作由安全策略裡定義。當一個subject試圖訪問一個object,Kernel中的策略執行服務器將檢查AVC (訪問矢量緩存Access Vector Cache), 在AVC中,subject和object的權限被緩存(cached),查找“應用+文件”的安全環境。然後根據查詢結果允許或拒絕訪問
安全策略:定義主體讀取對象的規則數據庫,規則中記錄了哪個類型的主體使用哪個方法讀取哪一個對象是允許還是拒絕的,並且定義了哪種行為是充許或拒絕
了解和配置 SELinux
1. 獲取當前 SELinux 運行狀態
getenforce
可能返回結果有三種:Enforcing、Permissive 和 Disabled。Disabled 代表 SELinux 被禁用,Permissive 代表僅記錄安全警告但不阻止可疑行為,Enforcing 代表記錄警告且阻止可疑行為。
2. 改變 SELinux 運行狀態
setenforce [ 1 | 0 ]
切換disabled狀態或者從disabled狀態切換至別的狀態都需要重啟。而enforceing和Permissive兩種狀態間切換不需要重啟
重啟時會為整個文件系統重新創建安全標簽(touch /.autorelabel && reboot)。
只要grub中或者配置文件中有一個設置了disabled ,那麼seLinux就是不啟動的。
若是想要永久變更系統 SELinux 運行環境,可以通過更改配置文件 /etc/sysconfig/selinux實現。
3. SELinux 運行策略
strict: CentOS5,每個進程都受到selinux的控制
targeted: 用來保護常見的網絡服務,僅有限進程受到selinux控制,只監控容易被入侵的進程,rhel4只保護13個服務,rhel5保護88個服務
minimum:centos7,修改過的targeted,只對選擇的網絡服務
mls:提供MLS(多級安全)機制的安全性
minimum和mls穩定性不足,未加以應用
一般都是默認采用targeted,不用修改
4. 安全標簽
a.查看程序的安全標簽
#ps auxZ | grep lldpad
system_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -d
b.查看文件的安全標簽:有.就是有安全標簽
#ls -Z /usr/lib/xulrunner-2/libmozjs.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.so
安全標簽有多個選項,我們只需要關注第三個type就行。
Type:指定數據類型,規則中定義何種進程類型訪問何種文件Target策略基於type實現,多服務共用:public_content_t
給文件重新打安全標簽:
chcon [-t TYPE] FILE...
chcon[OPTION]... --reference=RFILE FILE...
-R:遞歸打標;
恢復目錄或文件默認的安全上下文:
restorecon[-R] /path/to/somewhere
5.安全上下文
semanage來自policycoreutils-python包,centos 6上默認沒安裝
查看默認的安全上下文
semanage fcontext –l
添加安全上下文
semanage fcontext -a –t httpd_sys_content_t‘/testdir(/.*)?’
restorecon –Rv /testdir
刪除安全上下文
semanage fcontext -d –t httpd_sys_content_t‘/testdir(/.*)?’
6.端口
查看端口標簽
semanage port –l
添加端口
semanage port -a -t port_label-p tcp|udpPORT
semanage port -a -t http_port_t -p tcp 9527
刪除端口
semanage port -d -t port_label-p tcp|udpPORT
semanage port -d -t http_port_t -p tcp 9527
修改
semanage port -m -t port_label-p tcp|udpPORT
semanage port -m -t http_port_t-p tcp9527
7.布爾規則
布爾型規則:
getsebool
setsebool
查看bool命令:
getsebool [-a] [boolean]
semanage boolean –l
semanage boolean -l –C 查看修改過的布爾值
設置bool值命令:
setsebool [-P] booleanvalue
setsebool [-P] Boolean=value
8.日志
yum install setroublesshoot*(重啟生效)
將錯誤的信息寫入/var/log/message
grep setroubleshoot/var/log/messages
sealert-l UUID
查看安全事件日志說明
sealert-a /var/log/audit/audit.log
掃描並分析日志
Apache SELinux 配置實例
1、安裝httpd服務,改變網站的默認主目錄為/website,添加SELinux文件標簽規則,設置http_sys_content_t到/website及目錄下所有文件,使網站可訪問
[root@~]# mkdir /website
[root@~]# ll -Z /website -d
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /websit
[root@~]# ll -Z /var/www/html/
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
[root@~]# chcon --reference=/var/www/html /website
[root@~]#ll -Z /website/
-rwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/website"
[root@~]# service httpd restart
[root@~]#echo "test website" > /website/index.html
測試:
在浏覽器上輸入地址,可以正常訪問到
2、修改網站端口為9527,增加SELinux端口標簽,使網站可訪問
[root@~]# semanage port -l | grep "http_port_t"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@~]# semanage port -a -t http_port_t -p tcp 9527
[root@~]# semanage port -l | grep "http_port_t"
http_port_t tcp 9527,80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@~]#vim /etc/httpd/conf/httpd.conf
Listen 9527
測試:
3、啟用SELinux布爾值,使用戶student的家目錄可通過http訪問
[root@~]#vim /etc/httpd/conf/httpd.conf
修改為:
# UserDir disabled
UserDir public_html
[root@~]# chmod 711 /home/jay
[root@~]#mkdir /home/jay/public_html
[root@~]#echo "jay home" > /home/jay/public_html/index.html
查看布爾規則:
[root@~]# semanage boolean -l | grep "homedir"
httpd_enable_homedirs (off , off) Allow httpd to read home directories
修改布爾規則:
[root@~]# setsebool -P httpd_enable_homedirs on
測試:
SELinux安全上下文初探 http://www.linuxidc.com/Linux/2014-04/99508.htm
一次由SELinux引起的SSH公鑰認證失敗問題 http://www.linuxidc.com/Linux/2013-07/87267.htm
SELinux 入門教程 http://www.linuxidc.com/Linux/2013-04/82371.htm
SELinux簡單配置 http://www.linuxidc.com/Linux/2012-12/77032.htm
CentOS系統如何快速關閉SELinux http://www.linuxidc.com/Linux/2012-11/74613.htm
CentOS/RHEL下如何關閉SELinux http://www.linuxidc.com/Linux/2011-05/36486.htm
SELinux 入門指南 http://www.linuxidc.com/Linux/2016-05/131162.htm