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


8

我有一个在Docker容器中运行的程序,该程序加载一个.so文件,该文件通过挂钩和内存操作来更改程序的行为。SELinux通过在审核日志中显示以下消息来阻止此行为:

类型= AVC消息=审核(1548166862.066:2419):AVC:拒绝{execheap} 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容器的方式来执行此操作?

Answers:


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)
    

    virt_sandbox_domain_template宏会创建新类型,container_execheap_t并为docker操作创建必要的规则,以将新类型用作容器域。

  2. 编译并加载策略模块(selinux-policy-devel软件包应提供必需的开发文件,包括makefile ):

    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


您的答案似乎是正确的方法-不幸的是,尽管我自己没有创建SELinux策略的经验。通过浏览您链接到的博客文章和其他文档,我得出了点。我有一种感觉,我做得不对……您能帮我指出正确的方向吗?我的政策有任何意义吗?
托马斯

谢谢,我现在有些东西似乎起作用了!就是我最后得到的。但是我在编译期间确实收到了一些关于重复项错误,我假设这是所包含策略中的问题,而不是我自己的问题?我也不太确定为什么gen_require语句中的字符串必须以'而不是`终止(后者引发了错误)。无论如何,再次感谢您的帮助!
Thomas

我认为忽略这些特定错误是安全的,请参见bugzilla。用'引用是它在M4语言中的工作方式,该语言用于编写参考策略模块。ps axZ如果要在安装和配置自定义策略后再次检查,则可以检查(使用等)容器是否在正确的上下文中运行。
sebasth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.