【问题标题】:Is there a way to restrict untrusted container scheduler?有没有办法限制不受信任的容器调度程序?
【发布时间】:2016-05-01 10:26:22
【问题描述】:

我有一个应用程序,我想授予它启动短期任务并将它们安排为 docker 容器的特权。我想通过docker run 来做这件事。

由于我想让攻击面尽可能小,我将应用程序视为不受信任。因此,它可能会针对预定义的 docker API 端点运行任意 docker run 命令(如果代码库包含错误或容器被破坏,输入在某处被不正确地转义等)。

这就是我想在某些方面限制该应用程序(实际上是调度程序)的原因:

  • 阻止--privileged使用
  • 强制执行--read-only标志
  • 强制执行内存和 CPU 限制

我看了几个选项:

  • selinux
    • selinux 策略需要在主机级别设置,然后通过daemon 级别上的--selinux-enabled 标志在容器内传播。然而,调度程序可以通过run --privileged 覆盖它。
  • seccomp 配置文件
    • 这些仅在启动容器时应用(seccomp 标志可用于docker run
  • AppArmor
    • 这可以(再次)通过--privileged 在调度程序级别被覆盖
  • docker 守护进程--exec-opts 标志
    • 实际上只有一个选项可用于此标志 (native.cgroupdriver)

似乎 Docker 被设计为默认信任容器调度程序。 有谁知道这是否是一个设计决定?

我错过了当前最新的 Docker 版本,还有其他可能的解决方案吗?


我还研究了 Kubernetes 及其 Limit RangesResource Quotas,它们可以应用于 K8S 命名空间,这看起来很有趣,假设有一种方法可以强制某些调度程序只使用某些命名空间。然而,这会将这个问题的范围扩大到操作 K8S 集群。

【问题讨论】:

  • 我认为“不受信任”和“能够运行任意命令”本质上是矛盾的。您是否允许他们实际运行任何命令,并且只是期望它是 docker run 命令?或者您是否允许他们为docker run 指定一串参数?如果是第二个,为什么不直接修改 docker run 前缀以添加 --privileged=false--read-only 标志?指定第二个 --privileged 参数的命令应该失败
  • 文档中明确指出,只有受信任的用户才能控制守护进程。所以你不太可能错过太多(除了可能有趣的用户命名空间)我建议使用 sudo perms 创建一个启动器 shell 脚本,它运行具有你想要的限制的容器,而不是让你的“不受信任”应用程序完全控制 @ 987654340@ 参数。
  • @F.StephenQ 我在上面解释过,“能够运行任意命令”不是我希望“设计”会发生的事情,而是偶然发生的(例如,应用程序受损或不正确的转义)。跨度>

标签: security docker containers


【解决方案1】:

在 unix 平台上运行 docker 应该与 nice 兼容或者所以我认为乍一看更仔细一点,看起来你需要像 -cpuset-cpus="0,1" 这样的东西

从第二个链接,“--cpu-quota 看起来类似于--cpuset-cpus ...为一个进程分配一个或几个核心,它只是时间管理而不是处理器数量托管。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 2016-12-10
    • 1970-01-01
    • 2017-07-31
    • 2019-10-17
    • 1970-01-01
    • 2021-04-28
    • 2022-11-02
    相关资源
    最近更新 更多