首页 > 解决方案 > 在 docker 容器中运行 GitLab Runner 时,shell 执行器是一个安全的选择吗?

问题描述

我想在 docker 容器中使用 GitLab Runner,如文档中所述,主要是为了轻松地将其部署到另一台机器上。我想知道如何使用它来安全地运行 GitLab 发送给跑步者的 CI/CD 作业。

GitLab Runner 文档警告说,使用 shell 作为 executor 是不安全的,因为所有代码都以 GitLab runner 用户权限运行,因此可以访问用户在主机上可以访问的所有内容。

但是,将 shell 执行器与在 docker容器中运行的 GitLab Runner 一起使用是否安全?我的直觉是,所有安全问题都回到了 docker 容器:如果它没有以--privileged模式运行并且系统资源没有通过绑定到容器而暴露,那么该作业不会对主机构成任何威胁。GitLab Runner 运行的多个作业仍然可以访问彼此的数据,但主机系统遥不可及。还有其他我应该注意的问题吗?

或者,是否有一种安全的方法可以在 docker 容器中运行 GitLab 运行程序,并让用于构建、测试和部署的 ci/cd 作业也在他们自己的 docker 容器中运行?Docker-in-Docker 方法似乎可以做到这一点,但需要 GitLab Runner 容器以该--priviledged模式运行,我宁愿避免这种模式,主要是出于对可能随之而来的安全问题的无知。

标签: dockergitlab-cigitlab-ci-runner

解决方案


据我了解,通过 shell 执行程序运行的不受信任的代码可以读取 GitLab Runner 环境变量,其中包含允许访问 GitLab 实例上可能受保护的存储库的令牌。此外,不受信任的代码可能会超过 GitLab Runner 本身。

此外,依靠通常runc基于 eg 的 Docker 容器进行隔离是勇敢的,这就是 gVisor ( https://github.com/google/gvisor ) 和 Kata Containers ( https://katacontainers.io/ ) 存在的原因。

如果您想在 Docker 中运行 GitLab Runner 并在没有--privileged.

话虽如此:一个常见的替代方案可能是在 VM 中而不是在 Docker 容器本身中运行带有 Docker 执行器的 GitLab Runner。Docker-in-VM 的工作方式比特权 Docker-in-Docker 方法更安全。

说到外部容器使用非 Docker 技术:如果真的需要在 Runner 外部使用容器,以下解决方案通过让外部容器在没有 root 权限的情况下运行来增加一些安全性:它会等待 Podman 执行器 GitLab 是工作(https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27119)或使用 Podman 创建自定义执行器,然后可以在 Podman 中运行 Podman 执行器 - 无根 Podman-in-Podman例如在https://www.redhat.com/sysadmin/podman-inside-container的最后一行代码中演示。不过,外部 Podman 应该只运行受信任的代码(即配置了 Podman 执行器本身的 Runner),因为据我了解,外部容器不提供有用的隔离。

也许基于 gVisor 或 Kata 的 Podman 或 Docker 可以嵌套,尽管没有那么多安全妥协?不过我不想打赌。


推荐阅读