selinux實戰手冊

技術小胖子發表於2017-11-15

#selinux實戰手冊

#SELinux的策略與規則管理相關命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。


#selinux簡介

   SELinux(Security-Enhanced Linux) 是美國國家安全域性(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。

NSA是在Linux社群的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,程式只能訪問那些在他的任務中所需要檔案。

    RHEL、CENTOS、UBUNTU等Linux發行版系統預設都開啟了selinux安全功能,如果不熟悉用法,可直接將selinux關閉。


#selinux狀態設定

查狀態:getenforce

臨時開啟/關閉selinux:setenforce   1/0   [1開啟,0關閉]


#配置檔案:

cat  /etc/selinux/config   //有效配置如下:

SELINUX=enforcing     //狀態為強制

SELINUXTYPE=targeted

說明:狀態有enforcing強制,permissive自由(寬容),disable禁用。

     Enforcing狀態,就是你違反了策略,你就無法繼續操作下去。

     permissive狀態,就是Selinux有效,但是即使你違反了策略的話它讓你繼續操作,但是把你的違反的內容記錄下來。在我們開發策略的時候非常的有用。

相當於Debug模式。


技巧:在核心載入過程中關閉selinux,grub介面執行:

kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0

-----------------

查詢所有布林設定狀況:getsebool -a

檢視檔案的selinux上下檔案屬性:ls  -Z   /etc/hosts

檢視目錄的:ls  -dZ   /etc


chcon:更改檔案的selinux標籤

mkdir   /sea    

ls  -dZ   /sea

chcon  -t  etc_t   /sea    //給目錄/sea設定selinux安全型別

cp  -Z   /etc/passwd   /sea/pa    //複製檔案及其selinux屬性

ls  -Z  /sea/pa      //檢視檔案的selinux屬性


-----------------

chcon命令

功能:修改物件(檔案)的安全上下文,比如:使用者、角色、型別、安全級別。也就是將每個檔案的安全環境變更至指定環境。

使用–reference選項時,把指定檔案的安全環境設定為與參考檔案相同。chcon命令位於/usr/bin/chcon。 

語法:chcon [選項]… 環境 檔案… 

      chcon [選項]… [-u 使用者] [-r 角色] [-l 範圍] [-t 型別] 檔案… 

      chcon [選項]… –reference=參考檔案 檔案… 

選項:–help:顯示此幫助資訊並退出。

     -h, –no-dereference:影響符號連線而非引用的檔案。 

     –reference=參考檔案:使用指定參考檔案的安全環境,而非指定值。 

     -R, –recursive:遞迴處理所有的檔案及子目錄。 

     -v, –verbose:為處理的所有檔案顯示診斷資訊。 

     -u, –user=使用者:設定指定使用者的目標安全環境。 

     -r, –role=角色:設定指定角色的目標安全環境。 

     -t, –type=型別:設定指定型別的目標安全環境。 

     -l, –range=範圍:設定指定範圍的目標安全環境。 

以下選項是在指定了-R選項時被用於設定如何穿越目錄結構體系。如果您指定了多於一個選項,那麼只有最後一個會生效。 

     -H:如果命令列引數是一個通到目錄的符號連結,則遍歷符號連結。 

     -L:遍歷每一個遇到的通到目錄的符號連結。 

     -P:不遍歷任何符號連結(預設)。  

     –version:顯示版本資訊並退出。 


例項 如果你想把這個ftp共享給匿名使用者的話,需要開啟以下: 

chcon -R -t public_content_t /var/ftp 


如果你想讓你設定的FTP目錄可以上傳檔案的話,SELINUX需要設定: 

chcon -t public_content_rw_t /var/ftp/incoming 


允許使用者HHTP訪問其家目錄,該設定限僅於使用者的家目錄主頁: 

setsebool -P httpd_enable_homedirs 1 

chcon -R -t httpd_sys_content_t ~user/public_html 


如果你希望將samba目錄共享給其他使用者,你需要設定: 

chcon -t samba_share_t /directory 


共享rsync目錄時: 

chcon -t public_content_t /directories


-----------------


##查詢SElinux策略內各項規則的布林值。getsebool

語法:getsebool [-a] [布林值條款]

選項:-a  列出目前系統上面的所有布林值條款設定為開啟或關閉值。


例項 查詢本系統內所有的布林值設定狀況: 

getsebool -a    //部分結果如下

allow_ftpd_anon_write –> off     //是否允許ftpd匿名寫操作,off為關,on為開

allow_ftpd_full_access –> off     //是否允許ftpd完全訪問

allow_ftpd_use_cifs –> off       //允許ftpd使用cifs通用網際網路檔案系統

allow_ftpd_use_nfs –> off        //允許ftpd使用nfs

ftp_home_dir –> off        //允許訪問ftp家目錄

ftpd_connect_db –> off        //允許ftpd連線資料

ftpd_use_fusefs –> off        //允許ftpd使用fusefs

ftpd_use_passive_mode –> off        //允許ftpd被動模式

httpd_enable_ftp_server –> off      //在httpd上啟用ftp服務

tftp_anon_write –> off      //允許tftp匿名寫許可權

tftp_use_cifs –> off      //允許tftp使用cifs

tftp_use_nfs –> off      //允許tftp使用nfs

allow_httpd_anon_write –> off   //允許httpd匿名寫許可權

httpd_enable_homedirs –> off    //允許httpd訪問使用者家目錄

  


getsebool httpd_enable_homedirs 

setsebool -P httpd_enable_homedirs=0   //0是關閉 1是開啟


——————-


##SELinux的策略與規則管理相關命令:

seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。


##setsebool命令

功能:用來修改SElinux策略內各項規則的布林值。

語法:setsebool [-P] 布林值=[0|1]

選項:-P:直接將設定值寫入配置檔案,該設定資料將來會生效的。


例項 允許vsvtp匿名使用者寫入許可權: 

setsebool -P allow_ftpd_anon_write=1 


如果你希望你的ftp使用者可以訪問自己的家目錄的話,需要開啟: 

setsebool -P ftp_home_dir 1 


如果你希望將vsftpd以daemon的方式執行的話,需要開啟: 

setsebool -P ftpd_is_daemon 1 


你可以讓SElinux停止保護vsftpd的daemon方式動行: 

setsebool -P ftpd_disable_trans 1 


HTTP被設定允許cgi的設定: 

setsebool -P httpd_enable_cgi 1 


允許使用者HHTP訪問其家目錄,該設定限僅於使用者的家目錄主頁: 

setsebool -P httpd_enable_homedirs 1 

chcon -R -t httpd_sys_content_t ~user/public_html 


允許httpd訪問終端: setsebool -P httpd_tty_comm 1 


關閉Selinux的關於httpd程式守護的保護: 

setsebool -P httpd_disable_trans 1 service httpd restart 


關於named、master更新selinux設定: 

setsebool -P named_write_master_zones 1 


關閉named的程式守護保護: 

setsebool -P named_disable_trans 1 

service named restart Selinux


將本機的NFS共享設定成只讀: 

setsebool -P nfs_export_all_ro 1 SElinux


將本機的NFS共享設定成可讀可寫: 

setsebool -P nfs_export_all_rw 1 


如果你想要將遠端NFS的家目錄共享到本機,需要開啟: 

setsebool -P use_nfs_home_dirs 1 


如果samba伺服器共享目錄給多個域,則需要: 

setsebool -P allow_smbd_anon_write=1 


samba伺服器要共享家目錄時: 

setsebool -P samba_enable_home_dirs 1 


如果你需在本機上使用遠端samba伺服器的家目錄: 

setsebool -P use_samba_home_dirs 1 


關閉selinux關於samba的程式守護的保護: 

setsebool -P smbd_disable_trans 1 

service smb restart 


允許rsync其他使用者寫入時: 

setsebool -P allow_rsync_anon_write=1 


停止rsync的程式保護 

setsebool -P rsync_disable_trans 1 


允許系統使用kerberos: 

setsebool -P allow_kerberos 1 


系統工作在nis環境時: 

setsebool -P allow_ypbind 1


--------------------

restorecon命令

功能:用來恢復SELinux檔案屬性即恢復檔案的安全上下文。 

語法 restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname…] 

