在 SELinux 中以安全的方式允许单个程序的某些危险行为

在 SELinux 中以安全的方式允许单个程序的某些危险行为

我有一个程序在 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生成实际规则。基本步骤是:

  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

相关内容