我有一个程序在 Docker 容器内运行,该程序加载一个 .so 文件,该文件通过挂钩和内存操作来改变程序的行为。 SELinux 会阻止此行为,并在审核日志中显示以下消息:
类型=AVC msg=audit(1548166862.066:2419): avc: 被拒绝 { 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 容器的方式来实现这一点?
答案1
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 操作创建必要的规则,使新类型可以用作容器域。编译并加载策略模块(必要的开发文件,包括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
。在这个新的上下文中运行你的容器,比如
docker run ... --security-opt label:type:container_execheap_t ...
生成预期的错误。然后运行
audit2allow
以生成允许这些操作的规则container_execheap_t
。您可以使用新规则更新相同的模块.te
文件(记住增加版本号)。编译并安装更新的模块。当不再生成错误时,将自定义容器类型重新置于强制模式
semanage -d container_execheap
。