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