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

Tho*_*mas 8 selinux docker

我有一个在 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因为我不想在其他任何地方允许这种特定行为(因为那会非常冒险)。

  • 我如何告诉 SELinux 以最安全的方式允许这种特定行为?
  • 我可以以一种允许我在未来生成更多运行相同程序的 Docker 容器的方式来做到这一点吗?

seb*_*sth 4

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)
    
    Run Code Online (Sandbox Code Playgroud)

    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
    
    Run Code Online (Sandbox Code Playgroud)

    新类型可以配置为许可域:

    semanage permissive -a container_execheap_t
    
    Run Code Online (Sandbox Code Playgroud)

    对于宽松的域,AVC 拒绝会被记录,但规则不会强制执行。这样以后就可以很容易地使用 生成缺失的规则audit2allow

  3. 在这个新的上下文中运行你的容器,比如docker run ... --security-opt label:type:container_execheap_t ...

  4. 生成预期的错误。然后运行audit2allow以生成允许这些操作的规则container_execheap_t。您可以.te使用新规则更新相同的模块文件(记住增加版本号)。编译并安装更新的模块。

  5. 当不再生成错误时,将自定义容器类型重新置于强制模式semanage -d container_execheap