在 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
可以映射到容器中 0
的 uid
,因此仍然具有 运行 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 时可能出现的问题,有查看系列博客文章:
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
可以映射到容器中 0
的 uid
,因此仍然具有 运行 root
权限。要允许平台正确验证您的图片未设置为 运行 和 root
,您应该使用 uid
而不是 username
。那应该是除 0
.
第二个问题是,虽然 运行宁作为特定的非 root
用户在您自己的 Docker 服务实例中可能没问题,但当您考虑多个租户环境,无论是针对不同的用户,还是不同的应用程序,重要的是不同的应用程序不能以任何方式相互访问。
在多租户环境中,您可以做的最安全的事情是 运行 所有应用程序都属于一个特定帐户,或者在不同的项目中,作为不同的用户。这是重要的原因之一是从持久卷上的数据访问的角度来看。如果所有内容都 运行 以同一用户身份运行,并且它设法访问了不应该访问的持久卷,则它可以看到来自其他应用程序的数据。
就 OpenShift 而言,默认情况下它 运行 具有最高级别的安全性来保护您。因此,一个项目中的应用程序 运行 与另一个项目中的应用程序具有不同的用户。
如果您拥有适当的权限,您可以减少安全措施并覆盖它,但只有当您确信您正在执行的应用程序具有低风险配置文件时,您才应该进行更改。也就是说,您不会从 Internet 上随意抓取一些您一无所知的 Docker 图片,然后让它 运行 成为 root。
要了解有关更改特定应用程序的安全上下文约束的更多信息,请先阅读:
您可以覆盖默认值,并说图像可以 运行 作为它在 Dockerfile
中声明的用户,甚至可以 运行 作为 root
如果需要的话.
如果想要最好的安全性,更好的方法是构建 Docker 映像,以便它可以 运行 作为任何用户而不仅仅是特定用户。
如何执行此操作的一般准则是:
- 在容器中创建一个新用户帐户以运行 应用程序作为。将此帐户的主要组设为组 ID
0
。也就是说,它的组将是root
的组,但用户不会。它需要是组 ID0
,因为如果 运行 宁作为一个在 UNIXpasswd
文件中没有条目的用户,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 时可能出现的问题,有查看系列博客文章: