【问题标题】:Openshift - Applying RunOnlyAs SCC to pods within a deploymentOpenshift - 将 RunOnlyAs SCC 应用于部署中的 pod
【发布时间】:2018-02-06 15:35:25
【问题描述】:

我定义了一个 SCC,它允许 developer 用户以 UID 1015 运行容器:

    kind: SecurityContextConstraints
    apiVersion: v1
    metadata:
      name: developer
    allowPrivilegedContainer: false
    runAsUser:
      type: MustRunAs
      uid: 1015
    seLinuxContext: 
      type: MustRunAs
      uid: 1015
    users:
    - developer

当我直接以developer 用户身份创建 pod 时,此 SCC 工作正常:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-1-0
    spec:
      securityContext:
        runAsUser: 1015
      containers:
      - name: test-1-0
        image: test-image:1.0
        imagePullPolicy: "Always"
        volumeMounts:
        - name: secret-dir
          mountPath: "/secrets"
          readOnly: true
      volumes:
      - name: secret-dir
        secret:
          secretName: test-1.0-configs

但是,当我将此转换为部署时,我收到了错误消息。这是我的 YAML:

kind: "DeploymentConfig"
apiVersion: "v1"
metadata:
  name: "test-1-0"
spec:
  template: 
    metadata:
      labels:
        name: "test-1-0"
    spec:
      securityContext:
        runAsUser: 1015
      containers:
      - name: test-1-0
        image: test-image:1.0
        imagePullPolicy: "Always"
        volumeMounts:
        - name: secret-dir
          mountPath: "/secrets"
          readOnly: true
      volumes:
      - name: secret-dir
        secret:
          secretName: test-1.0-configs
  replicas: 2
  selector:
    name: "test-1-0"

我收到的错误:

Error creating: pods "test-1-0-1-" is forbidden: unable to validate against any security context constraint: [securityContext.runAsUser: Invalid value: 1015: UID on container test-1-0 does not match required range. Found 1015, required min: 1000050000 max: 1000059999]

就好像部署正在部署 pod,而不是我创建部署时使用的用户。有什么办法可以解决吗?

【问题讨论】:

  • 你已经试过了吗?:docs.openshift.com/enterprise/3.1/admin_guide/… + 通过 SSH 或登录到你的 OpenShift 主机 $ docker exec -i -t origin /bin/bash su - oc edit scc restricted # 更改 runAsUser。键入策略 RunAsAny
  • @FrancoRondini 您应该避免编辑原始的restricted SCC,因为您正在更改很多东西所依赖的默认值。 SCC 的原因是允许您创建不同的权限集并有选择地将它们应用于特定的服务帐户。覆盖系统提供的默认值总是一个坏主意。
  • 没关系,但 scc.seLinuxContext.uid 不是有效字段。
  • @GrahamDumpleton 好点!我写的内容是在介绍示例的一些教程/git repo 中提出的,但是您的说明非常有用。顺便说一句,我还打开了this question,我看到了你的评论,如果你能找到完整答案的时间,我将不胜感激。再次感谢。
  • 如果在其他问题中您在运行命令时遇到问题而没有明确引用配置文件,那么我可以提供帮助。通常你不需要关心主配置文件。如果您真的想了解它们的用途,最好阅读 docs.openshift.org/latest/welcome/index.html 上的 OpenShift 文档,因为除了它们决定集群的全局配置之外,没有简单的答案。

标签: deployment kubernetes openshift


【解决方案1】:

最好通过服务帐户指定要用于部署的 SCC。

首先创建 SCC。以我测试过的为例,我创建了 uid1000.json 包含。

{
    "apiVersion": "v1",
    "kind": "SecurityContextConstraints",
    "metadata": {
        "name": "uid1000"
    },
    "requiredDropCapabilities": [
        "KILL",
        "MKNOD",
        "SYS_CHROOT",
        "SETUID",
        "SETGID"
    ],
    "runAsUser": {
        "type": "MustRunAs",
        "uid": "1000"
    },
    "seLinuxContext": {
        "type": "MustRunAs"
    },
    "fsGroup": {
        "type": "MustRunAs"
    },
    "supplementalGroups": {
        "type": "RunAsAny"
    },
    "volumes": [
        "configMap",
        "downwardAPI",
        "emptyDir",
        "persistentVolumeClaim",
        "projected",
        "secret"
    ]
}

然后跑:

oc create -f uid1000.json --as system:admin

需要成为管理员才能做到这一点。

接下来我在目标项目中创建了一个服务帐户,仅用于运行需要此 SCC 的应用程序。

oc create serviceaccount runasuid1000

我现在说,作为这个服务帐户运行的任何东西都应该使用新的 SCC。

oc adm policy add-scc-to-user uid1000 -z runasuid1000 --as system:admin

再次需要成为管理员才能做到这一点。 -z 选项表示使用当前项目,因此请确保您使用的是正确的项目。

最后我修补了现有的部署配置。

oc patch dc/minimal-notebook --patch '{"spec":{"template":{"spec":{"serviceAccountName": "runasuid1000"}}}}'

如有必要,由于配置更改触发器被禁用,触发新部署:

oc rollout latest minimal-notebook

这将强制容器以 uid 1000 运行,覆盖图像甚至根据USER 定义应按其运行的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多