SELinux學(xué)習(xí)筆記

SELinux學(xué)習(xí)筆記

主要參考了《Linux就該這么學(xué)》、《鳥哥的Linux私房菜——基礎(chǔ)學(xué)習(xí)篇(第四版)》、《SELinux 入門》、《Selinux安全上下文詳解》、《SELINUX工作原理詳解》,感覺這部分內(nèi)容還是鳥哥寫的比較清楚,感覺劉遄在《Linux就該這么學(xué)》及其視頻中講的不夠清晰,如果只聽劉老師的課可能還是會對這部分知識有些迷茫的。

安全增強的Linux(Security Enhanced Linux,SELinux)是由美國國家安全局(National Security Agency,NSA)貢獻的一個Linux內(nèi)核模塊,主要用于Redhat及其衍生版本中,為整個系統(tǒng)提供更加健壯的安全服務(wù)(Ubuntu中使用的是AppArmor,據(jù)說雖然可以在Ubuntu及其衍生版本中安裝SELinux,但是其難度極大)。之所以開發(fā)這個模塊,是因為NSA發(fā)現(xiàn)在系統(tǒng)的安全問題中,絕大多數(shù)問題并不是由于外部的攻擊多么強大,更多的問題是由于所謂的內(nèi)部員工的資源誤用。

例如,在Apache中,默認的服務(wù)目錄是/var/www/html,如果一個無經(jīng)驗的系統(tǒng)運維人員(糊涂蛋)在運維過程中,將其權(quán)限設(shè)置為777,那么所有的進程都可以在該目錄中進行讀寫,這將造成極大的安全隱患。

1. MAC與DAC

自主訪問控制(Discretionary Access Control,DAC):所謂DAC主要是指在沒有啟用SELinux的Linux系統(tǒng)中,系統(tǒng)會依據(jù)資源的rwx權(quán)限以及用戶身份(進程所有者)來判斷是否具有資源訪問的權(quán)限。使用DAC的缺點在于:

  • root具有最高權(quán)限:對于root用戶而言,其具有系統(tǒng)最高的權(quán)限,因此各種rwx設(shè)置對于root用戶而言形同虛設(shè)。
  • 用戶可以獲取進程修改文件資源的訪問權(quán)限:如果將某個資源的權(quán)限設(shè)置為777,那么該目錄可以被任何用戶讀寫操作

強制訪問控制(Mandatory Access Control,MAC)是一種可以針對特定的進程文件資源來進行權(quán)限的權(quán)限。因此當(dāng)你即便擁有了root權(quán)限,但是當(dāng)你執(zhí)行特定的進程時,也未必擁有相應(yīng)的讀寫權(quán)限。而SELinux采用的正是MAC方式。

簡單而言,在DAC中控制的主體(subject)是用戶,而MAC中控制的對象是進程。

2. SELinux的啟動、關(guān)閉與查看

SELinux有三種模式:

  • Enforceing:強制模式,SELinux啟用
  • Permissive:寬容模式,SELinux的安全策略不強制執(zhí)行,但是會有相應(yīng)的警告信息記錄到日志文件中,一般用于SELinux的調(diào)試
  • Disabled:關(guān)閉模式

查看

要查看SELinux的運行狀態(tài),需要使用如下命令:

getenforce

或者

sestatus

使用sestatus命令除了可以查看當(dāng)前SELinux的運行模式外,還能看到很多額外的信息。

修改

修改SELinux的運行模式,主要有兩種方法,一種是用命令行,另外一種是直接修改SELinux的配置文件。

命令行的方式只能修改為Enforce和Permissive,不能進行關(guān)閉,其命令格式為:

setenforce [0|1]

其中1為enforcing模式,0為permissive模式

要想關(guān)閉SELinux,只能修改SELinux的配置文件,其位置為/etc/selinux/config

打開該文件后,可以看到其中只有兩行信息:

SELINUX=enforcing
SELINUXTYPE=targeted

我們只要將SELINUX行設(shè)置為對應(yīng)模式即可,需要注意的是如果從enforcing或permissive模式切換為disabled模式,或者反過來,則需要重啟系統(tǒng)(從disabled模式修改為其他兩種模式時,需要重啟兩次,因為要重新寫入上下文信息)才能生效。在disabled模式下,無法使用setenforce命令。

在某些特殊情況下,從disable切換為enforcing模式,可能會導(dǎo)致大量服務(wù)無法順利啟動,但是使用permissive模式就不會有這種問題,要想解決這個問題就需要在permissive模式下,使用如下命令來重新還原所有的SELinux類型。

resotrecon -Rv /

3. SELinux的策略

在SELinux中默認有三種策略,如果你認真看了上面提到的/etc/selinux/config文件,就會看到這三種策略,同時也一定清楚該如何切換SELinux的安全策略,這三種策略分別是:

  • targeted:針對網(wǎng)絡(luò)服務(wù)(如dhcpd、httpd、named、nscd、ntpd、portmap、snmpd、squid以及 syslogd等)的限制較多,針對本機的限制較少,是默認的策略
  • minimum:修改自targeted策略,只針對選擇的進程進行保護
  • mls:多層的安全防護,使用完整的SELinux限制

