SELinux開啓與關閉各參數說明

SELinux開啓與關閉各參數說明
轉載:https://blog.csdn.net/wzsy/article/details/50481767
一,目前系統文件權限的管理有兩種:DAC(傳統的) 和 MAC(SELinux)
總結:DAC是以用戶爲出發點來管理權限的
MAC是以程序爲出發點來管理權限的
1,傳統的文件權限與帳號關係:自主式存取控制, DAC(Discretionary Access Control, DAC)
簡單理解DAC就是rwx!因此,當某個程序想要對文件進行存取時, 系統就會根據該程序的擁有者/羣組,並比對文件的權限,若通過權限檢查,就可以存取該文件了。
【注意】:各種權限設定對 root 是無效的。
DAC的缺點:
· root 具有最高的權限:如果不小心某個程序被它人取得, 且該程序屬於 root 的權限,那麼這支程序就可以在系統上進行任何資源的存取!真是要命!
·使用者可以取得程序來變更文件資源的存取權限:如果你不小心將某個目錄的權限設定爲 777 ,由於對任何人的權限會變成 rwx ,因此該目錄就會被任何人所任意存取!
這些問題是非常嚴重的!尤其是當你的系統是被某些漫不經心的系統管理員所掌控時!她們甚至覺得目錄權限調爲 777 也沒有什麼了不起的危險哩...

2,以政策規則訂定特定程序讀取特定文件:委任式存取控制, MAC
委任式存取控制 (MAC) :他可以針對特定的程序與特定的文件資源來進行權限的控管! 也就是說,即使你是 root ,那麼在使用不同的程序時,你所能取得的權限並不一定是 root , 而得要看當時該程序的設定而定。如此一來,我們針對控制的『主體』變成了『程序』而不是使用者喔! 此外,這個主體程序也不能任意使用系統文件資源,因爲每個文件資源也有針對該主體程序設定可取用的權限! 如此一來,控制項目就細的多了!但整個系統程序那麼多、文件那麼多,一項一項控制可就沒完沒了! 所以 SELinux 也提供一些預設的政策 (Policy) ,並在該政策內提供多個規則 (rule) ,讓你可以選擇是否啓用該控制規則!

在委任式存取控制的設定下,我們的程序能夠活動的空間就變小了!舉例來說, WWW 伺服器軟體的達成程序爲 httpd 這支程式, 而預設情況下, httpd 僅能在 /var/www/ 這個目錄底下存取文件,如果 httpd 這個程序想要到其他目錄去存取資料時, 除了規則設定要開放外,目標目錄也得要設定成 httpd 可讀取的模式 (type) 才行喔!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制權,他也無權瀏覽 /etc/shadow 等重要的設定檔喔!
【理解】
以前:root--->啓動httpd---->httpd可以訪問系統任何文件
現在:root--->啓動httpd---->httpd只能訪問/var/www/目錄(這是MAC)規則的約束
如果httpd想要訪問其他目錄,那麼必須滿足兩個條件:DAC的rwx + MAC的規則
二,SELinux 的運作模式
1,【重要原理】SELinux 是透過 MAC 的方式來控管程序,
他控制的主體是程序(httpd), 而目標是文件(該程序欲訪問的文件)!
·主體 (Subject):SELinux 主要想要管理的就是程序,主體= process;
·目標 (Object):主體程序將訪問的文件,目標=文件;
·政策 (Policy):由於程序與文件數量龐大,因此 SELinux 依據服務來制訂基本的存取安全性政策。這些政策內包含有詳細的規則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 5.x 裏面僅有提供兩個主要的政策,分別是:
【重點】
targeted:針對網路服務限制較多,針對本機限制較少,是預設的政策;
strict:完整的 SELinux 限制,限制方面較爲嚴格。
建議:使用預設的 targeted 政策即可。

