2021-05-12 14:32:11
系統管理員的 SELinux 指南:這個大問題的 42 個答案
獲取有關生活、宇宙和除了有關 SELinux 的重要問題的答案
“一個重要而普遍的事實是,事情並不總是你看上去的那樣 …” ―Douglas Adams,《銀河系漫遊指南》
安全、堅固、遵從性、策略是末世中系統管理員的四騎士。除了我們的日常任務之外 —— 監控、備份、實施、調優、更新等等 —— 我們還需要負責我們的系統安全。即使這些系統是第三方提供商告訴我們該禁用增強安全性的系統。這看起來像《碟中碟》中 Ethan Hunt 的工作一樣。
面對這種窘境,一些系統管理員決定去服用藍色小藥丸,因為他們認為他們永遠也不會知道如生命、宇宙、以及其它一些大問題的答案。而我們都知道,它的答案就是這個 42。
按《銀河系漫遊指南》的精神,這裡是關於在你的系統上管理和使用 SELinux 這個大問題的 42 個答案。
- SELinux 是一個標籤系統,這意味著每個進程都有一個標籤。每個檔案、目錄、以及系統物件都有一個標籤。策略規則負責控制標籤化的進程和標籤化的物件之間的存取。由核心強制執行這些規則。
- 兩個最重要的概念是:標籤化(檔案、進程、埠等等)和型別強制(基於不同的型別隔離不同的的進程)。
- 正確的標籤格式是
user:role:type:level
(可選)。 - 多級別安全Multi-Level Security(MLS)強制的目的是基於它們所使用資料的安全級別,對進程(域)強制實施控制。比如,一個秘密級別的進程是不能讀取極機密級別的資料。
- 多類別安全Multi-Category Security(MCS)強制相互保護相似的進程(如虛擬機器、OpenShift gears、SELinux 沙盒、容器等等)。
- 在啟動時改變 SELinux 模式的核心引數有:
autorelabel=1
→ 強制給系統重新標籤化selinux=0
→ 核心不載入 SELinux 基礎設施的任何部分enforcing=0
→ 以許可permissive模式啟動
-
如果給整個系統重新標籤化:
#touch/.autorelabel
#reboot
如果系統標籤中有大量的錯誤,為了能夠讓 autorelabel 成功,你可以用許可模式引導系統。
-
檢查 SELinux 是否啟用:
# getenforce
-
臨時啟用/禁用 SELinux:
# setenforce [1|0]
-
SELinux 狀態工具:
# sestatus
-
組態檔:
/etc/selinux/config
-
SELinux 是如何工作的?這是一個為 Apache Web Server 標籤化的範例:
- 二進位制檔案:
/usr/sbin/httpd
→httpd_exec_t
- 組態檔目錄:
/etc/httpd
→httpd_config_t
- 紀錄檔檔案目錄:
/var/log/httpd
→httpd_log_t
- 內容目錄:
/var/www/html
→httpd_sys_content_t
- 啟動指令碼:
/usr/lib/systemd/system/httpd.service
→httpd_unit_file_d
- 進程:
/usr/sbin/httpd -DFOREGROUND
→httpd_t
- 埠:
80/tcp, 443/tcp
→httpd_t, http_port_t
在
httpd_t
安全上下文中執行的一個進程可以與具有httpd_something_t
標籤的物件互動。 - 二進位制檔案:
-
許多命令都可以接收一個
-Z
引數去檢視、建立、和修改安全上下文:ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
當檔案被建立時,它們的安全上下文會根據它們父目錄的安全上下文來建立(可能有某些例外)。RPM 可以在安裝過程中設定安全上下文。
-
這裡有導致 SELinux 出錯的四個關鍵原因,它們將在下面的 15 - 21 條中展開描述:
- 標籤化問題
- SELinux 需要知道一些東西
- SELinux 策略或者應用有 bug
- 你的資訊可能被損壞
-
標籤化問題:如果在
/srv/myweb
中你的檔案沒有被正確的標籤化,存取可能會被拒絕。這裡有一些修復這類問題的方法:- 如果你知道標籤:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- 如果你知道和它有相同標籤的檔案:
# semanage fcontext -a -e /srv/myweb /var/www
- 恢復安全上下文(對於以上兩種情況):
# restorecon -vR /srv/myweb
- 如果你知道標籤:
-
標籤化問題:如果你是移動了一個檔案,而不是去複製它,那麼這個檔案將保持原始的環境。修復這類問題:
- 使用標籤來改變安全上下文:
# chcon -t httpd_system_content_t /var/www/html/index.html
- 使用參考檔案的標籤來改變安全上下文:
# chcon --reference /var/www/html/ /var/www/html/index.html
- 恢復安全上下文(對於以上兩種情況):
# restorecon -vR /var/www/html/
- 使用標籤來改變安全上下文:
-
如果 SELinux 需要知道 HTTPD 在 8585 埠上監聽,使用下列命令告訴 SELinux:
# semanage port -a -t http_port_t -p tcp 8585
-
SELinux 需要知道是否允許在執行時改變 SELinux 策略部分,而無需重寫 SELinux 策略。例如,如果希望 httpd 去傳送郵件,輸入:
# setsebool -P httpd_can_sendmail 1
-
SELinux 需要知道 SELinux 設定的關閉或開啟的一系列布林值:
- 檢視所有的布林值:
# getsebool -a
- 檢視每個布林值的描述:
# semanage boolean -l
- 設定某個布林值:
# setsebool [_boolean_] [1|0]
- 將它設定為永久值,新增
-P
標誌。例如:# setsebool httpd_enable_ftp_server 1 -P
- 檢視所有的布林值:
-
SELinux 策略/應用可能有 bug,包括:
- 不尋常的程式碼路徑
- 設定
- 重定向
stdout
- 洩露的檔案描述符
- 可執行記憶體
- 錯誤構建的庫
開一個工單(但不要提交 Bugzilla 報告;使用 Bugzilla 沒有對應的服務)
-
你的資訊可能被損壞了,假如你被限制在某個區域,嘗試這樣做:
- 載入核心模組
- 關閉 SELinux 的強制模式
- 寫入
etc_t/shadow_t
- 修改 iptables 規則
-
用於開發策略模組的 SELinux 工具:
# yum -y install setroubleshoot setroubleshoot-server
。安裝完成之後重引導機器或重新啟動auditd
服務。 -
使用
journalctl
去列出所有與setroubleshoot
相關的紀錄檔:# journalctl -t setroubleshoot --since=14:20
-
使用
journalctl
去列出所有與特定 SELinux 標籤相關的紀錄檔。例如:# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
-
當 SELinux 錯誤發生時,使用
setroubleshoot
的紀錄檔,並嘗試找到某些可能的解決方法。例如:從journalctl
中:Jun1419:41:07 web1 setroubleshoot:SELinuxis preventing httpd from getattr access on the file/var/www/html/index.html.For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
SELinuxis preventing httpd from getattr access on the file/var/www/html/index.html.
*****Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label,
/var/www/html/index.html default label should be httpd_syscontent_t.
Then you can restorecon.
Do
# /sbin/restorecon -v /var/www/html/index.html
-
紀錄檔:SELinux 記錄的資訊全在這些地方:
/var/log/messages
/var/log/audit/audit.log
/var/lib/setroubleshoot/setroubleshoot_database.xml
-
紀錄檔:在審計紀錄檔中查詢 SELinux 錯誤:
# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
-
針對特定的服務,搜尋 SELinux 的存取向量快取Access Vector Cache(AVC)資訊:
# ausearch -m avc -c httpd
-
audit2allow
實用工具可以通過從紀錄檔中蒐集有關被拒絕的操作,然後生成 SELinux 策略允許的規則,例如:- 產生一個人類可讀的關於為什麼拒絕存取的描述:
# audit2allow -w -a
- 檢視允許被拒絕的型別強制規則:
# audit2allow -a
- 建立一個自定義模組:
# audit2allow -a -M mypolicy
,其中-M
選項將建立一個特定名稱的強制型別檔案(.te),並編譯這個規則到一個策略包(.pp)中:mypolicy.pp mypolicy.te
- 安裝自定義模組:
# semodule -i mypolicy.pp
- 產生一個人類可讀的關於為什麼拒絕存取的描述:
-
設定單個進程(域)執行在許可模式:
# semanage permissive -a httpd_t
-
如果不再希望一個域在許可模式中:
# semanage permissive -d httpd_t
-
禁用所有的許可域:
# semodule -d permissivedomains
-
啟用 SELinux MLS 策略:
# yum install selinux-policy-mls
。 在/etc/selinux/config
中:SELINUX=permissive
SELINUXTYPE=mls
確保 SELinux 執行在許可模式:
# setenforce 0
使用
fixfiles
指令碼來確保在下一次重新啟動時檔案將被重新標籤化:# fixfiles -F onboot # reboot
-
建立一個帶有特定 MLS 範圍的使用者:
# useradd -Z staff_u john
使用
useradd
命令,對映新使用者到一個已存在的 SELinux 使用者(上面例子中是staff_u
)。 -
檢視 SELinux 和 Linux 使用者之間的對映:
# semanage login -l
-
為使用者定義一個指定的範圍:
# semanage login --modify --range s2:c100 john
-
調整使用者家目錄上的標籤(如果需要的話):
# chcon -R -l s2:c100 /home/john
-
列出當前類別:
# chcat -L
-
修改類別或者建立你自己的分類,修改如下檔案:
/etc/selinux/_<selinuxtype>_/setrans.conf
-
以某個特定的檔案、角色和使用者安全上下文來執行一個命令或者指令碼:
# runcon -t initrc_t -r system_r -u user_u yourcommandhere
-t
是檔案安全上下文-r
是角色安全上下文-u
是使用者安全上下文
-
在容器中禁用 SELinux:
- 使用 Podman:
# podman run --security-opt label=disable ...
- 使用 Docker:
# docker run --security-opt label=disable ...
- 使用 Podman:
-
如果需要給容器提供完全存取系統的許可權:
- 使用 Podman:
# podman run --privileged ...
- 使用 Docker:
# docker run --privileged ...
- 使用 Podman:
就這些了,你已經知道了答案。因此請相信我:不用恐慌,去開啟 SELinux 吧。
作者簡介
Alex Callejas 是位於墨西哥城的紅帽公司拉丁美洲區的一名技術客服經理。作為一名系統管理員,他已有超過 10 年的經驗。在基礎設施強化方面具有很強的專業知識。對開源抱有熱情,通過在不同的公共事件和大學中分享他的知識來支援社群。天生的極客,當然他一般選擇使用 Fedora Linux 發行版。[這裡][11]有更多關於他的資訊。
via: https://opensource.com/article/18/7/sysadmin-guide-selinux
作者:Alex Callejas 選題:lujun9972 譯者:qhwdw, FSSlc 校對:wxy
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-08/153518.htm
相關文章