■ 河南 劉京義
利用SELin ux(即Securit y Enhanced Linux,安全性增強(qiáng)的Linux)這一安全管理機(jī)制,就可以讓系統(tǒng)變得更加穩(wěn)固。SELinux擁有靈活和強(qiáng)制性的訪問控制機(jī)制,可以對(duì)訪問進(jìn)行徹底控制,對(duì)所有的文件,目錄以及端口的訪問,都是基于策略設(shè)置的,這些策略由管理員設(shè)定,普通用戶無權(quán)更改。
SELinux提供了兩種關(guān)閉方法,其一是臨時(shí)關(guān)閉,所謂臨時(shí)關(guān)閉,指的是并沒有真正關(guān)閉SELinux,僅僅對(duì)非法訪問進(jìn)行記錄。執(zhí)行“setenforce 0”命令即可。其二是永久關(guān)閉,方法是執(zhí)行“vi/etc/sysconfig/selinux”命令,在其中輸入“SELINUX=disabled”行,之后重啟系統(tǒng)即可。如果將其設(shè)置為“enforcing”,表示啟用SELinux。執(zhí)行“getenforce”命令,會(huì)顯示SELinux的狀態(tài),包括“enforcing”“permissive”和“disabled”。
SELinux對(duì)于用戶只賦予最小權(quán)限,用戶被劃分為不同的角色,不同的角色擁有不同的權(quán)限。即使對(duì)于Root用戶來說,當(dāng)其不在Sysadm_r角色中,同樣是不能執(zhí)行Sysadm_t管理操作的,即其無法擁有管理員權(quán)限。與之類似,SELinux對(duì)進(jìn)程只賦予最小運(yùn)行權(quán)限,這在SELinux中是非常重要的,其特點(diǎn)是對(duì)文件賦予名為Type的文件類型標(biāo)簽,對(duì)于進(jìn)程賦予名為Domain的標(biāo)簽,這樣的話,可以規(guī)定某個(gè)進(jìn)程只能執(zhí)行某類文件。
SELinux包括了的安全上下文(Security Conte、xt)和策略(Policy)組件,對(duì)于前者來說,由用戶,角色和類型構(gòu)成。對(duì)于后者來說,指的是控制規(guī)則,即允許哪些進(jìn)程可以訪問哪些資源。
安全上下文的格式由“user:role:type”三部分組成,其中的“user”用來提供身份識(shí)別,常見的“user”包括“user_u”(針對(duì)普通用戶),“system_u”(針對(duì)系統(tǒng)管理員)和“unconfined_u”(針對(duì)沒有做定義的用戶)。
文件與目錄的角色(role)通常稱之為“object_r”,程序的角色通常是“system_r”。
對(duì)于用戶的Role來說,不同的角色擁有不同的權(quán)限。用戶可以擁有多個(gè)Role,但是在同一時(shí)間內(nèi)只能扮演固定的Role。
類型(type)作用是將主體與客體劃分為不同的組,組的每個(gè)主體和系統(tǒng)中的客體定義了一個(gè)類型,為進(jìn)程運(yùn)行提供最低的權(quán)限環(huán)境。
例如,執(zhí)行“l(fā)s -Z test.txt”命令,可以查看指定文件的安全上下文信息。例如,返回“-rw-r--r--.root root unconfined_u:object_r:admin_home_t:s0 a.txt”,其中的“unconfined_u”表示的是預(yù)設(shè)的用戶,該參數(shù)主要用來確認(rèn)用戶身份類型,一般搭配角色使用。
“object_r”參數(shù)表示的是角色,普通文件和目錄都為該角色,“system_r”則一般為進(jìn)程的角色?!癮dmin_home_t”是SELinux中的類型信息,這里表示管理員的家目錄。
對(duì)于“user_home_dir_t”類型來說,表示普通用戶的家目錄。執(zhí)行“l(fā)s -Z -d/xxx/”命令,可以查看指定目錄的安全上下文信息,這里的目錄名為“xxx”。
根據(jù)SELinux的上下文信息,就可以確定標(biāo)文件的目錄能夠被哪些進(jìn)程和用戶進(jìn)行訪問。
要想修改SELinux上下文,可以使用“chcon”和“semanage”命令進(jìn)行修改,對(duì)于前者來說,雖然可以實(shí)現(xiàn)更改操作,但是對(duì)SELinux的規(guī)則庫沒有任何影響。例如,執(zhí)行“chcon -t var_t/etc/hosts”命令,可以對(duì)“/etc/hosts”文件的安全上下文進(jìn)行修改,將其類型由“net_conf_t”修改為“var_t”。執(zhí)行“chcon -R -t samba_share_t/tmp/data”命令,可以對(duì)“/tmp/data”目錄進(jìn)行遞歸操作,將其中的所有文件的安全上下文類型修改為“samba_share_t”,這樣“smb”進(jìn)程就可以訪問/tmp/data”目錄中的所有文件了。
例如,對(duì)于Apache服務(wù)來說,在“/var/www/html/”目錄下存在“test.html”這個(gè)文件,之后從“/root”目錄下將“hello.html”文件移動(dòng)到上述路徑下,進(jìn)入“/var/www/html/”,執(zhí)行“l(fā)l-Z hello.html test.html”命令,可以看到這兩個(gè)文件的安全上下文信息是不同的,分別為“admin_home_t”和“httpd_sys_content_t”。因?yàn)楫?dāng)執(zhí)行文件移動(dòng)操作時(shí),其安全上下文是不變的。對(duì)于“httpd_sys_content_t”類型的文件來說,允許httpd進(jìn)程對(duì)其進(jìn)行訪問。而對(duì)于“admin_home_t”類型的文件來說,httpd進(jìn)程是無法訪問的。
這樣,在開啟了SELinux的情況下,執(zhí)行“service httpd start”命令啟動(dòng)Web服務(wù)后,當(dāng)從瀏覽器輸入實(shí)際路徑來訪問這兩個(gè)文件時(shí),可以訪問“test.html”文件的內(nèi)容,但是卻無法訪問“hello.html”的內(nèi)容。執(zhí)行“chcon --reference=/var/www/html//var/www/html/hello.html”命令,將“hello.html”的安全上下文類型修改為“httpd_sys_content_t”,這樣就可以正常訪問“hello.html”文件了。
也可以執(zhí)行“chcon -t httpd_sys_content_t/var/www/html/hello.html”命令,也可以將其上下文標(biāo)簽修改為“httpd_sys_content_t”類型,實(shí)現(xiàn)同樣的效果。當(dāng)然,也可以執(zhí)行“chcon -t -r httpd_sys_content_t/webapp/”命令,將指定目錄下的所有文件的安全上下文類型修改為“httpd_sys_content_t”。如果使用CP命令,將“/root”目錄下的“welcome.html”文件復(fù)制到“/var/www/html/”目錄下,該文件的安全上下文會(huì)自動(dòng)會(huì)改變?yōu)槟繕?biāo)目錄的類型,這樣就可以順利進(jìn)行訪問了。
在設(shè)置SELinux上下文信息時(shí),如果出現(xiàn)問題需要重新恢復(fù)的話,可以使用Restorecon命令來實(shí)現(xiàn),該命令用來恢復(fù)檔案目錄的預(yù)設(shè)的安全上下文。既然要進(jìn)行恢復(fù),就需要依據(jù)預(yù)設(shè)的規(guī)則。執(zhí)行“vim/etc/selinux/targeted/contexts/files/file_contexts”命令,在規(guī)則文件中顯示不同文件的目錄擁有的預(yù)置的安全上下文信息。在上述路徑中的“file_contexts.local”文件中也包含了預(yù)設(shè)的安全上下文信息,通過查看上述兩個(gè)文件,可以了解系統(tǒng)中保存好的規(guī)則。
例如,執(zhí)行“restorecon-R/webapp/”命令,來恢復(fù)制定目錄下所有文件的默認(rèn)的安全信息,例如“system_u:object_r:default_t:s0”等。之所以可以恢復(fù)默認(rèn)的上下文,說明使用“chcon”命令實(shí)際上無法真正更改SELinux的規(guī)則庫信息,為了防止隨意恢復(fù)SELinux安全上下文,可以使用semanage”命令來實(shí)現(xiàn)。
例如執(zhí)行“semanage fcontext -a -t httpd_sys_content_"/webapp(/.*)?"”命令,就可以將目標(biāo)目錄(例如“/webapp”)的安全上下文類型修改為“httpd_sys_content_t”。
當(dāng)然,按照這種格式,可以設(shè)置任意格式的SELinux安全上下文類型。之后執(zhí)行“restorecon -vvR/webapp/”命令,就可以讓上述修改動(dòng)作生效,讓指定目錄真正擁有指定的安全規(guī)則。
使用上面談到的方法,雖然可以更改SELinux安全規(guī)則,不過操作起來很麻煩。在RedHat7中,提供了一些布爾變量,可以快速啟用和禁用對(duì)應(yīng)的安全規(guī)則。執(zhí)行“getsebool -a |wc -l”命令,顯示布爾變量的數(shù)量信息。執(zhí)行“getsebool -a”命令,可以顯示所有的布爾變量。在對(duì)應(yīng)布爾變量的右側(cè)如果顯示為“off”,表示其處于禁用狀態(tài),顯示為“on”,表示處于激活狀態(tài)。
當(dāng)然,用戶可以根據(jù)需要來靈活調(diào)整。例如,執(zhí)行“getsebool -a | grep ftp”命令,可以查看和FTP相關(guān)的布爾變量。執(zhí)行“setsebool ftpd_use_nfs=1”命令,激活“ftpd_use_nfs”安全規(guī)則,允許FTP使用NFS網(wǎng)絡(luò)共享。
注意,這種修改方式只是臨時(shí)生效的。執(zhí)行“setsebool -P ftpd_use_nfs=1”命令,可以實(shí)現(xiàn)永久修改。
例如,當(dāng)啟用了FTP服務(wù)后,進(jìn)入“/etc/vsftpd”目錄,執(zhí)行“vim vsftpd.conf”命令,打開vsFTP配置文件。在“anonymous=”欄中可以設(shè)置是否開啟匿名用戶。在“anon_upload_enable=”欄中設(shè)置是否允許匿名用戶上傳文件。對(duì)該配置文件進(jìn)行修改,雖然可以允許匿名用戶進(jìn)行登錄并下載文件,但是是不允許上傳文件的。利用SELinux機(jī)制,可以打破這一限制。
執(zhí)行“chcon -t public_content_rw_t/var/ftp/pub/”命令,修改指定FTP目錄的安全上下文類型。
執(zhí)行“setsebool-P allow_ftpd_anon_write=on”命令,將“allow_ftpd_anon_write”的值設(shè)置為“on”,其中的“-P”參數(shù)表示執(zhí)行永久性設(shè)置,防止重啟系統(tǒng)之后恢復(fù)其預(yù)設(shè)值?!癮llow_ftpd_anon_write”是針對(duì)允許匿名FTP賬戶是否可以寫操作的項(xiàng)目,將其設(shè)置為“on”,可以讓FTP匿名用戶上傳文件。
另外,在默認(rèn)情況下,如果使用本地賬戶登錄FTP服務(wù),是可以自動(dòng)切換自己的Home目錄。但是當(dāng)開啟SELinux后,是不允許進(jìn)行切換和上傳文件的。執(zhí)行“setsebool -P ftp_home_dir=on”命令,可以解除這一限制。
在使用SELinux保護(hù)系統(tǒng)時(shí),如果遇到問題的話,可以執(zhí)行“sealert -a/var/log/audit/audit.log”命令,對(duì)SELinux的活動(dòng)信息進(jìn)行分析,就可以找到解決策略,其中的“audit.log”為SELinux的審計(jì)日志文件。當(dāng)其分析完畢后,在返回信息的底部的“Raw Audit Message”欄中會(huì)顯示最近有關(guān)SELinux的警告信息。例如,因?yàn)锳pache的網(wǎng)頁目錄文件安全配置信息異常導(dǎo)致的錯(cuò)誤等。在該分析報(bào)告中會(huì)給出具體的解決方法,例如提示用戶執(zhí)行“grep httpd/var/log/audit/audit.log | audit2allow-M mypol”和“semodule -i mypol”命令,就可以解決問題。
對(duì)于端口安全來說,不僅可以使用防火墻進(jìn)行控制,在RedHat7中還可以使用SeLinux,對(duì)端口打上安全標(biāo)簽,將端口配置信息固定下來,不允許隨意綁定端口。
例如,執(zhí)行“vi/etc/ssh/sshd/sshd_config”命令,將其中的“port”項(xiàng)的值修改為“9789”,將SSH連接端口進(jìn)行了調(diào)整。
之后執(zhí)行“systemctl restart sshd”命令,來重啟SSH服務(wù)。雖然系統(tǒng)沒有提示,但是該服務(wù)其實(shí)并沒有啟動(dòng)。
執(zhí)行“systemctl status sshd”命令,可以看到系統(tǒng)提示該服務(wù)沒有正常啟動(dòng)。執(zhí)行“tail/var/log/secure”命令,可以看到具體的錯(cuò)誤信息,提示沒有權(quán)限綁定修改后的端口。
執(zhí)行“journalctl -xn status sshd”命令,也可以看到相關(guān)的錯(cuò)誤信息。這其實(shí)就是SELinux在發(fā)揮作用,為了讓上述端口修改操作順利進(jìn)行,可以執(zhí)行“semanage port -a -t ssh_port_t -p tcp 9789”命令,就可以將TCP 9789定義為SSH的端口號(hào)。
之后執(zhí)行“systemctl restart sshd”命令,就可以順利啟動(dòng)SSH服務(wù)了。執(zhí)行“semanage port -l”命令,可以查看所有的端口對(duì)應(yīng)列表信息。
例如,執(zhí)行“semanage port -a -t http_port_t -p tcp 81”命令,可以將TCP 81端口添加為HTTP端口。執(zhí)行“semanage port--delete -p tcp 9789”命令,可以刪除指定端口的定義信息。