選項 -i:忽略不存在的檔案。

-f:infilename 檔案 infilename 中記錄要處理的檔案。

-e:directory 排除目錄。 -R/-r:遞迴處理目錄。

-n:不改變檔案標籤。 

-o/outfilename:儲存檔案列表到 outfilename,在檔案不正確情況下。 

-v:將過程顯示到螢幕上。 

-F:強制恢復檔案安全語境。 


例項:假設CentOS安裝了apache,網頁預設的主目錄是/var/www/html,我們經常遇到這樣的問題,

在其他目錄中建立了一個網頁檔案,然後用mv移動到網頁預設目錄/var/www/html中,但是在瀏覽器中

卻打不開這個檔案,這很可能是因為這個檔案的SELinux配置資訊是繼承原來那個目錄的,

與/var/www/html目錄不同,使用mv移動的時候,這個SELinux配置資訊也一起移動過來了,從而導致

無法開啟頁面,具體請看下面的例項: /*使用CentOS舉例,如果預設沒有安裝apache,確保網路連線,

使用下面的命令安裝

*/ [root@linuxde.net ~]# yum install httpd /*

我們在root的家目錄新建一個html檔案

*/ [root@linuxde.net ~]# pwd /root [root@linuxde.net ~]# vi index.html /*

隨便輸入一段文字,儲存退出