需要注意的是,如果要修改SELinux的防護策略,必須要對系統(tǒng)進行重啟。

要想查看安全策略的具體內(nèi)容,可以使用命令:

getsebool -a

要想修改具體的策略規(guī)則,則需要使用如下命令:

setsebool   -P <策略項>

-P表示重啟之后仍然有效。

4. 安全上下文

安全上下文是一個簡單的、一致的訪問控制屬性,在SELinux中,類型標識符是安全上下文的主要組成部分,由于歷史原因,一個進程的類型通常被稱為一個域(domain),"域"和"域類型"意思都一樣,我們不必苛刻地去區(qū)分或避免使用術(shù)語域,通常,我們認為【域】、【域類型】、【主體類型】和【進程類型】都是同義的,即都是安全上下文中的“TYPE”。

——《SELINUX工作原理詳解》

我理解所謂安全上下文(Security Context)就是一種面向進程的讀寫權(quán)限管理,任何一個進程想要訪問一個資源,首先都需要經(jīng)過SELinux的安全策略檢驗,之后需要經(jīng)過安全上下文的比對,最后需要經(jīng)過文件rwx權(quán)限**的檢驗才能最終確認是否可以對資源進行訪問。

要想查看上下文可以用三種方法:

  • 查看Shell的上下文:id -Z
  • 查看進程的上下文:ps -Z
  • 查看文件的上下文:ls -Z

安全上下文是存放在文件的inode內(nèi)的,其主要由三部分組成:

Identify:Role:Type/Domain

4.1 Identify

Identity用來標識身份,一般以_u結(jié)尾,常見的身份識別主要由以下幾種:

  • unconfined_u:不受限的用戶,也就是說該文件來自于不受限的進程
  • system_u:系統(tǒng)用戶

4.2 Role

通過Role字段我們可以知道這個數(shù)據(jù)是屬于進程、文件資源還是代表用戶,通常以-r結(jié)尾,常見的角色有:

  • object_r:代表的是文件或目錄等資源
  • system_r:代表的就是進程和用戶

4.3 Type

在默認的targeted策略中,Identify和Role都不重要,重要的是Type這個類型?。?!一個進程能不能訪問這個資源,主要就是取決于Type類型。該字段在文件與進程之間又有所區(qū)別:

  • type:在文件資源上(也就是ls -Z中看到的)稱為類型(Type)
  • domain:在主體進程(Subject,應(yīng)該就是在ps -Z)稱為域(Domain)

只有當(dāng)domain與type對應(yīng),才能對資源進行訪問。

4.4 例子

為了更好的理解這句話,我們來看《鳥哥Linux私房菜》上的一個例子

首先我們來看一下crond這個進程的安全上下文:

ps -eZ | grep crond 

其結(jié)果為:

system_u:system_r:crond_t:s0-s0:c0.c1023 1061 ? 00:00:00 crond
system_u:system_r:crond_t:s0-s0:c0.c1023 1062 ? 00:00:00 atd

之后再來看一下執(zhí)行文件和配置文件的安全上下文:

[root@localhost etc]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond

我們可以看到,當(dāng)運行程序/usr/sbin/crond后,其程序的domain為crond_t,它能夠讀取具有system_cron_spool_t這種type的文件。

4.5 安全上下文的修改

要想修改SELinux文件的類型,主要有兩種方法:

4.5.1 chcon

第一種方法就是使用chcon,該命令格式為

chcon [-R] [-t <類型>] [-u <user>] [-r <role>] <文件>

或者

chcon -R --reference=<參考文件> <目標文件>

其參數(shù)含義為:

  • -R:連同子目錄一起進行修改
  • -t:修改Type
  • -u:修改Identify
  • -r:修改Role
  • -v:如果修改成功,會將變動的結(jié)果列出來
  • --reference:參考文件,用參考文件的type修改目標文件的type

4.5.2 semanage

第二種方法就是使用semanage命令,該命令的格式為:

semanage fcontext -a -t <類型> <文件>
restore -Rv <文件>

這種方法是《Linux就該這么學(xué)》中教授的,顯然這種方法要更復(fù)雜一些,而且有一些弊端(也許算不上弊端),這個我們后面再說,所以我個人更推薦第一種方法。

4.5.3 restorecon

如果使用了chcon命令來修改文件的上下文,那么是可以使用restorecon命令來進行恢復(fù)的,其命令格式我們其實剛剛已經(jīng)見過了:

restorecon [-Rv] 文件/文件夾

既然是可以恢復(fù),那么就說明在SELinux中,有個存儲所有文件默認type的位置。仔細思考一下,我們就能知道,使用semanage命令修改的是SELinux中的默認值,所以要在修改后執(zhí)行一下restorecon命令。所以個人建議在修改文件的type信息時,盡量使用chcon而不要使用semenage,除非你真的知道你自己在做什么!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容