apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
# ...
allowedCapabilities:
- SETFCAP
# ...
fsGroup:
type: MustRunAs
# ...
OpenShift Pipelines 启动的 Pod 的默认服务帐户是 `pipeline`。与 `pipeline` 服务帐户关联的安全上下文约束 (SCC) 是 `pipelines-scc`。`pipelines-scc` SCC 基于 `anyuid` SCC,其细微差别如下面的 YAML 规范中所定义。
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
# ...
allowedCapabilities:
- SETFCAP
# ...
fsGroup:
type: MustRunAs
# ...
此外,作为 OpenShift Pipelines 的一部分提供的 `Buildah` 任务使用 `vfs` 作为默认存储驱动程序。
您可以配置 OpenShift Pipelines 为管道运行和任务运行创建的 Pod 的安全上下文。您可以进行以下更改:
更改所有 Pod 的默认和最大 SCC
更改为特定命名空间中创建的管道运行和任务运行的 Pod 的默认 SCC
配置特定管道运行或任务运行以使用自定义 SCC 和服务帐户
运行 `buildah` 以确保所有镜像都能构建的最简单方法是在具有 `privileged` SCC 的 Pod 中以 root 用户身份运行它。有关使用更严格的安全设置运行 `buildah` 的说明,请参见 以非 root 用户身份构建容器镜像。 |
您可以为 OpenShift Pipelines 为任务运行和管道运行创建的所有 Pod 配置默认安全上下文约束 (SCC)。您还可以配置最大 SCC,这是可以在任何命名空间中为这些 Pod 配置的限制最小的 SCC。
通过输入以下命令来编辑 `TektonConfig` 自定义资源 (CR):
$ oc edit TektonConfig config
在规范中设置默认和最大 SCC,如下例所示:
apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
name: config
spec:
# ...
platforms:
openshift:
scc:
default: "restricted-v2" (1)
maxAllowed: "privileged" (2)
1 | spec.platforms.openshift.scc.default 指定 OpenShift Pipelines 附加到用于工作负载的服务帐户 (SA) 的默认 SCC,默认情况下为 pipeline SA。此 SCC 用于所有 pipeline run 和 task run pod。 |
2 | spec.platforms.openshift.scc.maxAllowed 指定您可以为任何命名空间中的 pipeline run 和 task run pod 配置的限制最少的 SCC。当您在特定的 pipeline run 或 task run 中配置自定义 SA 和 SCC 时,此设置不适用。 |
您可以为 OpenShift Pipelines 为您在特定命名空间中创建的 pipeline run 和 task run 创建的所有 pod 配置安全上下文约束 (SCC)。此 SCC 的限制不能小于您使用 TektonConfig
CR 在 spec.platforms.openshift.scc.maxAllowed
说明中配置的最大 SCC。
为命名空间设置 operator.tekton.dev/scc
注解,其值为 SCC 的名称。
apiVersion: v1
kind: Namespace
metadata:
name: test-namespace
annotations:
operator.tekton.dev/scc: nonroot
当使用与默认 pipelines
服务帐户关联的 pipelines-scc
安全上下文约束 (SCC) 时,pipeline run 和 task run pod 可能会遇到超时。这是因为在默认的 pipelines-scc
SCC 中,fsGroup.type
参数设置为 MustRunAs
。
有关 pod 超时的更多信息,请参阅 BZ#1995779。 |
为了避免 pod 超时,您可以创建一个自定义 SCC,并将 fsGroup.type
参数设置为 RunAsAny
,并将其与自定义服务帐户关联。
最佳实践是为 pipeline run 和 task run 使用自定义 SCC 和自定义服务帐户。这种方法允许更大的灵活性,并且在升级期间修改默认值时不会中断运行。 |
定义一个将 fsGroup.type
参数设置为 RunAsAny
的自定义 SCC
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
annotations:
kubernetes.io/description: my-scc is a close replica of anyuid scc. pipelines-scc has fsGroup - RunAsAny.
name: my-scc
allowHostDirVolumePlugin: false
allowHostIPC: false
allowHostNetwork: false
allowHostPID: false
allowHostPorts: false
allowPrivilegeEscalation: true
allowPrivilegedContainer: false
allowedCapabilities: null
defaultAddCapabilities: null
fsGroup:
type: RunAsAny
groups:
- system:cluster-admins
priority: 10
readOnlyRootFilesystem: false
requiredDropCapabilities:
- MKNOD
runAsUser:
type: RunAsAny
seLinuxContext:
type: MustRunAs
supplementalGroups:
type: RunAsAny
volumes:
- configMap
- downwardAPI
- emptyDir
- persistentVolumeClaim
- projected
- secret
创建自定义 SCC
my-scc
SCC$ oc create -f my-scc.yaml
创建一个自定义服务帐户
fsgroup-runasany
服务帐户$ oc create serviceaccount fsgroup-runasany
将自定义 SCC 与自定义服务帐户关联
my-scc
SCC 与 fsgroup-runasany
服务帐户关联$ oc adm policy add-scc-to-user my-scc -z fsgroup-runasany
如果要将自定义服务帐户用于特权任务,则可以通过运行以下命令将 privileged
SCC 与自定义服务帐户关联
privileged
SCC 与 fsgroup-runasany
服务帐户关联$ oc adm policy add-scc-to-user privileged -z fsgroup-runasany
在 pipeline run 和 task run 中使用自定义服务帐户
fsgroup-runasany
自定义服务帐户的 pipeline run YAMLapiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: <pipeline-run-name>
spec:
pipelineRef:
name: <pipeline-cluster-task-name>
taskRunTemplate:
serviceAccountName: 'fsgroup-runasany'
fsgroup-runasany
自定义服务帐户的 task run YAMLapiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: <task-run-name>
spec:
taskRef:
name: <cluster-task-name>
taskRunTemplate:
serviceAccountName: 'fsgroup-runasany'