#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
允許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,確定網絡連接配接,
使用下面的指令安裝
*/ [[email protected] ~]# yum install httpd /*
我們在root的家目錄建立一個html檔案
*/ [[email protected] ~]# pwd /root [[email protected] ~]# vi index.html /*
随便輸入一段文字,儲存退出
*/ welcome to www.linuxde.net /*将這個檔案mv到網頁預設目錄下*/
[[email protected] ~]# 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資訊不比對*/
[[email protected] html]# ls -Z /var/www/html/
.... unconfined_u:object_r:admin_home_t:s0 index.html
[[email protected] html]# ls -Zd /var/www/html/
.... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
/*使用restorecon來恢複網頁主目錄中所有檔案的SELinux配置資訊(如果目标為一個目錄,可以添加-R參數遞歸)*/
[[email protected] 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指令可以查詢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,如需轉載請自行聯系原作者