【问题标题】:Is it safe to run docker in docker on Openshift?在 Openshift 上的 docker 中运行 docker 是否安全?
【发布时间】:2019-04-14 15:53:27
【问题描述】:

我在可以为 Jenkins 运行 CI-CD 的服务器上构建了 Docker 映像。因为有些构建使用 Docker,所以我在镜像中安装了 Docker,为了让内部 Docker 运行,我不得不给它--privilege

一切正常,但我想在 Openshift(或 Kubernetes)上的 docker 中运行 docker。问题在于获得--privilege 权限。

在 Openshift 上运行特权容器是否危险,如果是,为什么以及危险程度如何?

【问题讨论】:

    标签: docker kubernetes openshift docker-in-docker


    【解决方案1】:

    特权容器可以重新启动主机、替换主机的内核、访问任意主机设备(如原始磁盘设备)以及重新配置主机的网络堆栈among other things。我认为这非常危险,而且并不比在主机上以 root 身份运行进程更安全。

    我建议完全使用--privileged 可能是一个错误。如果你真的需要一个进程来管理主机,你应该在主机上直接(以 root 身份)运行它,而不是在阻止它试图做的事情的隔离层内。有一些有限的提升权限的东西很有用,但如果 eg 你的容器需要 mlock(2) 你应该--cap-add IPC_LOCK 以获得你需要的特定权限,而不是开放整个世界。

    (我的理解仍然是尝试在 Docker 中运行 Docker 是 generally considered a mistake 并且最好使用主机的 Docker 守护进程。当然,这可以无限控制主机...)

    【讨论】:

    • 所以如果我理解了,我应该挂载 docker.sock 而不是特权?
    • 这是我见过的 CI 系统和编排器更标准的方法,是的。
    • @Yagel - 这是 OpenShift 构建容器在运行时所做的 - 它们是有权访问 Docker 守护进程套接字的特权容器。对于您的情况,正如此链接 - docs.openshift.com/container-platform/3.11/dev_guide/builds/… - 解释的那样,“......为了允许运行 Docker 命令并从容器内部构建容器映像,构建容器必须绑定到可访问的套接字。要这样做,将 exposeDockerSocket 选项设置为 true"
    【解决方案2】:

    简而言之,答案是否定的,它不安全。由于潜在的内存和文件系统损坏,Docker-in-Docker 远非安全,甚至挂载主机的 docker 套接字在任何环境中都是不安全的,因为它有效地赋予构建管道 root 权限。这就是为什么要制作像 BuildahKaniko 这样的工具,以及构建像 S2I 这样的镜像的原因。

    Buildah 尤其是 Red Hat 自己的用于在容器内构建的工具,但到目前为止,我相信它们仍然不能完全无特权运行。

    此外,在 Openshift 4 上,您根本无法运行 Docker-in-Docker,因为运行时已更改为 CRI-O。

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2019-01-22
      相关资源
      最近更新 更多