You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用AppArmor限制带CAP权限的pid=host容器访问主机文件?

关于AppArmor约束跨挂载命名空间进程的问题解答

好问题!这涉及到AppArmor的核心工作机制以及和Linux命名空间的交互,咱们分两部分来拆解解答:

一、能否通过AppArmor限制容器访问主机挂载命名空间的文件,仅允许特定路径?

答案是肯定的,但需要精准编写AppArmor配置并注意约束时机

虽然你的容器拥有CAP_SYS_ADMINCAP_SYS_CHROOT权限,还能通过setns()切换到主机挂载命名空间,但AppArmor是基于进程上下文的强制访问控制机制——只要进程被AppArmor profile绑定,不管它切换到哪个命名空间(包括挂载命名空间),profile的规则都会持续生效。

要实现你要的效果,关键是编写精准的AppArmor profile:

  • 首先,明确允许进程在主机挂载命名空间下访问/var/run/foo(包括读、写等必要权限);
  • 然后,拒绝进程访问主机挂载命名空间下的其他所有路径;
  • 同时,还要确保容器自身命名空间内的必要访问权限不被误限制(根据实际运行需求调整)。

举个简化的profile示例:

profile restricted-container {
  # 允许主机挂载命名空间下的/var/run/foo访问
  /var/run/foo rw,
  # 拒绝主机挂载命名空间下的其他所有路径
  /** deny,

  # 以下是容器自身命名空间内的必要权限(按需调整)
  /bin/** rx,
  /lib/** rx,
  /usr/** rx,
  # ... 其他容器运行必需的路径权限
}

需要注意的细节:

  1. 确保profile被正确加载(用apparmor_parser -r /path/to/profile命令),并绑定到容器主进程上——可以在容器启动时通过--security-opt apparmor=restricted-container指定,或者事后用aa-exec工具绑定;
  2. 因为容器处于初始PID命名空间,你可以直接通过PID定位容器进程并应用profile,无需额外的命名空间穿透操作。

二、AppArmor如何针对挂载命名空间评估文件系统路径?

AppArmor完全依赖进程当前所处的挂载命名空间来解析文件路径,不会忽略命名空间直接使用主机路径,也不会自动转换跨命名空间的路径(比如绑定挂载的子树),具体逻辑如下:

  1. 路径解析与挂载命名空间强绑定
    当进程切换到某个挂载命名空间后,AppArmor会使用该命名空间的挂载视图来解析文件路径。也就是说:

    • 如果进程在容器自己的挂载命名空间,访问/var/run/foo会解析为容器内的对应路径;
    • 如果进程通过setns()切换到主机挂载命名空间,访问/var/run/foo就会解析为主机上的真实路径。
  2. 绑定挂载的处理逻辑
    假设容器内将主机的/var/run/foo绑定挂载到容器的/mnt/foo,那么:

    • 当进程在容器命名空间访问/mnt/foo,AppArmor会按照容器的挂载视图解析为/mnt/foo,此时你需要在profile中添加/mnt/foo rw,的规则才能允许访问;
    • 当进程切换到主机命名空间后,访问/var/run/foo则对应主机的路径,此时需要profile中的/var/run/foo rw,规则生效。

简单来说,AppArmor的路径规则是跟着进程当前的挂载命名空间走的,它不会去追踪路径背后的物理存储,只认当前命名空间下的路径视图。


内容的提问来源于stack exchange,提问作者TheDiveO

火山引擎 最新活动