RedHat OpenShift将docker容器作为随机用户ID运行。
对于某些容器,这可以很好地工作,但是NGINX容器需要将文件权限设置为世界级读/写/执行才能正常工作。
有没有更正确的方法来构建/运行用于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?
最佳答案
最佳实践是不要以 super 用户身份运行容器。许多Docker镜像,甚至是一些官方镜像,都忽略了这一点,并要求您以root用户身份运行。建议通常应设置镜像,以便您的应用程序不需要root用户,并且可以以在Dockerfile
中设置的非root用户身份启动。出于几个原因,即使是此建议也不是最安全的选择。
首先是他们会说使用USER username
,其中username
显然不是root
。对于托管该镜像的平台,实际上并不能保证您的应用程序未以root
的身份运行。这是因为可以将诸如username
之类的命名用户映射到容器中uid
的0
,因此仍以root
特权运行。为了允许平台正确地验证您的镜像未设置为以root
的身份运行,您应该使用uid
而不是username
。那应该是0
的uid以外的任何东西。
第二个问题是,尽管在您自己的Docker服务实例中以特定的非root
用户身份运行可能很好,但是当您考虑使用 Multi-Tenancy 环境时,并不是针对不同的用户,甚至对于不同的应用程序,重要的是不同的应用程序无法以任何方式相互访问。
在 Multi-Tenancy 环境中,最安全的操作是以特定用户身份运行特定帐户或不同项目中拥有的所有应用程序。导入的原因之一是从持久卷上的数据访问的 Angular 来看。如果所有内容都以同一用户身份运行,并且设法获得了不应该访问的持久卷的权限,则它可能会看到其他应用程序中的数据。
就OpenShift而言,默认情况下,它以最高安全级别运行,以保护您。因此,一个项目中的应用程序与另一个项目中的应用程序由不同的用户运行。
您可以减少安全措施,并在拥有适当特权的情况下覆盖此措施,但是只有在您认为自己要处理的应用程序风险较低的情况下,才应进行更改。也就是说,您不会从互联网上获取一些您不了解的任意Docker镜像,而是让它作为root用户运行。
要了解有关围绕特定应用程序更改安全上下文约束的更多信息,请通读以下内容:
您可以覆盖默认值,并说图像可以按其在
Dockerfile
中声明的用户身份运行,甚至在需要时以root
身份运行。如果想要最好的安全性,更好的方法是构建Docker镜像,以便它可以以任何用户身份运行,而不仅仅是特定用户。
有关如何执行此操作的一般准则是:
0
。也就是说,其组将是root
的组,而用户则不是。它必须是组ID 0
,因为如果以在UNIX passwd
文件中没有任何条目的用户身份运行,UNIX将默认使用该组。 root
读取/访问。 root
组写入。 setcap
。 最后,您会发现,如果使用Red Hat的OpenShift Local(CDK)或用于OpenShift Origin的多合一VM,则不需要这些。这是因为有意将这些VM镜像设置为允许运行任何镜像(甚至是想要以root身份运行的镜像)作为默认策略。这样做纯粹是为了更容易尝试下载的任意镜像,但是在生产系统中,您确实希望以更安全的方式运行镜像,并且默认情况下能够以root用户身份运行镜像。
如果您想了解有关以root用户身份运行容器的一些问题以及平台以任意用户ID运行容器时可能出现的问题,请查看以下博客文章系列:
关于security - 在OpenShift中运行Nginx docker 容器的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38754592/