在 OpenShift 中 运行 nginx docker 容器的正确方法是什么?

What is the correct way to run an nginx docker container in OpenShift?

RedHat OpenShift 运行 docker 个容器作为随机用户 ID。

这对某些容器来说工作正常,但 NGINX 容器需要将文件权限设置为世界 read/write/execute 才能工作。

是否有更正确的方法来 build/run 与 OpenShift 一起使用的容器?

例如,OpenShift 是否提供任何类型的进程所有权组或规则?

这是我拉下来的 nginx 镜像,我们目前 运行 的 chmod 命令让它在 OpenShift 中工作。

注册表-nginxinc.rhcloud.com/nginx/rhel7-nginx:1.9.2

RUN chmod -R 777 /var/log/nginx /var/cache/nginx/ \
&& chmod -R 777 /var/run \
&& chmod -R 777 /etc/nginx/*

参考文献:

http://mailman.nginx.org/pipermail/nginx-devel/2015-November/007511.html

https://github.com/fsimorbrian/openshift-secure-routes

Why does this openshift route succeed in CDK but fail in RHEL7 Atomic?

最佳做法是不要 运行 您的容器作为 root。许多 Docker 图片,甚至一些官方图片,都会忽略这一点,并要求您以 root 身份 运行。通常的建议是,您应该设置映像,以便您的应用程序不需要 root,并且可以作为您在 Dockerfile 中设置的非 root 用户启动。由于几个原因,即使这个建议也不是最安全的选择。

首先是他们会说用USER username,其中username显然不是root。对于托管该图像的平台,这实际上并不能保证您的应用程序不会 运行ning 为 root。这是因为命名用户(例如 username 可以映射到容器中 0uid,因此仍然具有 运行 root 权限。要允许平台正确验证您的图片未设置为 运行 和 root,您应该使用 uid 而不是 username。那应该是除 0.

的 uid 之外的任何内容

第二个问题是,虽然 运行宁作为特定的非 root 用户在您自己的 Docker 服务实例中可能没问题,但当您考虑多个租户环境,无论是针对不同的用户,还是不同的应用程序,重要的是不同的应用程序不能以任何方式相互访问。

在多租户环境中,您可以做的最安全的事情是 运行 所有应用程序都属于一个特定帐户,或者在不同的项目中,作为不同的用户。这是重要的原因之一是从持久卷上的数据访问的角度来看。如果所有内容都 运行 以同一用户身份运行,并且它设法访问了不应该访问的持久卷,则它可以看到来自其他应用程序的数据。

就 OpenShift 而言,默认情况下它 运行 具有最高级别的安全性来保护您。因此,一个项目中的应用程序 运行 与另一个项目中的应用程序具有不同的用户。

如果您拥有适当的权限,您可以减少安全措施并覆盖它,但只有当您确信您正在执行的应用程序具有低风险配置文件时,您才应该进行更改。也就是说,您不会从 Internet 上随意抓取一些您一无所知的 Docker 图片,然后让它 运行 成为 root。

要了解有关更改特定应用程序的安全上下文约束的更多信息,请先阅读:

您可以覆盖默认值,并说图像可以 运行 作为它在 Dockerfile 中声明的用户,甚至可以 运行 作为 root 如果需要的话.

如果想要最好的安全性,更好的方法是构建 Docker 映像,以便它可以 运行 作为任何用户而不仅仅是特定用户。

如何执行此操作的一般准则是:

  • 在容器中创建一个新用户帐户以运行 应用程序作为。将此帐户的主要组设为组 ID 0。也就是说,它的组将是 root 的组,但用户不会。它需要是组 ID 0,因为如果 运行 宁作为一个在 UNIX passwd 文件中没有条目的用户,UNIX 会将组默认为该组。
  • 应用程序需要读取访问权限的任何 directories/files 应由其他人 readable/accessible,或 root 组 readable/accessible。
  • 应用程序需要写入权限的任何 directories/files 都应按组 root.
  • 写入
  • 应用程序不应要求能够绑定特权端口。从技术上讲,您可以通过使用 Linux 功能来解决这个问题,但是某些 Docker 图像的构建系统,例如 Docker Hub 自动构建,似乎不支持您使用 Linux 的方面功能,因此如果需要使用 setcap.
  • ,您将无法使用这些功能构建图像

最后,您会发现,如果使用 Red Hat 的 OpenShift Local (CDK),或 OpenShift Origin 的一体机 VM,则需要 none。这是因为这些 VM 映像被特意设置为允许作为默认策略 运行 任何映像的能力,甚至是想要 运行 作为 root 的映像。这纯粹是为了更容易尝试您下载的任意图像,但在生产系统中,您确实希望以更安全的方式 运行ning 图像,能够 运行 图像作为默认关闭 root。

如果您想阅读更多有关 运行 以 root 身份使用容器的一些问题以及当平台 运行s 容器作为任意用户 ID 时可能出现的问题,有查看系列博客文章: