我有一个在 Docker 容器内运行的程序,它加载一个 .so 文件,该文件通过挂钩和内存操作来改变程序的行为。此行为被 SELinux 阻止,并在审核日志中显示以下消息:
type=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_containr_system c426,c629 tclass=进程许可=0
我非常犹豫是否要完成此操作,audit2allow因为我不想在其他任何地方允许这种特定行为(因为那会非常冒险)。
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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
新类型可以配置为许可域:
semanage permissive -a container_execheap_t
Run Code Online (Sandbox Code Playgroud)
对于宽松的域,AVC 拒绝会被记录,但规则不会强制执行。这样以后就可以很容易地使用 生成缺失的规则audit2allow。
在这个新的上下文中运行你的容器,比如docker run ... --security-opt label:type:container_execheap_t ...
生成预期的错误。然后运行audit2allow以生成允许这些操作的规则container_execheap_t。您可以.te使用新规则更新相同的模块文件(记住增加版本号)。编译并安装更新的模块。
当不再生成错误时,将自定义容器类型重新置于强制模式semanage -d container_execheap。
| 归档时间: |
|
| 查看次数: |
335 次 |
| 最近记录: |