selinux(Security-Enhanced Linux)是一個在內核中實踐的強制訪問控制(MAC)安全性機制,目的在於明確的指明某個進程可以訪問哪些類型的資源。開啓selinux後,內核在執行系統調用前會詢問 SELinux 是否獲得了執行操作的授權
一、DAC(自主式訪問控制)的缺陷
DAC(自主式訪問控制,linux的標準訪問控制方式)是根據程序的擁有者/屬組與文件資源的 rwx 權限來決定有無存取的能力,它的缺點就是不能識別擁有者和程序之間的區別。如果程序擁有者被授權訪問,則程序被授權訪問。比如,httpd進程的用戶身份是apache,apache用戶對/etc/passwd具有讀權限,這樣,如果某個惡意用戶劫持了httpd進程,意即取得了apache用戶的權限,就能讀取/etc/passwd獲知系統上已存在的用戶。如果惡意用戶劫持的進程具有root用戶的權限,那就更可怕了。
二、selinux的運行機制
selinux遵從最小權限理念,使用MAC(強制訪問控制)實現訪問控制,MAC可以針對特定的程序與特定的文件資源來進行權限的控管,它控制的主體是程序而不再是用戶,目標則是該程序能否訪問的文件資源。
1、selinux中的有關概念:
主體(subject):程序
目標(object):資源。可以是files、directories、processes、special files or various types(塊設備文件、字符設備、FIFO、socket)、filesystems、links、file descriptors
策略(policy):
由於程序與文件數量太過龐大,selinux會依據某些服務制訂基本的訪問安全策略。這些策略內還會有詳細的規則 (rule) 來指定不同的服務開放某些資源的訪問與否。
策略模型:
strict:完整的 SELinux 限制,限制很嚴格
targeted:針對網絡服務限制較多,針對本機限制較少,默認策略
selinux能夠把程序的某些敏感功能做成布爾型規則,方便用戶控制
安全性標籤:
selinux會給每個進程和文件資源打上一層安全性標籤:
identity:role:type 如示例中的 system_u:object_r:httpd_sys_content_t:s0
[root@node1 ~]# ls -dZ /var/www/html #開啓selinux後,可查看安全性程序和資源的安全性標籤 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html [root@node1 ~]# ps auxZ | grep 'httpd' ... unconfined_u:system_r:httpd_t:s0 apache 2069 0.0 0.2 175708 2464 ? S 19:33 0:00 /usr/sbin/httpd ... [root@node1 ~]# ls -Z /etc/passwd -rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/passwd
①identity:身份識別
②role:角色,由此段可知該數據是程序還是文件資源;
object_r:表示文件資源
system_r:表示程序
③type:類型,此段最重要。
在文件資源上稱爲類型(type)
在程序上稱爲域(domain)
主體(程序)能否訪問目標(文件)取就決於雙方的安全性標籤中的type是否匹配。例如示例中,httpd進程的域httpd_t與/var/www/html的類型httpd_sys_content_t是匹配的,而與/etc/passwd文件所屬的類型etc_t不匹配,所有,雖然apache用戶具有對passwd的讀取權限,httpd進程仍無法讀取該文件。
2、selinux的組件:內核級代碼、selinux的共享庫、策略、工具程序
注意:selinux所使用的MAC訪問控制機制並不是取代標準的DAC訪問控制機制,而是與其結合使用。故程序只有同時通過二者的檢驗,才能訪問資源
三、selinux的配置
1、getenforce:查看selinux是否開啓
disabled:禁用
permissive:警告,不會實際拒絕違反策略的行爲,但會作記錄
enforcing:強制,表示selinux運行
2、啓用SELlinux的方法:
①修改配置文件:/etc/selinux/config(或/etc/sysconfig/selinux)
如果由enforcing或permissive改成disabled,或由disabled改成另外兩種模式,必須重啓系統
②setenforce 0|1 #讓SELinux模式在permissive和enforcing之間切換的方法,0表示permissive,1表示enforcing
3、sestatus:顯示selinux的狀態
選項:
-v:顯示/etc/sestatus文件中的程序與文件的安全性標籤內容
-b:顯示當前策略的規則的布爾值
4、ls -Z /path/to/somefile:查看安全性標籤
5、chcon:修改對象的安全性標籤
用法:chcon [option]... 程序/資源
選項:
-t TYPE:修改類型
-R:遞歸修改
--reference=參考文件:參考指定文件修改
例如:chcon -R -t httpd_sys_content_t /web/htdocs
6、restorecon:恢復文件的默認安全性標籤
-R:遞歸處理
7、getsebool [-a] [布爾條款]:查詢布爾規則的布爾值
例如 getsebool -a | grep 'ftp'
setsebool [-P] 布林條款=[0|1]:設置布爾規則的布爾值
-P:直接寫入策略庫
例如 setbool allow_ftpd_anon_write 1
setbool allow_ftpd_full_access 1
[root@node1 ~]# getenforce Disabled [root@node1 ~]# vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing #開啓selinux # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@node1 ~]# shutdown -r now #要啓用selinux需要重啓系統 ... [root@node1 ~]# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted [root@node1 ~]# getsebool -a | grep 'ftp' #查看與ftp服務相關的布爾規則 allow_ftpd_anon_write --> off allow_ftpd_full_access --> off allow_ftpd_use_cifs --> off allow_ftpd_use_nfs --> off ftp_home_dir --> off ftpd_connect_db --> off ftpd_use_fusefs --> off ftpd_use_passive_mode --> off httpd_enable_ftp_server --> off tftp_anon_write --> off tftp_use_cifs --> off tftp_use_nfs --> off #若要允許匿名用戶上傳文件至ftp服務器,需開啓如下兩項 [root@node1 ~]# setbool allow_ftpd_anon_write 1 [root@node1 ~]# setbool allow_ftpd_full_access 1 [root@node1 ~]# ls -dZ /var/www/html #查看指定目錄的安全性標籤 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html [root@node1 ~]# mkdir -p /web/htdocs [root@node1 ~]# cd /web/htdocs [root@node1 htdocs]# vim /web/htdocs/index.html hello,how are you ? [root@node1 htdocs]# ls -dZ ./ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 ./ [root@node1 htdocs]# ls -Z index.html -rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html [root@node1 htdocs]# vim /etc/httpd/conf/httpd.conf ... DocumentRoot "/web/htdocs" #修改httpd的站點根目錄 ... <Directory "/web/htdocs"> ... [root@node1 htdocs]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bac [root@node1 htdocs]# service httpd reload Reloading httpd:
顯示無法訪問,因httpd進程的域httpd_t對類型default_t沒有訪問權限
[root@node1 htdocs]# tail -1 /var/log/httpd/error_log [Thu Feb 25 23:23:07 2016] [error] [client 192.168.30.1] (13)Permission denied: access to /index.html denied [root@node1 htdocs]# chcon -R --reference=/var/www/html ./ #修改新站點根目錄及其下所有文件的安全性標籤 [root@node1 htdocs]# ls -dZ ./ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 ./ [root@node1 htdocs]# ls -Z index.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html