Docker

在 SELinux 中以安全的方式允許單個程序的某些危險行為

  • April 22, 2019

我有一個在 Docker 容器中執行的程序,它載入一個 .so 文件,該文件通過掛鉤和記憶體操作來改變程序的行為。SELinux 阻止此行為,並在審核日誌中顯示以下消息:

type=AVC msg=audit(1548166862.066:2419): avc: denied { execheap } for pid=11171 comm=“myProgram” scontext=system_u:system_r:container_t:s0:c426,c629 tcontext=system_u:system_r:container_t:s0: c426,c629 tclass=程序許可=0

我非常猶豫是否要執行此操作,audit2allow因為我不想在其他任何地方允許這種特定行為(因為那將非常危險)。

  • 我如何告訴 SELinux 以最安全的方式允許這種特定行為?
  • 我能否以允許我在未來生成更多執行相同程序的 Docker 容器的方式執行此操作?

audit2allow可能會生成一個規則以允許execheap類型container_t處理。在載入模組之前,您始終可以先生成模組並對其進行檢查。

一個可能的問題是,container_t現在允許任何具有類型的程序進行相同的操作。為避免這種情況,您可能需要創建自己的自定義類型(container_t用作模板)並且只允許execheap這種特殊類型。

Dan Walsh 的這篇博文解釋瞭如何編寫這樣的自定義策略。您還可以將其與audit2allow生成實際規則結合使用。基本步驟是:

  1. 創建一個基本的容器策略,例如container_execheap
policy_module(container_execheap, 1.0)

virt_sandbox_domain_template(container_execheap_t)

virt_sandbox_domain_template宏創建新類型container_execheap_t並為 docker 操作創建必要的規則,新類型可以用作容器域。 2. 編譯並載入策略模組(必要的開發文件,包括makefile,應由selinux-policy-devel包提供):

make -f /usr/selinux/devel/Makefile container_execheap.pp
semodule -i container_execheap.pp

可以將新類型配置為許可域:

semanage permissive -a container_execheap_t

對於許可域,會記錄 AVC 拒絕但強制執行規則。這樣,以後使用audit2allow. 3. 在這個新的上下文中執行你的容器,比如docker run ... --security-opt label:type:container_execheap_t ... 4. 產生預期的錯誤。然後執行audit2allow以生成允許這些操作的規則container_execheap_t。您可以使用新規則更新相同的模組.te文件(記得增加版本號)。編譯並安裝更新的模組。 5. 當不再產生錯誤時,將自定義容器類型重新設置為強制模式semanage -d container_execheap

引用自:https://unix.stackexchange.com/questions/495992