·安全性上下文 (security context):
我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了政策指定之外,主體與目標的安全性文本必須一致才能夠順利存取。 這個安全性文本 (security context) 有點類似文件系統的 rwx !安全性文本的內容與設定是非常重要的! 如果設定錯誤,你的某些服務(主體程序)就無法存取文件系統(目標資源),當然就會一直出現『權限不符』的錯誤訊息了!
CentOS 5.x 已經幫我們制訂好非常多的規則了,這部份你只要知道如何開啓/關閉某項規則的放行與否即可。

2,查看安全性上下文的命令
#ls –Z
-rw-r--r-- root root root:object_r:user_home_t install.log.syslo

Identify:role:type
身份識別:角色:類型

關於這三個參數的說明:
·身份識別 (Identify):
相當於帳號方面的身份識別!
root:表示 root 的帳號身
system_u:表示系統程序方面的識別,通常就是程序;
user_u:代表的是一般使用者帳號相關的身份。

·角色 (Role):
通過角色欄,我們可以知道這個資料是屬於程序、文件資料還是代表使用者。一般的角色有:
object_r:代表的是文件或者目錄;
system_r:代表的就是程序或者一般使用者也會被指定成爲 system_r !
【重點】在預設的 targeted 政策中, Identify 與 Role 欄位基本上是不重要的!
重要的在於這個類型 (type) 欄位! 基本上,一個主體程序能不能讀取到這個文件資源,與類型欄位有關!而類型欄位在文件與程序的定義不太相同。

·類型(type)很重要,它有兩種叫法,但實爲同一物!
type:在文件資源 (Object) 上面稱爲類型 (Type); DAC中的rwx
domain:在主體程序 (Subject) 則稱爲領域 (domain) 了! MAC中的權限

【重要】domain 需要與 type 搭配,則該程序才能夠順利的讀取文件資源啦!
[root@master oracle]# ll -Zd /usr/sbin/httpd
-rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd
【說明】:既然說type很重要,/usr/sbin/httpd的type是什麼呢?就是httpd_exec_t 這說明httpd程序對該文件有執行權限!相當於文件上的x權限!!

三、SELinux 的啓動、關閉與查看
1,並非所有的 Linux distributions 都支持 SELinux 的
目前 SELinux 支持三種模式,分別如下:
·enforcing:強制模式,代表 SELinux 運作中,且已經正確的開始限制 domain/type 了;
·permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息並不會實際限制 domain/type 的存取。這種模式可以運來作爲 SELinux 的 debug 之用;
·disabled:關閉,SELinux 並沒有實際運作。

2,查看SELinux的模式
#getenforce
Enforcing <==就顯示出目前的模式爲 Enforcing

3,查看 SELinux 的政策 (Policy)?
[root@master oracle]# sestatus
SELinux status: enabled <==是否啓動 SELinux
SELinuxfs mount: /selinux <==SELinux 的相關文件資料掛載點
Current mode: enforcing <==目前的模式
Mode from config file: enforcing <==設定檔指定的模式
Policy version: 21
Policy from config file: targeted <==目前的政策爲何?

4,通過配置文件調整SELinux的參數
[root@www ~]# vi /etc/selinux/config
SELINUX=enforcing <==調整 enforcing|disabled|permissive
SELINUXTYPE=targeted <==目前僅有 targeted 與 strict

5,SELinux 的啓動與關閉
【重要常識】上面是預設的政策與啓動的模式!你要注意的是,如果改變了政策則需要重新開機;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他兩個,那也必須要重新開機。這是因爲 SELinux 是整合到核心裏面去的, 你只可以在 SELinux 運作下切換成爲強制 (enforcing) 或寬容 (permissive) 模式,不能夠直接關閉 SELinux 的!
同時,由 SELinux 關閉 (disable) 的狀態到開啓的狀態也需要重新開機啦!所以,如果剛剛你發現 getenforce 出現 disabled 時, 請到上述文件修改成爲 enforcing 吧!

