【发布时间】:2016-05-01 10:26:22
【问题描述】:
我有一个应用程序,我想授予它启动短期任务并将它们安排为 docker 容器的特权。我想通过docker run 来做这件事。
由于我想让攻击面尽可能小,我将应用程序视为不受信任。因此,它可能会针对预定义的 docker API 端点运行任意 docker run 命令(如果代码库包含错误或容器被破坏,输入在某处被不正确地转义等)。
这就是我想在某些方面限制该应用程序(实际上是调度程序)的原因:
- 阻止
--privileged使用 - 强制执行
--read-only标志 - 强制执行内存和 CPU 限制
我看了几个选项:
- selinux
- selinux 策略需要在主机级别设置,然后通过
daemon级别上的--selinux-enabled标志在容器内传播。然而,调度程序可以通过run --privileged覆盖它。
- selinux 策略需要在主机级别设置,然后通过
- seccomp 配置文件
- 这些仅在启动容器时应用(seccomp 标志可用于
docker run)
- 这些仅在启动容器时应用(seccomp 标志可用于
- AppArmor
- 这可以(再次)通过
--privileged在调度程序级别被覆盖
- 这可以(再次)通过
- docker 守护进程
--exec-opts标志- 实际上只有一个选项可用于此标志 (
native.cgroupdriver)
- 实际上只有一个选项可用于此标志 (
似乎 Docker 被设计为默认信任容器调度程序。 有谁知道这是否是一个设计决定?
我错过了当前最新的 Docker 版本,还有其他可能的解决方案吗?
我还研究了 Kubernetes 及其 Limit Ranges 和 Resource Quotas,它们可以应用于 K8S 命名空间,这看起来很有趣,假设有一种方法可以强制某些调度程序只使用某些命名空间。然而,这会将这个问题的范围扩大到操作 K8S 集群。
【问题讨论】:
-
我认为“不受信任”和“能够运行任意命令”本质上是矛盾的。您是否允许他们实际运行任何命令,并且只是期望它是
docker run命令?或者您是否允许他们为docker run指定一串参数?如果是第二个,为什么不直接修改docker run前缀以添加--privileged=false和--read-only标志?指定第二个--privileged参数的命令应该失败 -
文档中明确指出,只有受信任的用户才能控制守护进程。所以你不太可能错过太多(除了可能有趣的用户命名空间)我建议使用 sudo perms 创建一个启动器 shell 脚本,它运行具有你想要的限制的容器,而不是让你的“不受信任”应用程序完全控制 @ 987654340@ 参数。
-
@F.StephenQ 我在上面解释过,“能够运行任意命令”不是我希望“设计”会发生的事情,而是偶然发生的(例如,应用程序受损或不正确的转义)。跨度>
标签: security docker containers