*/ welcome to www.linuxde.net /*將這個檔案mv到網頁預設目錄下*/

[root@linuxde.net ~]# mv index.html /var/www/html/ 

/*

 * 這個時候我們使用firefox瀏覽器輸入127.0.0.1/index.html發現打不開,

 * 檢視一下SELinux的日誌檔案,發現了下面這一段報錯資訊,從這個報錯資訊不難看出, 

 * 程式httpd訪問網頁主目錄中的index.html時被SELinux阻止,原因是因為,SELinux配置資訊不正確, 

 * 正確的SELinux配置資訊應該是scontext=後面的部分,

 * 而index.html檔案的SELinux配置資訊卻是tcontext=後面的部分,

 * 從tcontext=的第三段“admin_home_t”不難看出,這個檔案的SELinux配置資訊是root使用者家目錄的。

 */ type=AVC msg=audit(1378974214.610:465): avc: denied { open } for pid=2359 

 comm=”httpd” path=”/var/www/html/index.html” 

 dev=”sda1″ ino=1317685 scontext=system_u:system_r:httpd_t:s0 

 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file 


 /* 使用ls -Z也可以看出,檔案和目錄的SELinux資訊不匹配*/ 

 [root@linuxde.net html]# ls -Z /var/www/html/ 

 …. unconfined_u:object_r:admin_home_t:s0 index.html 

 [root@linuxde.net html]# ls -Zd /var/www/html/ 

 …. system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ 

 /*使用restorecon來恢復網頁主目錄中所有檔案的SELinux配置資訊(如果目標為一個目錄,可以新增-R引數遞迴)*/

 [root@linuxde.net html]# restorecon -R /var/www/html/


-------------------

seinfo命令

功能:是用來查詢SELinux的策略提供多少相關規則,一個主體程式能否讀取到目標檔案資源的重點是在於SELinux的策略以及策略內的各項規則,

然後再通過該規則的定義去處理各專案標檔案的安全上下文,尤其是“型別”部分。

語法 seinfo(選項) 

選項 -A:列出SELinux的狀態、規則布林值、身份識別、角色、型別等所有資訊。 

-t:列出SELinux所有型別(type)的種類。 

-r:列出SELinux所有角色(role)的種類。 

-u:列出SELinux所有身份識別(user)的種類。 

-b:列出所有規則的種類(布林值)。 


