SELinux
全稱:Security-Enhanced Linux,安全加強的Linux;
SELinux系統的本來名稱爲MAC:強制訪問控制;SELinux就是MAC訪問控制機制在Linux系統中的實現;
操作系統安全等級標準(橙皮書):
D級別(最低安全級別)
C級別:C1, C2 (DAC自主訪問控制,例如windows等系統的安全級別爲C1級別)
B級別:B1, B2, B3 (強制訪問控制級別MAC)
A級別(最高安全級別)
訪問控制機制:
DAC:Discretionary Access Control,自主訪問控制:
基於文件或數據被文件系統賦予的訪問權限(r,w,x)的方式實現的訪問控制機制;
MAC:Mandatory Access Control,強制訪問控制:
對於文件或數據的訪問權限不是針對用戶身份來設定,當某個用戶發起某個進程之後,該進程是否能夠操縱或處理此文件或數據,取決於進程和文件是否具備可以匹配的domain(進程的域)和type(文件的類型);
SELinux工作於Linux內核中:
RHEL 4.0:測試性的加入了SELinux安全組件;
RHEL 5.0:在安全操作系統時強制安裝此組件,但可以在安裝時選擇關閉相應功能;
RHEL 6.0+:在安裝操作系統時強制安裝此組件,且在系統啓動之後自動啓動其功能;
SELinux依賴於安全策略結果進行相應的訪問控制管理,策略結果已知的有三種:
1、strict(嚴格策略):對於每個文件都要嚴格的規定其類型,對於每個進程都要設定特定的域,進程的域和文件的類型必須嚴格匹配,才能允許進程訪問此文件;
2、mls:multi-level security,多級安全策略結果集; //發行版內被去除
3、targeted:僅對有限個進程進行SELinux的強制訪問控制管控;只要進程的域和文件的類型屬於某同一大類,就可以匹配,就可以允許進程訪問文件;在RHEL系操作系統中爲此策略結果; //所有有限個進程:指的是那些容易被***並且會對系統造成安全隱患的進程
注意:在targeted策略結果集中,僅關心進程的domain和文件的type能否匹配,與其他的安全上下文標識沒有關係;
Sandbox(SELinux需要在沙箱中完成):
在Linux系統中,能夠完成真實操作的實體,是進程;
subject, action(operation), object
subject:進程
action(operation)動作:open, close, read, write, modify, delete, chmod, chown, ...
object:文件,進程,套接字,鏈接,...
SELinux爲每個文件和進程提供了一套安全標籤,這些安全標籤可以稱爲SELinux的安全上下文(security context);
user-identify:role:domain|type:sencitivity
user-identify:SELinux的用戶身份標識,通常指用戶的類型;
role:角色
domain|type:進程的域或文件的類型;
sencitivity:敏感度;
SELinux的策略庫(規則庫):用來存放規則
規則:進程的哪個域可以以哪種方式訪問或操縱哪些類型的文件;存放於/etc/selinux/targeted/policy目錄中;
/etc/sysconfig/selinux文件中定義了SELinux的工作模式和使用的策略結果集;
SELINUX=enforcing
SELINUXTYPE=targeted
SELinux的工作模式(/etc/sysconfig/selinux文件中定義SELinux工作模式):
enforcing - 強制開啓SELinux機制
permissive - 警告模式,所有動作被記錄下來,但並不會阻止操作
disabled - 關閉SELinux機制
注意:
1.凡是從enforcing或permissive模式切換至disabled模式,或者從disabled模式切換至enforcing或permissive模式,都必須經過操作系統的重新引導才能生效;
2.從enforcing模式到permissive模式的切換,可以直接使用命令行工具完成且立即生效;
setenforce命令:切換SELinux的工作模式
setenforce [ Enforcing | Permissive | 1 | 0 ]
1:Enforcing
0:Permissive
getenforce命令:顯示SELinux的工作模式
注意:使用setenforce命令修改的SELinux的工作模式會立即生效,但並非永久有效;如果想要使被修改的SELinux的工作模式永久有效,則需要修改/etc/sysconfig/selinux文件中的SELINUX參數的值,並重新引導操作系統;
查看進程或文件的SELinux的安全上下文:
文件安全上下文查看:
ls -Z|--context [file]
進程安全上下文查看:
ps auxZ|-efZ
修改文件的安全上下文:
chcon命令:
常用選項:
-t, --type=TYPE:直接設置目標文件的類型;
-R, --recursive:遞歸地修改目錄中所有文件,包括子目錄中的文件;
--reference=RFILE:參考RFILE所代表的文件的安全上下文,爲目標文件設置完全相同的安全上下文;
使用場景:
通常在進程的安全上下文與文件的安全上下文類型不相符合或不能匹配的時候使用;
示例:
設置httpd虛擬主機對應的文檔根目錄的安全上下文:
~]# chcon -t httpd_sys_content_t -R /myweb
~]# chcon --reference=/var/www -R /myweb
restorcon命令:
常用選項:
-R, -r:遞歸修改指定目錄及其子目錄的安全上下文爲默認值;
示例:
撤銷httpd虛擬主機對應的文檔根目錄的安全上下文:
~]# restorcon -R /myweb
查看或修改策略中的內容:
getsebool命令:查看SELinux的布爾值
常用選項:-a:查看所有SELinux的布爾值
setsebool命令:修改SELinux的布爾值
常用選項:
-P:如果添加-P選項,則將附加的值直接寫入磁盤中的策略文件中,永久生效;如果不添加-P選項,則重啓後恢復默認布爾值
使用場景:支持二進制策略修改的系統服務;
1.vsftpd的匿名用戶的上傳功能被SELinux限制的場景:
~]# setsebool -P ftpd_anon_write on
~]# setsebool -P ftpd_full_access=1
2.samba服務中samba用戶訪問自己的家目錄的共享結果被SELinux限制的場景:
~]# setsebool -P samba_enable_home_dirs on
3.samba服務中共享的目錄是由管理員自行創建並指定的:
chcon -t samba_share_t /path/to/directory
semanage命令:SELinux的策略管理工具 //如果沒有此命令,安裝policycoreutils-python程序包
semanage port命令:
-a, --add:添加一個端口號
-d, --delete:刪除一個端口號
-m, --modify:修改一個端口號
-l, --list:列出已被定義的端口號
示例:
~]# semanage port -a -t http_port_t -p tcp 8088