selinux簡介

  selinux(Security-Enhanced Linux)是一個內核中實踐的強制訪問控制(MAC)安全性機制,目的在於明確的指明某個進程可以訪問哪些類型的資源。開啓selinux後,內核在執行系統調用前會詢問 SELinux 是否獲得了執行操作的授權


一、DAC(自主式訪問控制)的缺陷

  DAC(自主式訪問控制,linux的標準訪問控制方式)是根據程序的擁有者/屬組與文件資源的 rwx 權限來決定有無存取的能力,它的缺點就是不能識別擁有者和程序之間的區別。如果程序擁有者被授權訪問,則程序被授權訪問。比如,httpd進程的用戶身份是apache,apache用戶對/etc/passwd具有讀權限,這樣,如果某個惡意用戶劫持了httpd進程,意即取得了apache用戶的權限,就能讀取/etc/passwd獲知系統上已存在的用戶。如果惡意用戶劫持的進程具有root用戶的權限,那就更可怕了。


二、selinux的運行機制

wKioL1bO82ribfSeAAEgBU9j7Q4885.png

  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沒有訪問權限

wKiom1bPHYjB6m11AACj_2c9sTU619.png 

[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

wKiom1bPHgDBoJHpAAFCAVuYQQg647.png     


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章