【重點】如果要啓動SELinux必須滿足以下兩個點:
所以,如果你要啓動 SELinux 的話,請將上述的 SELINUX=enforcing 設定妥當,並且指定 SELINUXTYPE=targeted 這一個設定, 並且到 /boot/grub/menu.lst 這個文件去,看看核心有無關閉 SELinux 了呢?
[root@www ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet selinux=0
initrd /initrd-2.6.18-92.el5.img
#如果要啓動 SELinux ,則不可以出現 selinux=0 的字樣在 kernel 後面!
【問題】通過上面的學習我們知道,如果將啓動着的SELinux改爲禁用,需要重啓電腦,我們不想重啓電腦又不想開啓SELinux該怎麼辦呢?
【答案】將強制模式改爲寬鬆模!
[root@www ~]# setenforce [0|1]
選項與參數:
0 :轉成 permissive 寬容模式;
1 :轉成 Enforcing 強制模式

範例一:將 SELinux 在 Enforcing 與 permissive 之間切換與查看
[root@www ~]# setenforce 0
[root@www ~]# getenforce
Permissive
[root@www ~]# setenforce 1
[root@www ~]# getenforce
Enforcing

6,查看已啓動程序的type設定
[root@master oracle]# ps aux -Z
LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
system_u:system_r:init_t root 1 0.0 0.4 2060 520 ? Ss May07 0:02 init [5
system_u:system_r:kernel_t root 2 0.0 0.0 0 0 ? S< May07 0:00 [migra]
system_u:system_r:kernel_t root 11 0.0 0.0 0 0 ? S< May07 0:00 [kacpi]
system_u:system_r:auditd_t root 4022 0.0 0.4 12128 560 ? S<sl May07 0:01 auditd
system_u:system_r:auditd_t root 4024 0.0 0.4 13072 628 ? S<sl May07 0:00 /sbin/a
system_u:system_r:restorecond_t root 4040 0.0 4.4 10284 5556 ? Ss May07 0:00 /usr/sb

說明:其實這些東西我們都不用管,都是SELinux內置的。只要學會在強制和寬鬆模式間轉換就行了!
1.1 SElinux概述
SELinux(Security-Enhanced Linux) 是美國國家安全局(NAS)對於強制訪問控 制的實現,在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件。大部分使用 SELinux 的人使用的都是SELinux就緒的發行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它們都是在內核中啓用 SELinux 的,並且提供一個可定製的安全策略,還提供很多用戶層的庫和工具,它們都可以使用 SELinux 的功能。
1.1.1 SElinux特點
1.MAC
對訪問的控制徹底化,對所有的文件、目錄、端口的訪問都是基於策略設定的,可由管理員時行設定。
2.RBAC
對於用戶只賦予最小權限。用戶被劃分成了一些role(角色),即使是 root用戶,如果不具有sysadm_r角色的話,也不是執行相關的管理。哪裏role可以執行哪些domain,也是可以修改的。

  1. 安全上下文
    當啓動selinux的時候,所有文件與對象都有安全上下文。進程的安全上下文是域,安全上下文由用戶:角色:類型表示。
    (1)系統根據pam子系統中的pam_selinux.so模塊設定登錄者運行程序的安全上下文
    (2)rpm包安裝會根據rpm 包內記錄來生成安全上下文,
    (3)如果是手工他建的,會根據policy中規定來設置安全上下文,
    (4)如果是cp,會重新生成安全上下文。
    (5)如果是mv,安全上下文不變。
    1.1.2 安全上下文格式
    安全上下文由 user:role:type三部分組成,下面分別說明其作用:
    1.user identity:類似 linux系統中的UID,提供身份識別,安全上下文中的一部分。
    三種常見的user:
    user_u-: 普通用戶登錄系統後預設;
    system_u-: 開機過程中系統進程的預設;
    root-: root登錄後預設;
    在targeted policy中users不是很重要;
    在strict policy中比較重要,的有預設的selinux users都以 "_u"結尾,root除外。
    2.role
    文件與目錄的role,通常是object_r;
    程序的role,通常是system_r;
    用戶的role,targeted policy爲system_r;
    strict policy爲sysadm_r,staff_r,user_r
    用戶的role,類似於系統中的GID,不同的角色具備不同的權限;用戶可以具備多個role;但是同一時間內只能使用一role;
    role是RBAC的基礎;
    3.type
    type: 用來將主體與客體劃分爲不同的組,組每個主體和系統中的客體定義了一個類型;爲進程運行提供最低的權限環境。
    當一個類型與執行的進程關聯時,該 type也稱爲domain,也叫安全上下文。
    域或安全上下文是一個進程允許操作的列表,決字一個進程可以對哪種類型進行操作。
    1.1.3 SElinux配置文件
    vi /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 - SELinux is fully disabled.
    SELINUX=enforcing
    #SELINUX=disabled
    #SELINUXTYPE= type of policy in use. Possible values are:
    #targeted - Only targeted network daemons are protected.
    #strict - Full SELinux protection.
    SELINUXTYPE=targeted
    #SELINUX有「disabled」「permissive」,「enforcing」3種選擇。
    1.模式的設置
    enforcing: 強制模式,只要selinux不允許,就無法執行
    permissive:警告模式,將該事件記錄下來,依然允許執行
    disabled:關閉selinux;停用,啓用需要重啓計算機。

2.策略的設置
targeted:保護常見的網絡服務,是selinux的默認值;
stric: 提供RBAC的policy,具備完整的保護功能,保護網絡服務,一般指令及應用程序。
策略改變後,需要重新啓動計算機。
也可以通過命令來修改相關的具體的策略值,也就是修改安全上下文,來提高策略的靈活性。

3.策略的位置
/etc/selinux/<策略名>/policy/

1.2 SElinux命令介紹
1.2.1 查詢SElinux狀態命令
1.查詢selinux狀態
[root@redhat ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted

2.查詢selinux激活狀態
[root@redhat ~]# selinuxenabled
[root@redhat ~]# echo $?
0
如果爲-256爲非激活狀態。
1.2.2 切換SElinux類型
1.切換成警告模式
[root@redhat ~]# setenforce 0或setenforce permissive
[root@redhat ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted

[root@redhat ~]# getenforce
Permissive

2.切換成強制模式
[root@redhat ~]# setenforce 1
[root@redhat ~]# getenforce
Enforcing
注:使用setenforce切換enforcing與permissive模式不需要重啓計算機。
1.2.3 檢查安全上下文
1.檢查帳號的安全上下文
[root@redhat ~]# id -Z
root:system_r:unconfined_t:SystemLow-SystemHigh

2.檢查進程的安全上下文
[root@redhat home]# ps -Z
LABEL PID TTY TIME CMD
root:system_r:unconfined_t:SystemLow-SystemHigh 2383 pts/0 00:00:00 bash
root:system_r:unconfined_t:SystemLow-SystemHigh 2536 pts/0 00:00:00 ps

3.檢查文件與目錄的安全上下文
[root@redhat home]# ls -Z
drwx------ tom tom system_u:object_r:user_home_dir_t tom
1.2.4 修改文件/目錄安全上下文與策略
1.chcon命令
chcon -u [user] 對象
-r [role]
-t [type]
-R 遞歸
示例:
chcon -R -t samba_share_t /tmp/abc
注:安全上下文的簡單理解說明,受到selinux保護的進程只能訪問標識爲自己只夠訪問的安全上下文的文件與目錄。
例如:上面解釋爲使用smb進程能夠訪問/tmp/abc目錄而設定的安全上下文。

2.getsebool命令
獲取本機selinux策略值,也稱爲bool值。
getsebool -a 命令同sestatus -b
[root@redhat files]# getsebool -a
NetworkManager_disable_trans --> off
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
allow_daemons_use_tty --> off
allow_execheap --> off
allow_execmem --> on
allow_execmod --> off
allow_execstack --> on
allow_ftpd_anon_write --> off /是否允許ftp匿名訪問/
allow_ftpd_full_access --> off
...
httpd_disable_trans --> off /只要有disable_trans關閉保護/

說明:selinux的設置一般通過兩個部分完成的,一個是安全上下文,另一個是策略,策略值是對安全上下文的補充。

3.setsebool命令
setsebool -P allow_ftpd_anon_write=1
-P 是永久性設置,否則重啓之後又恢復預設值。
示例:
[root@redhat files]# setsebool -P allow_ftpd_anon_write=1
[root@redhat files]# getsebool allow_ftpd_anon_write
allow_ftpd_anon_write --> on
說明:如果僅僅是安全上下文中設置了vsftpd進程對某一個目錄的訪問,配置文件中也允許可寫,但是selinux中策略中不允許可寫,仍然不可寫。所以基於selinux保護的服務中,安全性要高於很多。

1.3 SElinux應用
selinux的設置分爲兩個部分,修改安全上下文以及策略,下面收集了一些應用的安全上下文,供配置時使用,對於策略的設置,應根據服務應用的特點來修改相應的策略值。
1.3.1 SElinux與samba
1.samba共享的文件必須用正確的selinux安全上下文標記。
chcon -R -t samba_share_t /tmp/abc
如果共享/home/abc,需要設置整個主目錄的安全上下文。
chcon -R -r samba_share_t /home
2.修改策略(只對主目錄的策略的修改)
setsebool -P samba_enable_home_dirs=1
setsebool -P allow_smbd_anon_write=1
getsebool 查看
samba_enable_home_dirs -->on
allow_smbd_anon_write --> on /允許匿名訪問並且可寫/

1.3.2 SElinux與nfs
selinux對nfs的限制好像不是很嚴格,默認狀態下,不對 nfs的安全上下文進行標記,而且在默認狀態的策略下,nfs的目標策略允許nfs_export_all_ro
nfs_export_all_ro
nfs_export_all_rw 值爲0
所以說默認是允許訪問的。
但是如果共享的是/home/abc的話,需要打開相關策略對home的訪問。
setsebool -P use_nfs_home_dirs boolean 1
getsebool use_nfs_home_dirs

1.3.3 SElinux與ftp
1.如果ftp爲匿名用戶共享目錄的話,應修改安全上下文。
chcon -R -t public_content_t /var/ftp
chcon -R -t public_content_rw_t /var/ftp/incoming

2.策略的設置
setsebool -P allow_ftpd_anon_write =1
getsebool allow_ftpd_anon_write
allow_ftpd_anon_write--> on

1.3.4 SElinux與http
apache的主目錄如果修改爲其它位置,selinux就會限制客戶的訪問。
1.修改安全上下文:
chcon -R -t httpd_sys_content_t /home/html
由於網頁都需要進行匿名訪問,所以要允許匿名訪問。
2.修改策略:
setsebool -P allow_ftpd_anon_write = 1
setsebool -P allow_httpd_anonwrite = 1
setsebool -P allow
<協議名>_anon_write = 1
關閉selinux對httpd的保護
httpd_disable_trans=0

1.3.5 SElinux與公共目錄共享
如果ftp,samba,web都訪問共享目錄的話,該文件的安全上下文應爲:
public_content_t
public_content_rw_t
其它各服務的策略的bool值,應根據具體情況做相應的修改。

1.3.6 SElinux配置總結
以上內容的selinux的配置實驗還需要進行相關驗證,以便在實際環境中能夠直接應用,相關的內容還需要繼續補充。
對於多於牛毛的策略,可以用過濾還查看一個服務相當開啓哪些策略。

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