例項 列出與httpd有關的規則: 

seinfo -b | grep httpd


-------------------

semanage命令

功能:是用來查詢與修改SELinux預設目錄的安全上下文。

SELinux的策略與規則管理相關命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。 

語法:semanage {login|user|port|interface|fcontext|translation} -l 

      semanage fcontext -{a|d|m} [-frst] file_spec 

選項 -l:查詢。 fcontext:主要用在安全上下文方面。 

     -a:增加,你可以增加一些目錄的預設安全上下文型別設定。 

     -m:修改。 -d:刪除。 

     

例項 查詢一下/var/www/html的預設安全性本文的設定: 

semanage fcontext -l SELinux fcontext type Context

….(前面省略)…. /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ….(後面省略)…. 

說明:如上面例子所示,我們可以查詢的到每個目錄的安全性本文!而目錄的設定可以使用正規表示式去指定一個範圍。

那麼如果我們想要增加某些自定義目錄的安全性本文呢?舉例來說,我想要色設定/srv/samba成為 public_content_t的型別時,

應該如何設定呢? 用semanage命令設定/srv/samba目錄的預設安全性本文為public_content_t: 

mkdir /srv/samba ll -Zd /srv/samba drwxr-xr-x root root root:object_r:var_t /srv/samba 

如上所示,預設的情況應該是var_t這個咚咚的! 

semanage fcontext -l | grep `/srv` /srv/.* 

all files system_u:object_r:var_t:s0 /srv/([^/]*/)?ftp(/.*)? 

all files system_u:object_r:public_content_t:s0 /srv/([^/]*/)?www(/.*)? 

all files system_u:object_r:httpd_sys_content_t:s0 /srv/([^/]*/)?rsync(/.*)? 

all files system_u:object_r:public_content_t:s0 /srv/gallery2(/.*)? 

all files system_u:object_r:httpd_sys_content_t:s0 /srv directory system_u:object_r:var_t:s0 

//看這裡! 上面則是預設的/srv底下的安全性本文資料,不過,並沒有指定到/srv/samba。 

semanage fcontext -a -t public_content_t “/srv/samba(/.*)?” 

semanage fcontext -l | grep `/srv/samba` /srv/samba(/.*)? 

all files system_u:object_r:public_content_t:s0 


cat /etc/selinux/targeted/contexts/files/file_contexts.local 

# This file is auto-generated by libsemanage 

# Please use the semanage command to make changes /srv/samba(/.*)? 

system_u:object_r:public_content_t:s0 #寫入這個檔案 restorecon -Rv /srv/samba* 


#嘗試恢復預設值 ll -Zd /srv/samba 

drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/ 

#有預設值,以後用restorecon命令來修改比較簡單! 

semanage命令的功能很多,這裡主要用到的僅有fcontext這個選項的用法而已。

如上所示,你可以使用semanage來查詢所有的目錄預設值,也能夠使用它來增加預設值的設定!


-------------------------

seinfo命令

功能:使用seinfo命令可以查詢SELinux的策略提供多少相關規則,如果查到的相關型別或者布林值,想要知道詳細規則時,使用sesearch命令查詢。

語法:sesearch [-a] [-s 主體型別] [-t 目標型別] [-b 布林值] 

選項:-a:列出該型別或布林值的所有相關資訊 

      -t:後面還要接型別,例如 -t httpd_t 

      -b:後面還要接布林值的規則,例如 -b httpd_enable_ftp_server 


例項 找出目標檔案資源型別為httpd_sys_content_t的有關資訊: 

sesearch -a -t httpd_sys_content_t 


找出主體程式為httpd_t且目標檔案型別為httpd相關的所有資訊: 

sesearch -s httpd_t -t httpd_* -a 


檢視布林值httpd_enable_homedirs設定了多少規則: 

sesearch -b httpd_enable_homedirs -a



      本文轉自rshare 51CTO部落格,原文連結:http://blog.51cto.com/1364952/1952219,如需轉載請自行聯絡原作者


相關文章