在 SELinux 中以安全的方式允許單個程序的某些危險行為
我有一個在 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
生成實際規則結合使用。基本步驟是:
- 創建一個基本的容器策略,例如
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
。