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

标签 security nginx docker openshift openshift-origin

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之类的命名用户映射到容器中uid0,因此仍以root特权运行。为了允许平台正确地验证您的镜像未设置为以root的身份运行,您应该使用uid而不是username。那应该是0的uid以外的任何东西。

第二个问题是,尽管在您自己的Docker服务实例中以特定的非root用户身份运行可能很好,但是当您考虑使用 Multi-Tenancy 环境时,并不是针对不同的用户,甚至对于不同的应用程序,重要的是不同的应用程序无法以任何方式相互访问。

在 Multi-Tenancy 环境中,最安全的操作是以特定用户身份运行特定帐户或不同项目中拥有的所有应用程序。导入的原因之一是从持久卷上的数据访问的 Angular 来看。如果所有内容都以同一用户身份运行,并且设法获得了不应该访问的持久卷的权限,则它可能会看到其他应用程序中的数据。

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

您可以减少安全措施,并在拥有适当特权的情况下覆盖此措施,但是只有在您认为自己要处理的应用程序风险较低的情况下,才应进行更改。也就是说,您不会从互联网上获取一些您不了解的任意Docker镜像,而是让它作为root用户运行。

要了解有关围绕特定应用程序更改安全上下文约束的更多信息,请通读以下内容:

  • https://docs.openshift.com/enterprise/latest/admin_guide/manage_scc.html

  • 您可以覆盖默认值,并说图像可以按其在Dockerfile中声明的用户身份运行,甚至在需要时以root身份运行。

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

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

  • 最后,您会发现,如果使用Red Hat的OpenShift Local(CDK)或用于OpenShift Origin的多合一VM,则不需要这些。这是因为有意将这些VM镜像设置为允许运行任何镜像(甚至是想要以root身份运行的镜像)作为默认策略。这样做纯粹是为了更容易尝试下载的任意镜像,但是在生产系统中,您确实希望以更安全的方式运行镜像,并且默认情况下能够以root用户身份运行镜像。

    如果您想了解有关以root用户身份运行容器的一些问题以及平台以任意用户ID运行容器时可能出现的问题,请查看以下博客文章系列:
  • http://blog.dscpl.com.au/2016/01/roundup-of-docker-issues-when-hosting.html
  • 关于security - 在OpenShift中运行Nginx docker 容器的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38754592/

    相关文章:

    ubuntu - 用于将 SSL 请求代理到 Sinatra 服务器的 NGINX 配置

    nginx - 如何阻止 nginx 中的空用户代理?

    linux - 在 Ubuntu 18.04.2 LTS 上运行 docker

    docker - Nifi 容器正在运行但无法通过 UI 访问

    C# 可能不是安全应用程序的最佳选择?

    java - 通过Jsoup登录保存了吗?

    php - 指定了 Vagrantfile PHP v5.6 但安装了 v5.5

    security - CSRF陷入困境,withForm {}。invalidToken {}无法正常工作

    javascript - Web 服务 API key 和 Ajax - 保护 key

    docker - 在CentOS 7上将Docker从19.03.2降级到18.09.9