关于OpenShift镜像使用的uid问题
在客户那里很多时候遇到过外部的image作为pod运行后出现的各种因为权限访问导致的失败。找到官方文档对这个问题有一些说明。
https://docs.openshift.com/container-platform/3.11/creating_images/guidelines.html
默认情况下,OpenShift容器平台使用任意分配的用户ID(Arbitrary User ID)运行容器。
这提供了额外安全性,避免了由于容器引擎漏洞而导致逃逸容器的进程,从而实现了对主机节点的升级权限。
为了支持image以任意用户身份运行,映像中的进程可能写入的目录和文件应归根组所有,并且可由该组读取/写入。 要执行的文件还应该具有组执行权限。
在Dockerfile中添加以下内容可设置目录和文件许可权,以允许根组中的用户在构建的映像中访问它们:
RUN chgrp -R 0 /some/directory && \ chmod -R g=u /some/directory
也就是说,你需要在容器中用到的目录,设置group为0(根组),同时讲用户的权限设置成组的权限去实现。
因为容器用户始终是根组的成员,所以容器用户可以读取和写入这些文件。
根组没有任何特殊权限(与根用户不同),因此这种安排没有安全性问题。
另外,容器中运行的进程不得侦听特权端口(低于1024的端口),因为它们没有以特权用户身份运行。
如果需要容器中的用户以特权用户运行,可以做如下设置
oc create serviceaccount runasanyuid oc adm policy add-scc-to-user anyuid -z runasanyuid -ntest oc adm policy add-scc-to-user privileged -z runasanyuid -ntest
然后将runasanyuid的SA设置到deployment中。