歡迎光臨
每天分享高質量文章

系統管理員的 SELinux 指南:這個大問題的 42 個答案 | Linux 中國

獲取有關生活、宇宙和除了有關 SELinux 的重要問題的答案
— Alex Callejas


致謝
編譯自 | 
https://opensource.com/article/18/7/sysadmin-guide-selinux
 
 作者 | Alex Callejas
 譯者 | qhwdw 共計翻譯:144 篇 貢獻時間:281 天 
 譯者 | Chang Liu (FSSlc) 共計翻譯:66 篇 貢獻時間:1290 天

獲取有關生活、宇宙和除了有關 SELinux 的重要問題的答案

“一個重要而普遍的事實是,事情並不總是你看上去的那樣 …” ―Douglas Adams,《銀河系漫游指南》

安全、堅固、遵從性、策略是末世中系統管理員的四騎士。除了我們的日常任務之外 —— 監控、備份、實施、調優、更新等等 —— 我們還需要負責我們的系統安全。即使這些系統是第三方提供商告訴我們該禁用增強安全性的系統。這看起來像《碟中碟》中 Ethan Hunt[1] 的工作一樣。

面對這種窘境,一些系統管理員決定去服用藍色小藥丸[2],因為他們認為他們永遠也不會知道如生命、宇宙、以及其它一些大問題的答案。而我們都知道,它的答案就是這個 42[3]

按《銀河系漫游指南》的精神,這裡是關於在你的系統上管理和使用 SELinux[4] 這個大問題的 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樣式啟動
☉ 如果給整個系統重新標簽化:

  1. # touch /.autorelabel

  2. # reboot

如果系統標簽中有大量的錯誤,為了能夠讓 autorelabel 成功,你可以用許可樣式引導系統。

☉ 檢查 SELinux 是否啟用:# getenforce
☉ 臨時啟用/禁用 SELinux:# setenforce [1|0]
☉ SELinux 狀態工具:# sestatus
☉ 配置檔案:/etc/selinux/config
☉ SELinux 是如何工作的?這是一個為 Apache Web Server 標簽化的示例:

◈ 二進制檔案:/usr/sbin/httpdhttpd_exec_t
◈ 配置檔案目錄:/etc/httpdhttpd_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 中:

  1. Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e

  2. # sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e

  3. SELinux is preventing httpd from getattr access on the file /var/www/html/index.html.

  4. ***** Plugin restorecon (99.5 confidence) suggests ************************

  5. If you want to fix the label,

  6. /var/www/html/index.html default label should be httpd_syscontent_t.

  7. Then you can restorecon.

  8. Do

  9. # /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 中:

  1. SELINUX=permissive

  2. 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/__/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 run --privileged ...
◈ 使用 Docker:# docker run --privileged ...

就這些了,你已經知道了答案。因此請相信我:不用恐慌,去打開 SELinux 吧

作者簡介

Alex Callejas 是位於墨西哥城的紅帽公司拉丁美洲區的一名技術客服經理。作為一名系統管理員,他已有超過 10 年的經驗。在基礎設施強化方面具有很強的專業知識。對開源抱有熱情,通過在不同的公共事件和大學中分享他的知識來支持社區。天生的極客,當然他一般選擇使用 Fedora Linux 發行版。[這裡][11]有更多關於他的信息。


via: https://opensource.com/article/18/7/sysadmin-guide-selinux

作者:Alex Callejas[6] 選題:lujun9972 譯者:qhwdwFSSlc 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

赞(0)

分享創造快樂

© 2021 知識星球   网站地图