linux 敏感标记 权限,闲话Linux系统安全(二)——强制访问控制(MAC)
安全秘笈第二式——不安全的特殊權限和強制訪問控制(MAC)
在DAC的機制中,不管是所有權加權限的管理辦法,還是文件系統訪問控制列表(facl),都是非常強大的訪問控制機制,均可以對文件資源進行比較有效的訪問控制。但DAC的自主性太強,可以說文件資源的安全在很大的程度上取決于使用者個人的意志,因此這種安全似乎就被主觀化了。尤其是對于root用戶而言,不管是權限和所有權的限制,還是facl的管理控制,都僅僅能夠限制root的誤操作而已。
在CentOS或RHEL系統中,每一個服務都需要以守護進程的方式運行起來并在后臺監聽指定的套接字,比方說:實現DNS服務的bind軟件需要一個名為named系統用戶啟動名為named的守護進程;MySQL服務的啟動也需要一個名為mysql的系統用戶來啟動一個名為mysqld的守護進程,等等。如果類似這樣的網絡服務的TCP或UDP的會話被***者劫持,那么***者就可以冒用這些系統用戶的身份。有人會說,沒有什么大不了的嘛,這些連系統都無法登錄的系統用戶被劫持了也不會有什么危險啊。但是請記住,在CentOS或RHEL的文件系統中有三個特殊權限,即:SUID、SGID和Sticky,其中SGID如果設置在目錄上,則在該目錄中創建的所以新文件的屬組都是從該目錄上繼承的該目錄的屬組;如果設置在文件上,則在該目錄中如果包含了可執行文件的話,無論是誰發起的執行進程,改進程的屬組都是該目錄的屬組。Sticky也被翻譯為“粘滯位”,只能設置在目錄上。凡是被設置了粘滯位的目錄,即便用戶對該目錄有所以的rwx的權限,也只能管理屬主是其自身的那些文件,禁止了對屬主不為自己的所以文件的修改和刪除等寫操作。可以說這兩個特殊權限還是有一定的方便管理和安全保證作用的。
但是,SUID可是一把非常鋒利的雙刃劍,用好了,方便管理所向披靡;用不好,那可就是為他人做嫁衣而置自己于死地了。
為什么這么說呢?我們一起來分析一下SUID這個特殊權限位。SUID只能設置在二進制文件上,也就是在CentOS或RHEL中的具有ELF可執行權限的二進制文件,我們所編寫的shell腳本一般是無法設置這個權限的,這是一個很嚴格的限制。一旦在可執行的二進制文件上添加了SUID,則所有用戶在執行這個程序以后,都是以這個文件的所有者的身份來進行。現在大家明白了么?在CentOS或RHEL中,根文件系統下的文件的屬主絕大多數都是root,包括那些二進制文件,所以不管你是什么用戶,一旦執行了設置了SUID的二進制文件,也就意味著能夠以root用戶的身份操縱這個二進制文件去訪問所有屬主為root的文件了。所以即便是無法登錄到系統的系統用戶,一旦因為這樣的問題而獲得root的身份之后,仍然可以為所欲為的。
比如說,CentOS或RHEL中的DNS服務在運行過程中,其進程會話被劫持,也就意味著***者已經獲得了named用戶的身份。此時,如果***者以named用戶的身份,在/var/named/slaves目錄中上傳了一個帶有SUID權限的二進制程序vim,這個vim跟系統中的vim是一模一樣的,所需要的庫也是一模一樣的。于是,每次執行這個vim文件來查看系統中的其他文本文件的時候,都好像是root用戶在執行這樣的操作,那么接下來修改將文件修改成什么樣子其實就看***者的心情了。
說了這么多,其實主要是想說明這樣一個問題:傳統的DAC固然能夠有效的控制文件的訪問,但是無法解決因為SUID等因素導致的root身份盜用帶來的問題。
鑒于此,在防止root用戶對資源誤操作和權限濫用的問題上,就迫切需要行之有效的管理辦法或解決方案,以增強系統的安全性和資源訪問的安全性。
人們首先在文件系統上打起了主意。文件系統中被引入了一個新的掛載選項——nosuid,該選項不允許非root用戶向文件系統中復制帶有SUID的權限的文件,從而在一定程度上保證了root身份盜用的問題。但是這仍然是治標不治本的方法,最最核心的問題是root權限太大的問題。
于是,人們提出了強制訪問控制(Mandatory Access Control——MAC,以下簡稱MAC)這一安全概念。MAC最早主要用于軍方的應用中,通常與DAC結合使用。
首先讓我們來了解兩個至關重要的術語:
主體:
通常指用戶,或由用戶發起運行的進程或用戶正在使用的設備。主體主動發起對資源的訪問,它是系統中信息流的啟動者。
客體:
通常是指信息的載體或從其他主體或客體接收信息的實體。主體有時也會成為訪問或受控的對象,如一個主體可以向另一個主體授權,一個進程可能控制幾個子進程等等,這時受控的主體或子進程也通常被認為是一種客體。
MAC是利用策略將訪問控制規則“強加”給訪問主體的,即系統強制主體服從訪問控制策略。MAC的主要作用對象是所有主體及其所操作的客體(如:進程、文件等)。MAC為這些主體及其所操作的客體提供安全標記,這些標記是實施強制訪問控制的依據。
系統通過比較主體和客體的安全標記來判斷一個主體是否能夠訪問其要操作的客體。用戶發起的進程無法改變其自身及其它客體的安全標記,利用這樣的機制,系統可以比較有效地防止特洛伊******以及root身份冒用或盜用等安全威脅。
MAC一般與DAC共同使用,兩種訪問控制機制的過濾結果將累積,以此來達到更佳的訪問控制效果。也就是說,一個主體只有通過了DAC限制檢查與MAC限制檢查的雙重過濾裝置之后,才能真正訪問某個客體。一方面,用戶可以利用DAC來防范其它用戶對那些所有權歸屬于自己的客體的***;另一方面,由于用戶不能直接改變MAC屬性,所以MAC提供了一個不可逾越的、更強的安全保護層以防止其它用戶偶然或故意地濫用DAC。
MAC的強制訪問策略為每個用戶、進程及文件賦于一個安全訪問級別,即:
最高秘密級(Top Secret,一般標記為T);
秘密級(Secret,一般標記為S);
機密級(Confidential,一般標記為C);
無級別級(Unclassified,一般標記為U);
其級別為從高到低依次為:T>S>C>U,系統根據主體和客體的敏感標記來決定訪問模式。通常情況下,訪問模式包括:
下讀(read down):用戶級別大于文件級別的讀操作;
上寫(Write up):用戶級別小于文件級別的寫操作;
下寫(Write down):用戶級別大于文件級別的寫操作;
上讀(read up):用戶級別小于文件級別的讀操作;
依據Bell-Lapadula安全模型所制定的原則是:利用不上讀/不下寫來保證數據的保密性。即不允許低訪問級別的用戶讀高訪問級別的信息,也不允許高訪問級別的信息寫入低訪問級別區域,禁止信息從高訪問級別流向低訪問級別。MAC通過這種梯度安全標簽實現信息的單向流通。
依據Biba安全模型所制定的原則是:利用不下讀/不上寫來保證數據的完整性。在實際應用中,完整性保護主要是為了避免應用程序修改某些重要的系統程序或系統數據庫。
可能大家覺得我這里說的是天花亂墜,真的有這么神奇么?答案是肯定的。在MAC理論出現后不久,很多人和團體本著這個目的開始研究用于實現強制訪問控制的安全模塊。美國國家安全局(NSA,The National Security Agency)和(SCC,Secure Computing Corporation)在Linux社區的幫助下開發了這樣一個強制訪問控制的安全模塊,在2000年時,以GNU GPL發布,Linux內核2.6版本后集成在內核中。這個安全模塊通常被人們稱為SELinux,即(Secure Enhanced Linux,安全增強的Linux)。
SELinux有三種工作模式:
Enforcing——強制模式
表示SELinux正在運行,已經開始執行策略中的規則,并且開始正確的限制domain/type了
Permissive——警告模式(運用排錯中)
表示SELinux正在運行,不過僅會有警告信息并不會實際限制domain/type的存取。這種模式作為SELinux的debug之用
Disabled——禁用模式
表示SELinux已經關閉,SELinux并沒有實際運行。
注意:從強制模式切換到禁用模式,或者禁用模式切換到強制模式,都必須等到計算機下次啟動的時候才會生效。但是強制模式和警告模式在切換時,立刻生效。
SELinux有四種可選的策略結果集:
strict:這種策略結果集主要應用于RHEL5和Centos5,系統中的每個進程都受到SELinux的控制。
targeted: 這種策略結果集主要用來保護常見的網絡服務,SELinux僅對有限進程進行控制,也只監控容易被***的進程,RHEL4中只保護13個服務,RHEL5保護88個服務。
minimum:這種策略結果集主要應用于Centos7,這是修改過的targeted,只對選擇的網絡服務進行限制和保護。
mls: 這種策略結果集主要提供MLS(多級安全)機制的安全性保證。
在/etc/selinux/config文件中定義了該操作系統中SELinux的工作模式以及SELinux所支持使用的策略結果集:
CentOS5.11系統:#?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
#?SELINUXTYPE=?type?of?policy?in?use.?Possible?values?are:
#????targeted?-?Only?targeted?network?daemons?are?protected.
#????strict?-?Full?SELinux?protection.
SELINUXTYPE=targeted
CentOS6.8系統中:#?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
#?SELINUXTYPE=?can?take?one?of?these?two?values:
#?????targeted?-?Targeted?processes?are?protected,
#?????mls?-?Multi?Level?Security?protection.
SELINUXTYPE=targeted
CentOS7.2系統中:#?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
#?SELINUXTYPE=?can?take?one?of?three?two?values:
#?????targeted?-?Targeted?processes?are?protected,
#?????minimum?-?Modification?of?targeted?policy.?Only?selected?processes?are?protected.
#?????mls?-?Multi?Level?Security?protection.
SELINUXTYPE=targeted
通過對比,我們可以發現,在不同的CentOS的發行版本中,如果我們按照默認的配置安裝系統,那么SELinux在系統中就是工作在強制模式(enforcing)下;另外,雖然各個發行版CentOS所支持的SELinux的策略結果集的種類和數量不盡相同,但是默認的策略結果集都是targeted。因為strict策略結果集過于嚴格而顯得不靈活,minimum策略結果集和mls策略結果集穩定性不足,所以均未加以應用。
只要SELinux的工作模式是Enforcing,根據SELinux所選擇的策略結果集,給所有文件和進程都打上安全標簽,即:安全上下文(security context)。這一行為是在將SELinux的模式由disabled模式更改為enforcing模式后的第一次啟動時完成的。
安全上下文由五個元素組成:user:role:type:sensitivity:category。
user:指示登錄系統的用戶類型,如:root,user_u,system_u,多數本地進程都屬于自由(unconfined)進程;
role:定義文件、進程和用戶的用途,如:文件:object_r,進程和用戶:system_r;
type:指定主體和客體的類型,規則中定義何種進程域訪問何種文件類型,targeted策略結果集基于type實現,如:admin_home_t,public_content_t(多服務共用);
sensitivity:限制訪問的需要,由組織定義的分層安全級別,如:unclassified,confidential ,secret,top secret, 一個對象有且只有一個sensitivity,分0-15級,s0最低,targeted策略結果集默認使用s0;
category:對于特定組織劃分不分層的分類,如:FBI Secret,NSA secret,一個對象可以有多個categroy,c0-c1023共1024個分類,targeted 策略結果集不使用category。
實際上下文:存放在文件系統中,但在CentOS5系列發行版本中,只是標識了前三個元素,在后續的CentOS6和CentOS7系列發行版本中也只是標識了前四個元素。而標識歸標識,真正起作用的也只有第三個字段,該字段對于文件來說稱為“類型”,對于進程來說稱為“域”。可以使用ls -Z命令來查看文件的安全上下文;可以使用ps -Z命令來查看進程的安全上下文:
在CentOS5.11中的查看/root目錄的結果:[root@CentOS511A?~]#?ls?-Z
-rw-------??root?root?system_u:object_r:user_home_t????anaconda-ks.cfg
-rw-r--r--??root?root?root:object_r:user_home_t????????install.log
-rw-r--r--??root?root?root:object_r:user_home_t????????install.log.syslog
在CentOS6.8中的查看/root目錄的結果:[root@Centos68A?~]#?ls?-Z
-rw-------.?root?root?system_u:object_r:admin_home_t:s0?anaconda-ks.cfg
-rw-r--r--.?root?root?system_u:object_r:admin_home_t:s0?install.log
-rw-r--r--.?root?root?system_u:object_r:admin_home_t:s0?install.log.syslog
在CentOS7.2中的查看/root目錄的結果:[root@Centos72A?~]#?ls?-Z
-rw-------.?root?root?system_u:object_r:admin_home_t:s0?anaconda-ks.cfg
我們可以發現,即便是CentOS5、6、7三個系列的發行版本中SELinux全都默認使用了targeted策略結果集,但是他們所應用的策略結果集其實是不同的。[root@CentOS511A?~]#?ls?/etc/selinux/targeted/policy/
policy.21[root@Centos68A?~]#?ls?/etc/selinux/targeted/policy/
policy.24[root@Centos72A?~]#?ls?/etc/selinux/targeted/policy/
policy.29
期望(默認)上下文:存放在二進制的SELinux策略結果集(映射目錄和期望安全上下文)中。
下面是在CentOS5.11、6.8、7.2上查看的默認上下文設置,只列舉了根的一級子目錄的相關內容,因內容太多,其余的均已省略。[root@CentOS511A?~]#?semanage?fcontext?-l
SELinux?fcontext??????????????type????????????Context
/.*?????????????????????all?files????system_u:object_r:default_t:s0
/xen(/.*)????????????????????all?files????system_u:object_r:xen_p_w_picpath_t:s0
/nsr(/.*)????????????????????all?files????system_u:object_r:var_t:s0
/mnt(/[^/]*)??????????????????symbolic?link??system_u:object_r:mnt_t:s0
/mnt(/[^/]*)??????????????????directory?????system_u:object_r:mnt_t:s0
/lib(64)?/dbus-1/dbus-daemon-launch-helper???regular?file????system_u:object_r:bin_t:s0
/lib/.*????????????????????all?files????system_u:object_r:lib_t:s0
/bin/.*????????????????????all?files?????system_u:object_r:bin_t:s0
/usr/.*????????????????????all?files????system_u:object_r:usr_t:s0
/var/.*????????????????????all?files????system_u:object_r:var_t:s0
/dev/.*???????????????????all?files????system_u:object_r:device_t:s0
/etc/.*????????????????????all?files?????system_u:object_r:etc_t:s0
/opt/.*????????????????????all?files????system_u:object_r:usr_t:s0
/srv/.*????????????????????all?files????system_u:object_r:var_t:s0
/tmp/.*????????????????????all?files????<>
/sys/.*???????????????????all?files????<>
(……后續內容省略)[root@Centos68A?~]#?semanage?fcontext?-l
SELinux?fcontext???????????????type???????Context
/.*??????????????????????all?files????system_u:object_r:default_t:s0
/[^/]+?????????????????????regular?file????system_u:object_r:etc_runtime_t:s0
/a?quota\.(user|group)?????????????regular?file????system_u:object_r:quota_db_t:s0
/nsr(/.*)????????????????????all?files????system_u:object_r:var_t:s0
/sys(/.*)????????????????????all?files????system_u:object_r:sysfs_t:s0
/xen(/.*)????????????????????all?files????system_u:object_r:xen_p_w_picpath_t:s0
/mnt(/[^/]*)??????????????????symbolic?link??system_u:object_r:mnt_t:s0
/mnt(/[^/]*)??????????????????directory??????system_u:object_r:mnt_t:s0
/bin/.*????????????????????all?files????system_u:object_r:bin_t:s0
/dev/.*????????????????????all?files????system_u:object_r:device_t:s0
/lib/.*????????????????????all?files????system_u:object_r:lib_t:s0
/srv/.*????????????????????all?files????system_u:object_r:var_t:s0
/var/.*????????????????????all?files????system_u:object_r:var_t:s0
/tmp/.*????????????????????all?files????<>
/usr/.*????????????????????all?files????system_u:object_r:usr_t:s0
/opt/.*????????????????????all?files????system_u:object_r:usr_t:s0
/etc/.*????????????????????all?files????system_u:object_r:etc_t:s0
/root(/.*)???????????????????all?files????system_u:object_r:admin_home_t:s0
(……后續內容省略)[root@Centos72A?~]#?semanage?fcontext?-l
SELinux?fcontext???????????????type???????Context
/.*??????????????????????all?files????system_u:object_r:default_t:s0
/[^/]+?????????????????????regular?file????system_u:object_r:etc_runtime_t:s0
/a?quota\.(user|group)?????????????regular?file????system_u:object_r:quota_db_t:s0
/nsr(/.*)????????????????????all?files????system_u:object_r:var_t:s0
/sys(/.*)????????????????????all?files????system_u:object_r:sysfs_t:s0
/xen(/.*)????????????????????all?files????system_u:object_r:xen_p_w_picpath_t:s0
/mnt(/[^/]*)??????????????????symbolic?link??system_u:object_r:mnt_t:s0
/mnt(/[^/]*)??????????????????directory??????system_u:object_r:mnt_t:s0
/bin/.*????????????????????all?files????system_u:object_r:bin_t:s0
/dev/.*????????????????????all?files????system_u:object_r:device_t:s0
/opt/.*????????????????????all?files????system_u:object_r:usr_t:s0
/var/.*????????????????????all?files????system_u:object_r:var_t:s0
/srv/.*????????????????????all?files????system_u:object_r:var_t:s0
/usr/.*????????????????????all?files????system_u:object_r:usr_t:s0
/tmp/.*????????????????????all?files????<>
/run/.*????????????????????all?files????system_u:object_r:var_run_t:s0
/etc/.*????????????????????all?files????system_u:object_r:etc_t:s0
/lib/.*????????????????????all?files????system_u:object_r:lib_t:s0
/root(/.*)???????????????????all?files????system_u:object_r:admin_home_t:s0
(……后續內容省略)
經過上述在三個不同發行版本的CentOS系統中SELinux默認上下文的對比,我們發現:在CentOS5中,上下文的定義比較少而且不夠精細,而CentOS6和CentOS7相比較來說差別不大,而且類型更多,上下文的定義更明確了。
SELinux的策略結果集及策略結果集應用規則:
主體(subject):進程稱為主體
客體(object):所有可以讀取的對象,包括文件、目錄和進程,端口等。
安全策略:定義主體讀取對象的規則數據庫,規則中記錄了哪個類型的主體使用哪個方法讀取哪一個客體是允許還是拒絕的,并且定義了哪種行為是允許的或是拒絕的。
在Linux(如CentOS系列發行版Linux)系統中SELinux賦予所有的文件一個type的文件類型標簽,賦予所有的進程一個domain的標簽。domain標簽能夠執行的操作在安全策略中定義。當一個主體試圖訪問一個客體時,內核中的策略執行服務器將檢查AVC (Access Vector Cache,訪問矢量緩存)。在AVC中,主體和客體的權限被緩存(cached),查找“應用+文件”的安全環境。然后根據查詢結果進行允許訪問或拒絕訪問的判斷。
與SELinux相關命令:
獲取selinux當前狀態:[root@Centos68A?~]#?getenforce
Enforcing
查看selinux狀態:[root@Centos68A?~]#?sestatus
SELinux?status:?????????????????enabled
SELinuxfs?mount:????????????????/selinux
Current?mode:???????????????????enforcing
Mode?from?config?file:??????????enforcing
Policy?version:?????????????????24
Policy?from?config?file:????????targeted
設置SELinux的模式(強制模式和警告模式)[root@Centos68A?~]#?setenforce?{0|1}
注意:0:設置為permissive
1:設置為enforcing
給文件重新打安全標簽:[root@Centos68A?~]#?chcon?[OPTION]...?[-R]?[-u?USER]?[-r?ROLE]?[-t?TYPE]?FILE...
[root@Centos68A?~]#?chcon?[OPTION]...?[-R]?--reference=RFILE?FILE...
[root@Centos68A?~]#?mkdir?/test
[root@Centos68A?~]#?touch?/test/test.txt
[root@Centos68A?~]#?ls?-Z?/test
-rw-r--r--.?root?root?unconfined_u:object_r:default_t:s0?test.txt
[root@Centos68A?~]#?ls?-Z?anaconda-ks.cfg
-rw-------.?root?root?system_u:object_r:admin_home_t:s0?anaconda-ks.cfg
[root@Centos68A?~]#?chcon?-t?admin_home_t?/test/test.txt
[root@Centos68A?~]#?ls?-Z?/test
-rw-r--r--.?root?root?unconfined_u:object_r:admin_home_t:s0?test.txt
恢復目錄或文件默認的安全上下文:[root@Centos68A?~]#?restorecon?[-R]?/path/to/somewhere
查看默認的安全上下文:[root@Centos68A?~]#?semanage?fcontext?-l
添加默認安全上下文到策略結果集:[root@Centos68A?~]#?semanage?fcontext?-a?-t?httpd_sys_content_t?'/testdir(/.*)?'
[root@Centos68A?~]#?restorecon?-Rv?/testdir
[root@Centos68A?~]#?restorecon?-R?/test
[root@Centos68A?~]#?ls?-Z?/test
-rw-r--r--.?root?root?unconfined_u:object_r:default_t:s0?test.txt
從策略結果集中刪除默認安全上下文:[root@Centos68A?~]#?semanage?fcontext?-d?-t?httpd_sys_content_t?'/testdir(/.*)?'
查看端口標簽:[root@Centos68A?~]#?semanage?port?-l
添加端口:[root@Centos68A?~]#?semanage?port?-a?-t?http_port_t?-p?tcp?8090
刪除端口:[root@Centos68A?~]#?semanage?port?-d?-t?http_port_t?-p?tcp?8090
修改端口:[root@Centos68A?~]#?semanage?port?-m?-t?http_port_t?-p?tcp?8090
查看布爾型規則命令:[root@Centos68A?~]#?getsebool?[-a]?[boolean]
[root@Centos68A?~]#?semanage?boolean?-l
查看修改過的布爾值:[root@Centos68A?~]#?semanage?boolean?-l?-C
設置布爾型規則的布爾值的命令:[root@Centos68A?~]#?setsebool?[-P]?boolean?value(On或Off)
[root@Centos68A?~]#?setsebool?[-P]?boolean=value(0或1)
為了將SELinux違規操作的錯誤的信息寫入/var/log/message,要安裝下面的包:[root@Centos68A?~]#?yum?install?setroublesshoot*
安裝完成以后,需要重新啟動才能開啟setroublessshoot的功能。人為的制造幾次SELinux違規操作,之后可以使用下面的命令來查看結果:[root@Centos68A?~]#?grep?"setroubleshoot"/var/log/messages
根據日志中的內容執行下列命令即可:[root@Centos68A?~]#?sealert?-l?“UUID”
(待續……)
總結
以上是生活随笔為你收集整理的linux 敏感标记 权限,闲话Linux系统安全(二)——强制访问控制(MAC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql info commit_my
- 下一篇: 中用BBP公式计算_如何计算基础代谢率