首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenShift上使用根权限启动pod

在OpenShift上使用根权限启动pod
EN

Stack Overflow用户
提问于 2021-07-27 10:40:47
回答 2查看 5.9K关注 0票数 2

我有一个图像,需要根特权才能启动。

现在,我正试图将其部署到OpenShift上。

这是我用来部署它的部署yaml

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xyz
  annotations:
   k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  selector:
    matchLabels:
      name: xyz
  template:
    metadata:
      labels:
        name: xyz
    spec:
      containers:
      - name: xyz
        image: 172.30.1.1:5000/myproject/xyz@sha256:bf3d219941ec0de7f52f6babbca23e03cc2611d327552b08f530ead9ec627ec2
        imagePullPolicy: Always
        securityContext:
          capabilities:
            add:
              - ALL
          privileged: false
          allowPrivilegeEscalation: false
          runAsUser: 0
        serviceAccount: runasanyuid
        serviceAccountName: runasanyuid
        hostNetwork: true
        resources:
          limits:
            memory: "12000Mi"
          requests:
            memory: "6000Mi"
        ports:
        - containerPort: 2102
        command:
        - /usr/sbin/sshd -D

请注意,我已经创建了一个名为“SCC”的scc,以运行我正在处理的任何UID项目中的pods,因为我知道OpenShift默认不允许pods以root权限启动。

代码语言:javascript
复制
kind: SecurityContextConstraints
apiVersion: v1
metadata:
  name: scc-admin
allowPrivilegedContainer: true
runAsUser:
  type: RunAsAny
seLinuxContext:
  type: RunAsAny
fsGroup:
  type: RunAsAny
supplementalGroups:
  type: RunAsAny
users:
- developer
groups:
- developer

这就是我在互联网上发现的解决我问题的方法,但我想它也没有起作用。

