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

问题描述:

RedHat OpenShift将docker容器作为随机用户标识运行。在OpenShift中运行nginx docker容器的正确方法是什么?

这对一些容器工作正常,但NGINX容器需要将文件权限设置为世界读/写/执行才能工作。

是否有一个更正确的方式来建立/运行与OpenShift一起使用的容器?

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

这是我下拉的nginx镜像,以及我们当前运行的chmod命令,以使其在OpenShift中工作。

registry-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。对于托管该映像的平台,实际上并不能保证您的应用程序未运行为root。这是因为指定用户(例如username)可能映射到容器中的 0,因此仍然以root权限运行。要允许平台正确验证您的映像未设置为以root运行,您应该使用uid而不是username。这应该是除了0的uid以外的任何内容。

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

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

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

如果您拥有适当的权限,您可以减少安全措施并覆盖该安全措施,但只有在您确信自己的应用程序具有低风险特征时才应该进行更改。也就是说,你不会从互联网上获取任何你不了解的任何Docker镜像,并让它以root身份运行。

要了解更多关于改变围绕一个特定的应用程序启动的安全上下文约束通过阅读:

您可以覆盖默认并说,图像可以作为用户运行它在Dockerfile中声明,或者甚至在需要时将其运行为root

如果希望最好的安全性是构建Docker镜像,以便它可以像任何用户而不仅仅是特定用户那样运行,那么更好的方法是更好的方法。

如何做到这一点的一般准则是:

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

最后,您会发现,如果使用来自Red Hat的OpenShift Local(CDK)或OpenShift Origin的一体化VM,则不需要这些。这是因为这些虚拟机映像有意设置为允许默认策略运行任何映像,甚至希望以root身份运行的映像。这纯粹是为了更方便地尝试下载任意图像,但在生产系统中,您确实希望以更安全的方式运行图像,并且默认情况下能够以root身份运行图像。

如果您想了解更多有关以root身份运行容器的问题以及平台将容器作为任意用户标识运行时出现的问题,请查看以下系列博客文章:

+0

谢谢你,这是一个很好的写了! –

+0

如果您需要进一步帮助,最好使用https://groups.google.com/forum/#!forum/openshift上的Google Group for OpenShift –