代码语言:javascript
复制
[root@centos72_base ~]# oc get scc
NAME               PRIV      CAPS      SELINUX     RUNASUSER          FSGROUP     SUPGROUP    PRIORITY   READONLYROOTFS   VOLUMES
anyuid             true      []        MustRunAs   RunAsAny           RunAsAny    RunAsAny    10         false            [configMap downwardAPI emptyDir hostPath persistentVolumeClaim projected secret]
hostaccess         false     []        MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <none>     false            [configMap downwardAPI emptyDir hostPath persistentVolumeClaim projected secret]
hostmount-anyuid   false     []        MustRunAs   RunAsAny           RunAsAny    RunAsAny    <none>     false            [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim projected secret]
hostnetwork        false     []        MustRunAs   MustRunAsRange     MustRunAs   MustRunAs   <none>     false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
nonroot            false     []        MustRunAs   MustRunAsNonRoot   RunAsAny    RunAsAny    <none>     false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
privileged         true      [*]       RunAsAny    RunAsAny           RunAsAny    RunAsAny    <none>     false            [*]
restricted         false     []        MustRunAs   MustRunAsRange     MustRunAs   RunAsAny    <none>     false            [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
scc-admin          true      []        RunAsAny    RunAsAny           RunAsAny    RunAsAny    <none>     false            [awsElasticBlockStore azureDisk azureFile cephFS cinder configMap downwardAPI emptyDir fc flexVolume flocker gcePersistentDisk gitRepo glusterfs iscsi nfs persistentVolumeClaim photonPersistentDisk portworxVolume projected quobyte rbd scaleIO secret storageOS vsphere]
[root@centos72_base ~]#

还请注意,使用下面的命令,这个映像对docker很好地工作。

代码语言:javascript
复制
docker run -d --network host --privileged --cap-add=ALL --security-opt seccomp=unconfined --name xyz 172.30.1.1:5000/myproject/xyz /usr/sbin/sshd -D
代码语言:javascript
复制
[root@centos72_base ~]# docker ps | grep xyz
793e339ff732   172.30.1.1:5000/myproject/xyz              "/usr/sbin/sshd -D"      About a minute ago   Up About a minute             xyz

在OpenShift上,我在上面提供的部署文件中获得了这些错误

创建

错误: "xyz-7966f58588-“被禁止:无法针对任何安全上下文约束进行验证:无效值: 0:必须在范围内: 1000140000,1000149999 capabilities.add:无效值:"ALL":功能可能不添加]

这意味着我必须移除

代码语言:javascript
复制
          capabilities:
            add:
              - ALL

代码语言:javascript
复制
          runAsUser: 0

启动吊舱

当我将它们从yaml文件中删除时,我会从吊舱中得到一个崩溃回环错误。

所以有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-27 19:07:12

您创建的SCC当前应用于用户developer和组developer

您的部署使用ServiceAccount runasanyuid

您需要编辑您的SecurityContextConstraint,允许ServiceAccount:

代码语言:javascript
复制
[...]
users:
- developer
- system:serviceaccount:<namespace-for-your-deployment>:runasanyuid
groups:
- developer

顺便提一句,如果您只需要运行一个特权容器,OpenShift不需要创建自己的SCC,而是附带可以重用的anyuid容器--只需将SA添加到它的用户列表中即可。

而最好的做法是避免特权容器。除非有一个很好的理由,否则您不应该以根用户身份运行进程--早在OCI之前,这是正确的。

如果您的应用程序需要在某个地方编写一些东西,您可以使用一些emptyDir卷。如果应用程序试图在特权端口上绑定,则应该能够重新配置它。如果您的应用程序抱怨无法解析其UID的用户名,则可以查看its包装器。慎重考虑,授予SecurityContextConstraints或PodSecurityPolicies的特权并不是常态,它们应该是例外。

如果您的Pod在作为非root用户运行时崩溃,请尝试检查其日志。如果这没有帮助,请尝试oc debug -n <namespace> pod/<podname>,它应该启动一个新的Pod,打开一个shell,在其中您可以自己执行它的入口点,可能尝试另一组选项,稍微改变配置,.直到你把它弄对。您甚至可以尝试从您的工作站docker run --user=12435679 xxx:传递一个随机的UID,看看您的容器/应用程序如何处理它。

票数 1
EN

Stack Overflow用户

发布于 2021-07-28 13:27:45

这就是我如何解决问题并解决它的方法:

在调试模式下,我使用

代码语言:javascript
复制
[root@centos72_base ~]# oc debug -n myproject pod/xyz-5b4875f8d7-n7m2g
Defaulting container name to xyz.
Use 'oc describe pod/xyz-5b4875f8d7-n7m2g-debug -n myproject' to see all of the containers in this pod.

Debugging with pod/xyz-5b4875f8d7-n7m2g-debug, original command: /usr/sbin/sshd -D
Waiting for pod to start ...
If you don't see a command prompt, try pressing enter.
sh-4.2# whoami
whoami: cannot find name for user ID 1000140000
sh-4.2$ 

我想这个吊舱不是带根特权运行的。

我必须检查我的吊舱正在工作的SCC所以我执行了

代码语言:javascript
复制
[root@centos72_base ~]# oc get pod xyz-5b4875f8d7-n7m2g -o yaml | grep openshift.io/scc
    openshift.io/scc: restricted

我看到我的荚仍然在受限SCC中,所以我不得不使用

代码语言:javascript
复制
[root@centos72_base ~]# oc adm policy add-scc-to-group privileged system:authenticated
scc "privileged" added to groups: ["system:authenticated"]
[root@centos72_base ~]# 

现在我可以看到它变成了特权(我知道它不是最好的实践,但我只是想确保吊舱能够运行,最好的做法是用非根特权运行荚)。

在再次运行部署之后,我再次检查SCC,发现它现在使用特权SCC运行。

代码语言:javascript
复制
[root@centos72_base ~]# oc get pod xyz-5b4875f8d7-n7m2g -o yaml | grep openshift.io/scc
    openshift.io/scc: privileged

然后,我在调试模式下进入pod,以检查我是否正在与root用户一起运行pod。

代码语言:javascript
复制
[root@centos72_base ~]# oc debug -n myproject pod/xyz-5b4875f8d7-n7m2g
Defaulting container name to xyz.
Use 'oc describe pod/xyz-5b4875f8d7-n7m2g-debug -n myproject' to see all of the containers in this pod.

Debugging with pod/xyz-5b4875f8d7-n7m2g-debug, original command: /usr/sbin/sshd -D
Waiting for pod to start ...
If you don't see a command prompt, try pressing enter.
sh-4.2# whoami
root
sh-4.2# 

我不建议使用它作为这个问题的默认解决方案,我只是使用它来测试并确保我的应用程序在OpenShift上工作。

以下是帮助我的命令列表:在调试模式下运行pod:

代码语言:javascript
复制
oc debug -n <project-name> pod/<pod-name>

在具有根优先级的调试模式下运行pod:

代码语言:javascript
复制
oc debug deployment/<deployment-name> --as-root -n <project-name>

列出您的安全上下文:

代码语言:javascript
复制
oc get scc

打开pod的yaml文件:

代码语言:javascript
复制
oc get pod <pod-name> -o yaml 

若要列出其scc:

代码语言:javascript
复制
oc get pod <pod-name> -o yaml | grep openshift.io/scc

若要设置默认scc,请执行以下操作:

代码语言:javascript
复制
oc adm policy add-scc-to-group <scc-name> system:authenticated
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68543425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档