保护 OpenShift Pipelines
OpenShift Pipelines 的安全功能
摘要
第 1 章 为 OpenShift Pipelines 提供链安全使用 Tekton 链
Tekton Chains 是一个 Kubernetes 自定义资源定义(CRD)控制器。您可以使用它来管理使用 Red Hat OpenShift Pipelines 创建的任务和管道的供应链安全。
默认情况下,Tekton Chains 会观察 OpenShift Container Platform 集群中的所有任务运行执行。当任务运行完成时,Tekton Chains 会获取任务运行的快照。然后,它会将快照转换为一个或多个标准有效负载格式,最后签署并存储所有工件。
要捕获有关任务运行的信息,Tekton Chains 使用 Result
对象。当对象不可用时,Tekton 会链 OCI 镜像的 URL 和合格摘要。
1.1. 主要特性
-
您可以使用如
cosign
和skopeo
等加密密钥为任务运行、任务运行结果和 OCI registry 镜像签名。 -
您可以使用"测试"格式,如
in-toto
。 - 您可以使用 OCI 存储库作为存储后端安全存储签名和签名工件。
1.2. 配置 Tekton 链
Red Hat OpenShift Pipelines Operator 默认安装 Tekton 链。您可以通过修改 TektonConfig
自定义资源来配置 Tekton 链;Operator 会自动应用您在此自定义资源中所做的更改。
要编辑自定义资源,请使用以下命令:
oc edit TektonConfig config
$ oc edit TektonConfig config
自定义资源包含一个 chain:
数组。您可以在这个阵列中添加任何支持的配置参数,如下例所示:
apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: addon: {} chain: artifacts.taskrun.format: tekton config: {}
apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
name: config
spec:
addon: {}
chain:
artifacts.taskrun.format: tekton
config: {}
1.2.1. Tekton Chains 配置支持的参数
集群管理员可以使用各种支持的参数键和值来配置任务运行、OCI 镜像和存储的规格。
1.2.1.1. 任务运行工件支持的参数
键 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| 存储任务运行有效负载的格式。 |
|
|
|
任务运行签名的存储后端。您可以将多个后端指定为用逗号分开的列表,如 |
|
|
| 用于签名任务运行有效负载的签名后端。 |
|
|
slsa/v1
是 in-toto
的别名,用于向后兼容。
1.2.1.2. 管道运行工件支持的参数
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| 存储管道运行有效负载的格式。 |
|
|
|
用于存储管道运行签名的存储后端。您可以将多个后端指定为用逗号分开的列表,如 |
|
|
| 用于签名管道运行有效负载的签名后端。 |
|
|
|
当此参数为 |
|
|
-
slsa/v1
是in-toto
的别名,用于向后兼容。 -
对于
grafeas
存储后端,只支持 Container Analysis。您无法在 Tekton 链的当前版本中配置grafeas
服务器地址。
1.2.1.3. OCI 工件支持的参数
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| 存储 OCI 有效负载的格式。 |
|
|
|
用于存储 OCI 签名的存储后端。您可以将多个后端指定为用逗号分开的列表,如 |
|
|
| 用于签名 OCI 有效负载的签名后端。 |
|
|
1.2.1.4. KMS 符号支持的参数
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
|
对要在 |
支持的方案: |
1.2.1.5. 支持的存储参数
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| 存储的 GCS 存储桶 | ||
| 用于存储 OCI 签名和测试的 OCI 存储库。 |
如果您将其中一个工件存储后端配置为 | |
| 为 in-toto attestations 设置的构建器 ID |
| |
|
in-toto attestation 的构建类型。当此参数为 |
|
|
如果您启用了 docdb
存储方法用于任何工件,请配置 docstore 存储选项。有关 go-cloud docstore URI 格式的更多信息,请参阅文档 存储软件包文档。Red Hat OpenShift Pipelines 支持以下 docstore 服务:
-
firestore
-
dynamodb
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
|
对 |
| |
|
用于 | ||
|
名为 |
示例值: |
如果您为任何工件启用 grafeas
存储方法,请配置 Grafeas 存储选项。有关 Grafeas 备注和发生的更多信息,请参阅 Grafeas 概念。
要创建并行,Red Hat OpenShift Pipelines 必须首先创建用于链接并行的备注。Red Hat OpenShift Pipelines 创建两种类型的发生: ATTESTATION
Occurrence 和 BUILD
Occurrence。
Red Hat OpenShift Pipelines 使用可配置的 noteid
作为备注名称的前缀。它附加 ATTESTATION
备注的后缀 -simplesigning
,以及 BUILD
备注的后缀 -intoto
。如果没有配置 noteid
字段,Red Hat OpenShift Pipelines 将使用 tekton-<NAMESPACE>
作为前缀。
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| Grafeas 服务器用于存储发生的 OpenShift Container Platform 项目。 | ||
| 可选:用于所有创建备注的名称的前缀。 | 没有空格的字符串。 | |
|
可选:Grafeas |
|
另外,您还可以在测试时启用额外的二进制透明度上传。
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| 启用或禁用自动二进制透明度上传。 |
|
|
| 如果启用,用于上传二进制透明度的 URL。 |
|
如果将 transparency.enabled
设置为 manual
,则只有带有以下注解的任务和管道运行上传到透明度日志中:
chains.tekton.dev/transparency-upload: "true"
chains.tekton.dev/transparency-upload: "true"
如果配置 x509
签名后端,您可以选择使用 Fulcio 启用无密钥签名。
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
| 从 Fulcio 启用或禁用请求自动证书。 |
|
|
| 请求证书的 Fulcio 地址(如果启用)。 |
| |
| 预期的 OIDC 签发者。 |
| |
| 从中请求 ID 令牌的供应商。 |
| Red Hat OpenShift Pipelines 会尝试使用每个供应商 |
| 包含 ID 令牌的文件的路径。 | ||
|
TUF 服务器的 URL。必须存在 |
|
如果您配置 kms
签名后端,请根据需要设置 KMS 配置,包括 OIDC 和 Spire。
参数 | 描述 | 支持的值 | 默认值 |
---|---|---|---|
|
KMS 服务器的 URI ( | ||
|
KMS 服务器的身份验证令牌 ( | ||
|
包含 KMS 服务器的身份验证令牌的完整路径名( |
示例值: | |
|
OIDC 身份验证的路径(例如,Vault 为 | ||
| OIDC 身份验证的角色。 | ||
|
KMS 令牌的 Spire 套接字的 URI (例如: | ||
| 从 Spire 请求 SVID 的受众。 |
1.2.2. 创建并挂载 Mongo 服务器 URL secret
您可以使用机密提供用于 docdb
存储(MONGO_SERVER_URL
)的 Mongo 服务器 URL 的值。您必须创建此 secret,将其挂载到 Tekton Chains 控制器上,并将 storage.docdb.mongo-server-url-dir
参数设置为挂载 secret 的目录。
先决条件
-
已安装 OpenShift CLI (
oc
)实用程序。 -
您可以使用
openshift-pipelines
命名空间的管理权限登录到 OpenShift Container Platform 集群。
流程
输入以下命令,使用
MONGO_SERVER_URL
文件创建一个名为mongo-url
的 secret,该文件包含 Mongo 服务器 URL 值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic mongo-url -n tekton-chains \ --from-file=MONGO_SERVER_URL=<path>/MONGO_SERVER_URL
$ oc create secret generic mongo-url -n tekton-chains \ --from-file=MONGO_SERVER_URL=<path>/MONGO_SERVER_URL
1 - 1
- 包含 Mongo 服务器 URL 值的
MONGO_SERVER_URL
文件的完整路径和名称。
在
TektonConfig
自定义资源(CR)的chain
部分中,配置 Tekton Chains 控制器上的 secret,并将storage.docdb.mongo-server-url-dir
参数设置为挂载 secret 的目录,如下例所示:挂载
mongo-url
secret 的配置示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false storage.docdb.mongo-server-url-dir: /tmp/mongo-url options: deployments: tekton-chains-controller: spec: template: spec: containers: - name: tekton-chains-controller volumeMounts: - mountPath: /tmp/mongo-url name: mongo-url volumes: - name: mongo-url secret: secretName: mongo-url # ...
apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false storage.docdb.mongo-server-url-dir: /tmp/mongo-url options: deployments: tekton-chains-controller: spec: template: spec: containers: - name: tekton-chains-controller volumeMounts: - mountPath: /tmp/mongo-url name: mongo-url volumes: - name: mongo-url secret: secretName: mongo-url # ...
1.2.3. 创建并挂载 KMS 身份验证令牌 secret
您可以使用 secret 为 KMS 服务器提供身份验证令牌。例如,如果 KMS 供应商是 Hashicorp Vault,则 secret 必须包含 VAULT_TOKEN
的值。
您必须创建此 secret,将其挂载到 Tekton Chains 控制器上,并将 signers.kms.auth.token-path
参数设置为身份验证令牌文件的完整路径。
先决条件
-
已安装 OpenShift CLI (
oc
)实用程序。 -
您可以使用
openshift-pipelines
命名空间的管理权限登录到 OpenShift Container Platform 集群。
流程
输入以下命令,使用
KMS_AUTH_TOKEN
文件创建一个名为kms-secrets
的 secret,该文件包含 KMS 服务器的身份验证令牌:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic kms-secrets -n tekton-chains \ --from-file=KMS_AUTH_TOKEN=<path_and_name>
$ oc create secret generic kms-secrets -n tekton-chains \ --from-file=KMS_AUTH_TOKEN=<path_and_name>
1 - 1
- 包含 KMS 服务器的身份验证令牌的完整路径和名称,例如
/home/user/KMS_AUTH_TOKEN
。您可以使用另一个文件名而不是KMS_AUTH_TOKEN
。
在
TektonConfig
自定义资源(CR)的chain
部分中,在 Tekton Chains 控制器上配置 secret,并将signers.kms.auth.token-path
参数设置为身份验证令牌文件的完整路径,如下例所示:挂载
kms-secrets
secret 的配置示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false signers.kms.auth.token-path: /etc/kms-secrets/KMS_AUTH_TOKEN options: deployments: tekton-chains-controller: spec: template: spec: containers: - name: tekton-chains-controller volumeMounts: - mountPath: /etc/kms-secrets name: kms-secrets volumes: - name: kms-secrets secret: secretName: kms-secrets # ...
apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false signers.kms.auth.token-path: /etc/kms-secrets/KMS_AUTH_TOKEN options: deployments: tekton-chains-controller: spec: template: spec: containers: - name: tekton-chains-controller volumeMounts: - mountPath: /etc/kms-secrets name: kms-secrets volumes: - name: kms-secrets secret: secretName: kms-secrets # ...
1.2.4. 启用 Tekton 链仅在所选命名空间中运行
默认情况下,Tekton Chains 控制器监控所有命名空间中的所有资源。您可以自定义 Tekton 链,以仅在特定命名空间中运行,这对操作提供了精细的控制。
先决条件
-
使用
cluster-admin
权限登录到 OpenShift Container Platform 集群。
流程
在
TektonConfig
CR 中,在chain
部分中,添加 the-namespace=
参数,使其包含控制器应该监控的命名空间。以下示例显示了 Tekton Chains 控制器的配置,以仅监控
dev
和test
命名空间中的资源,相应地过滤PipelineRun
和TaskRun
对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: chain: disabled: false options: deployments: tekton-chains-controller: spec: template: spec: containers: - args: - --namespace=dev, test name: tekton-chains-controller
apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: chain: disabled: false options: deployments: tekton-chains-controller: spec: template: spec: containers: - args: - --namespace=dev, test
1 name: tekton-chains-controller
- 1
- 如果没有提供或留空,则控制器默认监视所有命名空间。
1.3. 在 Tekton Chains 中签名数据的 secret
集群管理员可以生成密钥对,并使用 Tekton 链来使用 Kubernetes secret 为工件签名。要使 Tekton 链正常工作,加密的密钥和密码必须存在,作为 openshift-pipelines
命名空间中的 signing-secrets
secret 的一部分。
目前,Tekton 链支持 x509
和 cosign
签名方案。
只使用一个受支持的签名方案。
x509 签名方案
要将 x509
签名方案与 Tekton 链搭配使用,您必须满足以下要求:
-
使用
x509.pem
结构将私钥存储在signing-secrets
中。 -
将私钥存储为未加密的
PKCS #8
PEM 文件。 -
密钥是
ed25519
或ecdsa
类型。
cosign 签名方案
要将 cosign
签名方案与 Tekton 链搭配使用,您必须满足以下要求:
-
使用
cosign.key
结构将私钥存储在signing-secrets
中。 -
使用
cosign.password
结构将密码存储在signing-secrets
中。 -
将私钥存储为
ENCRYPTED COSIGN PRIVATE KEY
类型的加密 PEM 文件。
1.3.1. 使用 TektonConfig CR 生成 x509 密钥对
要将 x509
签名方案用于 Tekton Chains secret,您必须生成 x509
密钥对。
您可以通过将 TektonConfig
自定义资源(CR)中的 generateSigningSecret
字段设置为 true
来生成 x509
密钥对。Red Hat OpenShift Pipelines Operator 生成 ecdsa
类型密钥对: x509.pem
私钥和 x509-pub.pem
公钥。Operator 将密钥存储在 openshift-pipelines
命名空间中的 signing-secrets
secret 中。
如果将 generateSigningSecret
字段设置为 false
,Red Hat OpenShift Pipelines Operator 会覆盖并破坏 signing-secrets
secret 中的任何值。确保您在 secret 之外存储
x509-pub.pem
公钥,以防止密钥被删除。Operator 可以使用后续阶段的密钥验证工件。
Red Hat OpenShift Pipelines Operator 不提供以下功能来限制潜在的安全问题:
- 密钥轮转
- 审计密钥使用
- 正确的访问控制键
先决条件
-
已安装 OpenShift CLI (
oc
)实用程序。 -
您可以使用
openshift-pipelines
命名空间的管理权限登录到 OpenShift Container Platform 集群。
流程
运行以下命令来编辑
TektonConfig
CR:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc edit TektonConfig config
$ oc edit TektonConfig config
在
TektonConfig
CR 中,将generateSigningSecret
值设置为true
:使用 TektonConfig CR 创建 ecdsa 密钥对示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false generateSigningSecret: true # ...
apiVersion: operator.tekton.dev/v1 kind: TektonConfig metadata: name: config spec: # ... chain: disabled: false generateSigningSecret: true
1 # ...
- 1
- 默认值为
false
。将值设为true
会生成ecdsa
密钥对。
1.3.2. 使用 cosign 工具签名
您可以使用 cosign
工具使用带有 Tekton 链的 cosign
签名方案。
先决条件
- 已安装 Cosign 工具。有关安装 Cosign 工具的详情,请参考有关 Cosign 的 Sigstore 文档。
流程
运行以下命令,生成
cosign.key
和cosign.pub
密钥对:Copy to Clipboard Copied! Toggle word wrap Toggle overflow cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
Cosign 会提示您输入密码,然后创建一个 Kubernetes secret。
-
将加密的
cosign.key
私钥和cosign.password
解密密码存储在signing-secrets
Kubernetes secret 中。确保私钥存储为ENCRYPTED COSIGN PRIVATE KEY
类型的加密 PEM 文件。
1.3.3. 使用 skopeo 工具签名
您可以使用 skopeo
工具生成密钥,并在带有 Tekton 链的 cosign
签名方案中使用它们。
先决条件
- 已安装 skopeo 工具。
流程
运行以下命令生成公钥/私钥对:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow skopeo generate-sigstore-key --output-prefix <mykey>
$ skopeo generate-sigstore-key --output-prefix <mykey>
1 - 1
- 将
<mykey>
替换为您选择的密钥名称。
Skopeo 会提示您输入私钥的密码短语,然后创建名为
<mykey>.private
和<mykey>.pub
的密钥文件。运行以下命令,使用
base64
工具对<mykey>.pub
文件进行编码:Copy to Clipboard Copied! Toggle word wrap Toggle overflow base64 -w 0 <mykey>.pub > b64.pub
$ base64 -w 0 <mykey>.pub > b64.pub
运行以下命令,使用
base64
工具对<mykey>.private
文件进行编码:Copy to Clipboard Copied! Toggle word wrap Toggle overflow base64 -w 0 <mykey>.private > b64.private
$ base64 -w 0 <mykey>.private > b64.private
运行以下命令,使用
base64
工具对 passhprase 进行编码:Copy to Clipboard Copied! Toggle word wrap Toggle overflow echo -n '<passphrase>' | base64 -w 0 > b64.passphrase
$ echo -n '<passphrase>' | base64 -w 0 > b64.passphrase
1 - 1
- 将
<passphrase>
替换为用于密钥对的密码短语。
运行以下命令,在
openshift-pipelines
命名空间中创建signing-secrets
secret:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic signing-secrets -n openshift-pipelines
$ oc create secret generic signing-secrets -n openshift-pipelines
运行以下命令来编辑
signing-secrets
secret:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc edit secret -n openshift-pipelines signing-secrets
$ oc edit secret -n openshift-pipelines signing-secrets
使用以下方法在 secret 的数据中添加编码的密钥:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 data: cosign.key: <Encoded <mykey>.private> cosign.password: <Encoded passphrase> cosign.pub: <Encoded <mykey>.pub> immutable: true kind: Secret metadata: name: signing-secrets # ... type: Opaque
apiVersion: v1 data: cosign.key: <Encoded <mykey>.private>
1 cosign.password: <Encoded passphrase>
2 cosign.pub: <Encoded <mykey>.pub>
3 immutable: true kind: Secret metadata: name: signing-secrets # ... type: Opaque
1.3.4. 解决 "secret already exists" 错误
如果 signing-secret
secret 已经填充,则创建此 secret 的命令可能会输出以下出错信息:
Error from server (AlreadyExists): secrets "signing-secrets" already exists
Error from server (AlreadyExists): secrets "signing-secrets" already exists
您可以通过删除 secret 来解决这个问题。
流程
运行以下命令来删除
signing-secret
secret:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete secret signing-secrets -n openshift-pipelines
$ oc delete secret signing-secrets -n openshift-pipelines
- 重新创建密钥对,并使用您首选的签名方案将其存储在机密中。
1.4. 对 OCI registry 进行身份验证
在将签名推送到 OCI Registry 之前,集群管理员必须配置 Tekton 链,以便与 registry 进行身份验证。Tekton Chains 控制器使用与任务运行相同的服务帐户。要设置具有所需凭证(push)到 OCI registry 的服务帐户,请执行以下步骤:
流程
设置 Kubernetes 服务帐户的命名空间和名称。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export NAMESPACE=<namespace> export SERVICE_ACCOUNT_NAME=<service_account>
$ export NAMESPACE=<namespace>
1 $ export SERVICE_ACCOUNT_NAME=<service_account>
2 创建 Kubernetes secret。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret registry-credentials \ --from-file=.dockerconfigjson \ --type=kubernetes.io/dockerconfigjson \ -n $NAMESPACE
$ oc create secret registry-credentials \ --from-file=.dockerconfigjson \
1 --type=kubernetes.io/dockerconfigjson \ -n $NAMESPACE
- 1
- 使用 Docker 配置文件的路径替换。默认路径为
~/.docker/config.json
。
授予服务帐户对 secret 的访问权限。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch serviceaccount $SERVICE_ACCOUNT_NAME \ -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
$ oc patch serviceaccount $SERVICE_ACCOUNT_NAME \ -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
如果对 Red Hat OpenShift Pipelines 分配到所有任务的默认
pipeline
服务帐户进行补丁,Red Hat OpenShift Pipelines Operator 将覆盖服务帐户。作为最佳实践,您可以执行以下步骤:创建单独的服务帐户,以分配给用户的任务运行。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create serviceaccount <service_account_name>
$ oc create serviceaccount <service_account_name>
通过设置任务运行模板中的
serviceaccountname
字段的值,将服务帐户关联到运行任务。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 spec: taskRunTemplate: serviceAccountName: build-bot taskRef: name: build-push ...
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 spec: taskRunTemplate: serviceAccountName: build-bot
1 taskRef: name: build-push ...
- 1
- 使用新创建的服务帐户的名称替换。
1.5. 创建和验证任务运行签名而无需任何其他身份验证
要验证使用 Tekton 链与任何其他身份验证一起运行的任务的签名,请执行以下任务:
-
生成加密的
x509
或cosign
密钥对,并将它存储为 Kubernetes secret。 - 配置 Tekton Chains 后端存储。
- 创建任务运行,为它签名并将签名和有效负载存储为任务运行自身时的注解。
- 从已签名任务运行中检索签名和有效负载。
- 验证任务运行的签名。
先决条件
确保在集群中安装了以下组件:
- Red Hat OpenShift Pipelines Operator
- Tekton Chains
- Cosign
流程
-
生成加密的
x509
或cosign
密钥对。有关创建密钥对并将其保存为 secret 的更多信息,请参阅 "Secrets for signed data in Tekton Chains"。 在 Tekton Chains 配置中,禁用 OCI 存储,并将任务运行存储和格式设置为
tekton
。在TektonConfig
自定义资源中设置以下值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: # ... chain: artifacts.oci.storage: "" artifacts.taskrun.format: tekton artifacts.taskrun.storage: tekton # ...
apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: # ... chain: artifacts.oci.storage: "" artifacts.taskrun.format: tekton artifacts.taskrun.storage: tekton # ...
有关使用
TektonConfig
自定义资源配置 Tekton 链的更多信息,请参阅"配置 Tekton 链"。要重启 Tekton Chains 控制器以确保应用了修改后的配置,请输入以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete po -n openshift-pipelines -l app=tekton-chains-controller
$ oc delete po -n openshift-pipelines -l app=tekton-chains-controller
输入以下命令来创建任务运行:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml
$ oc create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml
1 - 1
- 将示例 URI 替换为指向任务运行的 URI 或文件路径。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow taskrun.tekton.dev/build-push-run-output-image-qbjvh created
taskrun.tekton.dev/build-push-run-output-image-qbjvh created
输入以下命令来检查步骤的状态。等待进程完成。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tkn tr describe --last
$ tkn tr describe --last
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow [...truncated output...] NAME STATUS ∙ create-dir-builtimage-9467f Completed ∙ git-source-sourcerepo-p2sk8 Completed ∙ build-and-push Completed ∙ echo Completed ∙ image-digest-exporter-xlkn7 Completed
[...truncated output...] NAME STATUS ∙ create-dir-builtimage-9467f Completed ∙ git-source-sourcerepo-p2sk8 Completed ∙ build-and-push Completed ∙ echo Completed ∙ image-digest-exporter-xlkn7 Completed
要从存储为
base64
编码注解的对象检索签名,请输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" | base64 -d > sig
$ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" | base64 -d > sig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export TASKRUN_UID=$(tkn tr describe --last -o jsonpath='{.metadata.uid}')
$ export TASKRUN_UID=$(tkn tr describe --last -o jsonpath='{.metadata.uid}')
- 要使用您创建的公钥验证签名,请输入以下命令:
cosign verify-blob-attestation --insecure-ignore-tlog --key path/to/cosign.pub --signature sig --type slsaprovenance --check-claims=false /dev/null
$ cosign verify-blob-attestation --insecure-ignore-tlog --key path/to/cosign.pub --signature sig --type slsaprovenance --check-claims=false /dev/null
- 1
- 将
path/to/cosign.pub
替换为公钥文件的路径名。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verified OK
Verified OK
1.6. 使用 Tekton 链来签名和验证镜像并证明
集群管理员可以通过执行以下任务来使用 Tekton 链来签名和验证镜像和验证镜像:
-
生成加密的
x509
或cosign
密钥对,并将它存储为 Kubernetes secret。 - 为 OCI registry 设置身份验证,以在测试过程中存储镜像、镜像签名和签名的镜像。
- 配置 Tekton 链以生成和签署认可。
- 在任务运行中,使用 Kaniko 创建镜像。
- 验证已签名的镜像及已签名证明。
先决条件
确保在集群中安装了以下工具:
流程
-
生成加密的
x509
或cosign
密钥对。有关创建密钥对并将其保存为 secret 的更多信息,请参阅 "Secrets for signed data in Tekton Chains"。 为镜像 registry 配置身份验证。
- 要将 Tekton Chains 控制器配置为将签名推送到 OCI registry,请使用与任务运行服务帐户关联的凭证。如需更多信息,请参阅"授权到 OCI registry"部分。
要为构建并推送到 registry 的 Kaniko 任务配置身份验证,请创建一个包含所需凭证的 docker
config.json
文件的 Kubernetes secret。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic <docker_config_secret_name> \ --from-file <path_to_config.json>
$ oc create secret generic <docker_config_secret_name> \
1 --from-file <path_to_config.json>
2
通过在
chains-config
对象中设置artifacts.taskrun.format
、artifacts.taskrun.storage
和transparency.enabled
参数来配置 Tekton 链 :Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.format": "in-toto"}}' oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.storage": "oci"}}' oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"transparency.enabled": "true"}}'
$ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.format": "in-toto"}}' $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.storage": "oci"}}' $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"transparency.enabled": "true"}}'
启动 Kaniko 任务。
将 Kaniko 任务应用到集群。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc apply -f examples/kaniko/kaniko.yaml
$ oc apply -f examples/kaniko/kaniko.yaml
1 - 1
- 使用 Kaniko 任务的 URI 或文件路径替换。
设置适当的环境变量。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export REGISTRY=<url_of_registry> export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json>
$ export REGISTRY=<url_of_registry>
1 $ export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json>
2 启动 Kaniko 任务。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tkn task start --param IMAGE=$REGISTRY/kaniko-chains --use-param-defaults --workspace name=source,emptyDir="" --workspace name=dockerconfig,secret=$DOCKERCONFIG_SECRET_NAME kaniko-chains
$ tkn task start --param IMAGE=$REGISTRY/kaniko-chains --use-param-defaults --workspace name=source,emptyDir="" --workspace name=dockerconfig,secret=$DOCKERCONFIG_SECRET_NAME kaniko-chains
观察此任务的日志,直到所有步骤都完成。身份验证成功后,最终镜像将推送到
$REGISTRY/kaniko-chains
。
等待一分钟,以允许 Tekton 链生成证据并对其进行签名,然后在任务运行时检查
chains.tekton.dev/signed=true
注解的可用性。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get tr <task_run_name> \ -o json | jq -r .metadata.annotations
$ oc get tr <task_run_name> \
1 -o json | jq -r .metadata.annotations { "chains.tekton.dev/signed": "true", ... }
- 1
- 使用任务运行的名称替换。
验证镜像和 attestation。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cosign verify --key cosign.pub $REGISTRY/kaniko-chains cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
$ cosign verify --key cosign.pub $REGISTRY/kaniko-chains $ cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
在 Rekor 中找到镜像的验证情况。
- 获取 $REGISTRY/kaniko-chains 镜像摘要。您可以搜索任务运行或拉取镜像以提取摘要。
搜索 Rekor 以查找与镜像
sha256
摘要匹配的所有条目。Copy to Clipboard Copied! Toggle word wrap Toggle overflow rekor-cli search --sha <image_digest>
$ rekor-cli search --sha <image_digest>
1 <uuid_1>
2 <uuid_2>
3 ...
搜索结果显示匹配条目的 UUID。其中其中一个 UUID 包含 attestation。
检查 attestation。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
$ rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
1.7. 其他资源
第 2 章 在 web 控制台中设置 OpenShift Pipelines 以查看软件交换链安全元素
使用 Developer 或 Administrator 视角创建或修改管道,并查看项目中的软件交换链安全元素。
设置 OpenShift Pipelines 以查看:
- 项目漏洞 :可视化表示项目中的漏洞。
- Software Bill of Materials (SBOMs): 下载或查看 PipelineRun 组件的详细列表。
另外,满足 Tekton Chains 要求的 PipelineRuns 会在其名称旁边显示签名徽标。此徽标表示管道运行执行结果安全签名并存储,例如在 OCI 镜像中。
图 2.1. 签名的徽标

只有在您配置了 Tekton 链时,PipelineRun 才会在其名称旁边显示签名徽标。有关配置 Tekton 链的详情,请参考 为 OpenShift Pipelines 提供链安全使用 Tekton 链。
2.1. 设置 OpenShift Pipelines 以查看项目漏洞
PipelineRun 详情页面提供标识的漏洞的可视化表示,它们按严重性(critical、high、medium 和低)进行分类。这种简化的视图有助于优先考虑和修复工作。
图 2.2. 查看 PipelineRun
详情页中的漏洞

您还可以查看管道运行列表视图页面中的 Vulnerabilities 列中的漏洞。
图 2.3. 查看 PipelineRun
列表视图中的漏洞

从 OpenShift Container Platform 版本 4.15 开始,提供了识别的漏洞的可视化表示。
先决条件
- 已登陆到 web 控制台。
- 在项目中拥有适当的角色和权限, 可在 OpenShift Container Platform 中创建应用程序和其他工作负载。
- 您有一个现有的漏洞扫描任务。
流程
- 在 Developer 或 Administrator 视角中,切换到您希望漏洞视觉表示的相关项目。
更新您的现有漏洞扫描任务,以确保它将输出存储在 .json 文件中,然后以以下格式提取漏洞概述:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The format to extract vulnerability summary (adjust the jq command for different JSON structures).
# The format to extract vulnerability summary (adjust the jq command for different JSON structures). jq -rce \ '{vulnerabilities:{ critical: (.result.summary.CRITICAL), high: (.result.summary.IMPORTANT), medium: (.result.summary.MODERATE), low: (.result.summary.LOW) }}' scan_output.json | tee $(results.SCAN_OUTPUT.path)
注意您可能需要为不同的 JSON 结构调整 jq 命令。
(可选)如果您没有漏洞扫描任务,以以下格式创建一个:
使用 Roxctl 的漏洞扫描任务示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: Task metadata: name: vulnerability-scan annotations: task.output.location: results task.results.format: application/json task.results.key: SCAN_OUTPUT spec: params: - description: Image to be scanned name: image type: string results: - description: CVE result format name: SCAN_OUTPUT steps: - name: roxctl image: 'quay.io/lrangine/crda-maven:11.0' env: - name: ROX_CENTRAL_ENDPOINT valueFrom: secretKeyRef: key: rox_central_endpoint name: roxsecrets - name: ROX_API_TOKEN valueFrom: secretKeyRef: key: rox_api_token name: roxsecrets name: roxctl-scan script: | #!/bin/sh curl -k -L -H "Authorization: Bearer $ROX_API_TOKEN" https://$ROX_CENTRAL_ENDPOINT/api/cli/download/roxctl-linux --output ./roxctl chmod +x ./roxctl ./roxctl image scan --insecure-skip-tls-verify -e $ROX_CENTRAL_ENDPOINT --image $(params.image) --output json > roxctl_output.json jq -rce \ "{vulnerabilities:{ critical: (.result.summary.CRITICAL), high: (.result.summary.IMPORTANT), medium: (.result.summary.MODERATE), low: (.result.summary.LOW) }}" roxctl_output.json | tee $(results.SCAN_OUTPUT.path)
apiVersion: tekton.dev/v1 kind: Task metadata: name: vulnerability-scan
1 annotations: task.output.location: results
2 task.results.format: application/json task.results.key: SCAN_OUTPUT
3 spec: params: - description: Image to be scanned name: image type: string results: - description: CVE result format
4 name: SCAN_OUTPUT steps: - name: roxctl image: 'quay.io/lrangine/crda-maven:11.0'
5 env: - name: ROX_CENTRAL_ENDPOINT valueFrom: secretKeyRef: key: rox_central_endpoint
6 name: roxsecrets - name: ROX_API_TOKEN valueFrom: secretKeyRef: key: rox_api_token
7 name: roxsecrets name: roxctl-scan script: |
8 #!/bin/sh curl -k -L -H "Authorization: Bearer $ROX_API_TOKEN" https://$ROX_CENTRAL_ENDPOINT/api/cli/download/roxctl-linux --output ./roxctl chmod +x ./roxctl ./roxctl image scan --insecure-skip-tls-verify -e $ROX_CENTRAL_ENDPOINT --image $(params.image) --output json > roxctl_output.json jq -rce \ "{vulnerabilities:{ critical: (.result.summary.CRITICAL), high: (.result.summary.IMPORTANT), medium: (.result.summary.MODERATE), low: (.result.summary.LOW) }}" roxctl_output.json | tee $(results.SCAN_OUTPUT.path)
注意这是示例配置。根据您的特定扫描工具修改值,以预期格式设置结果。
更新适当的 Pipeline 以以下格式添加漏洞规格:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ... spec: results: - description: The common vulnerabilities and exposures (CVE) result name: SCAN_OUTPUT value: $(tasks.vulnerability-scan.results.SCAN_OUTPUT)
... spec: results: - description: The common vulnerabilities and exposures (CVE) result name: SCAN_OUTPUT value: $(tasks.vulnerability-scan.results.SCAN_OUTPUT)
验证
-
进入
PipelineRun
详情页面,查看 Vulnerabilities 行,以了解识别的漏洞的可视化表示。 -
另外,您可以进入到
PipelineRun
list view 页面,并查看 Vulnerabilities 列。
2.2. 设置 OpenShift Pipelines 以下载或查看 SBOM
PipelineRun
详情页面提供了一个下载或查看 Software Bill of Materials (SBOMs)的选项,增强了您的供应链中的透明度和控制。SBOMs 列出组件使用的所有软件库。这些库可以启用特定的功能或便于开发。
您可以使用 SBOM 更好地了解软件组成,识别漏洞,并评估可能出现的任何安全问题的潜在影响。
图 2.4. 下载或查看 SBOMs 的选项

先决条件
- 已登陆到 web 控制台。
- 在项目中拥有适当的角色和权限, 可在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
- 在 Developer 或 Administrator 视角中,切换到需要 SBOM 的可视化表示的相关项目。
使用以下格式添加任务来查看或下载 SBOM 信息:
SBOM 任务示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: Task metadata: name: sbom-task annotations: task.output.location: results task.results.format: application/text task.results.key: LINK_TO_SBOM task.results.type: external-link spec: results: - description: Contains the SBOM link name: LINK_TO_SBOM steps: - name: print-sbom-results image: quay.io/image script: | #!/bin/sh syft version syft quay.io/<username>/quarkus-demo:v2 --output cyclonedx-json=sbom-image.json echo 'BEGIN SBOM' cat sbom-image.json echo 'END SBOM' echo 'quay.io/user/workloads/<namespace>/node-express/node-express:build-8e536-1692702836' | tee $(results.LINK_TO_SBOM.path)
apiVersion: tekton.dev/v1 kind: Task metadata: name: sbom-task
1 annotations: task.output.location: results
2 task.results.format: application/text task.results.key: LINK_TO_SBOM
3 task.results.type: external-link
4 spec: results: - description: Contains the SBOM link
5 name: LINK_TO_SBOM steps: - name: print-sbom-results image: quay.io/image
6 script: |
7 #!/bin/sh syft version syft quay.io/<username>/quarkus-demo:v2 --output cyclonedx-json=sbom-image.json echo 'BEGIN SBOM' cat sbom-image.json echo 'END SBOM' echo 'quay.io/user/workloads/<namespace>/node-express/node-express:build-8e536-1692702836' | tee $(results.LINK_TO_SBOM.path)
8 更新 Pipeline,以引用新创建的 SBOM 任务。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ... spec: tasks: - name: sbom-task taskRef: name: sbom-task results: - name: IMAGE_URL description: url value: <oci_image_registry_url>
... spec: tasks: - name: sbom-task taskRef: name: sbom-task
1 results: - name: IMAGE_URL
2 description: url value: <oci_image_registry_url>
3 - 重新运行受影响的 OpenShift Pipeline。
2.2.1. 在 Web UI 中查看 SBOM
先决条件
- 您已将 OpenShift Pipelines 设置为下载或查看 SBOMs。
流程
- 进入到 Activity → PipelineRuns 选项卡。
- 对于您要查看的 SBOM 的项目,请选择其最新的管道运行。
在
PipelineRun
详情页中,选择 View SBOM。-
您可以使用 Web 浏览器立即搜索 SBOM 以了解软件供应链中漏洞的术语。例如,尝试搜索
log4j
。 - 您可以选择 Download 下载 SBOM 或 Expand 来查看它全屏。
-
您可以使用 Web 浏览器立即搜索 SBOM 以了解软件供应链中漏洞的术语。例如,尝试搜索
2.2.2. 在 CLI 中下载 SBOM
先决条件
- 已安装 Cosign CLI 工具。有关安装 Cosign 工具的详情,请参考有关 Cosign 的 Sigstore 文档。
- 您已将 OpenShift Pipelines 设置为下载或查看 SBOMs。
流程
- 打开终端,登录到 Developer 或 Administrator 视角,然后切换到相关项目。
在 OpenShift web 控制台中复制
download sbom
命令,并在终端中运行它。cosign 命令示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cosign download sbom quay.io/<workspace>/user-workload@sha256
$ cosign download sbom quay.io/<workspace>/user-workload@sha256
(可选)要以可搜索格式查看完整的 SBOM,请运行以下命令来重定向输出:
cosign 命令示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cosign download sbom quay.io/<workspace>/user-workload@sha256 > sbom.txt
$ cosign download sbom quay.io/<workspace>/user-workload@sha256 > sbom.txt
2.2.3. 阅读 SBOM
在 SBOM 中,如以下示例摘录所示,您可以看到项目使用的每个库的四个特征:
- 其作者或发布者
- 其名称
- 其版本
- 其许可证
这些信息可帮助您验证单个库是否安全源、更新并合规。
SBOM 示例
{ "bomFormat": "CycloneDX", "specVersion": "1.4", "serialNumber": "urn:uuid:89146fc4-342f-496b-9cc9-07a6a1554220", "version": 1, "metadata": { ... }, "components": [ { "bom-ref": "pkg:pypi/flask@2.1.0?package-id=d6ad7ed5aac04a8", "type": "library", "author": "Armin Ronacher <armin.ronacher@active-4.com>", "name": "Flask", "version": "2.1.0", "licenses": [ { "license": { "id": "BSD-3-Clause" } } ], "cpe": "cpe:2.3:a:armin-ronacher:python-Flask:2.1.0:*:*:*:*:*:*:*", "purl": "pkg:pypi/Flask@2.1.0", "properties": [ { "name": "syft:package:foundBy", "value": "python-package-cataloger" ...
{
"bomFormat": "CycloneDX",
"specVersion": "1.4",
"serialNumber": "urn:uuid:89146fc4-342f-496b-9cc9-07a6a1554220",
"version": 1,
"metadata": {
...
},
"components": [
{
"bom-ref": "pkg:pypi/flask@2.1.0?package-id=d6ad7ed5aac04a8",
"type": "library",
"author": "Armin Ronacher <armin.ronacher@active-4.com>",
"name": "Flask",
"version": "2.1.0",
"licenses": [
{
"license": {
"id": "BSD-3-Clause"
}
}
],
"cpe": "cpe:2.3:a:armin-ronacher:python-Flask:2.1.0:*:*:*:*:*:*:*",
"purl": "pkg:pypi/Flask@2.1.0",
"properties": [
{
"name": "syft:package:foundBy",
"value": "python-package-cataloger"
...
2.3. 其他资源
第 3 章 为 pod 配置安全上下文
OpenShift Pipelines 启动的 pod 的默认服务帐户是 pipeline
。与 pipeline
服务帐户关联的安全性上下文约束(SCC)是 pipelines-scc
。pipelines-scc
SCC 基于 anyuid
SCC,其细微差别如下:
pipelines-scc.yaml
片断示例
apiVersion: security.openshift.io/v1 kind: SecurityContextConstraints # ... allowedCapabilities: - SETFCAP # ... fsGroup: type: MustRunAs # ...
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
# ...
allowedCapabilities:
- SETFCAP
# ...
fsGroup:
type: MustRunAs
# ...
另外,Buildah
任务作为 OpenShift Pipelines 的一部分提供,使用 vfs
作为默认存储驱动程序。
您可以为 OpenShift Pipelines 为管道运行和任务运行配置的 pod 配置安全上下文。您可以进行以下更改:
- 更改所有 Pod 的 default 和 maximum SCC
- 更改为管道运行和任务在特定命名空间中运行的 Pod 的默认 SCC
- 将特定的管道运行或任务运行配置为使用自定义 SCC 和服务帐户
运行 buildah
以确保所有镜像都可以构建的镜像是以 root 用户身份在具有 特权
SCC 的 pod 中运行。有关运行带有更严格的安全设置的 buildah
的说明,请参阅 以非 root 用户身份使用 Buildah 构建容器镜像。
3.1. 为 OpenShift Pipelines 创建的 pod 配置默认和最大 SCC
您可以为 OpenShift Pipelines 为任务运行和管道运行创建的所有 pod 配置默认安全性上下文约束(SCC)。您还可以配置最大 SCC,这是可为任何命名空间中这些 pod 配置的最小限制性 SCC。
流程
输入以下命令编辑
TektonConfig
自定义资源(CR):Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc edit TektonConfig config
$ oc edit TektonConfig config
在 spec 中设置 default 和 maximum SCC,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: # ... platforms: openshift: scc: default: "restricted-v2" maxAllowed: "privileged"
apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: # ... platforms: openshift: scc: default: "restricted-v2"
1 maxAllowed: "privileged"
2
3.2. 为命名空间中的 pod 配置 SCC
您可以为 OpenShift Pipelines 为管道运行和在特定命名空间中创建的任务运行的所有 pod 配置安全性上下文约束(SCC)。此 SCC 不得低于您使用 TektonConfig
CR 配置的最大 SCC 的限制,在 spec.platforms.openshift.scc.maxAllowed
spec 中。
流程
将命名空间的
operator.tekton.dev/scc
注解设置为 SCC 的名称。用于配置 OpenShift Pipelines pod 的 SCC 的命名空间注解示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: Namespace metadata: name: test-namespace annotations: operator.tekton.dev/scc: nonroot
apiVersion: v1 kind: Namespace metadata: name: test-namespace annotations: operator.tekton.dev/scc: nonroot
3.3. 使用自定义 SCC 和自定义服务帐户运行管道运行和任务
当使用与默认 pipelines
服务帐户关联的 pipelines-scc
安全性上下文约束(SCC)时,管道运行和任务运行 Pod 可能会面临超时问题。这是因为在默认的 pipelines-scc
SCC 中,fsGroup.type
参数设置为 MustRunAs
。
有关 pod 超时的更多信息,请参阅 BZ#1995779.
为避免 pod 超时,您可以创建一个自定义 SCC,并将 fsGroup.type
参数设置为 RunAsAny
,并将它与自定义服务帐户关联。
作为最佳实践,使用自定义 SCC 和自定义服务帐户来运行管道运行和任务运行。这种方法具有更大的灵活性,在升级过程中修改默认值时不会中断运行。
流程
定义自定义 SCC,并将
fsGroup.type
参数设置为RunAsAny
:示例:自定义 SCC
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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
SCCCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f my-scc.yaml
$ oc create -f my-scc.yaml
创建自定义服务帐户:
示例:创建一个
fsgroup-runasany
服务帐户Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create serviceaccount fsgroup-runasany
$ oc create serviceaccount fsgroup-runasany
将自定义 SCC 与自定义服务帐户关联:
示例:将
my-scc
SCC 与fsgroup-runasany
服务帐户关联Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm policy add-scc-to-user my-scc -z fsgroup-runasany
$ oc adm policy add-scc-to-user my-scc -z fsgroup-runasany
如果要将自定义服务帐户用于特权任务,您可以通过运行以下命令将
privileged
SCC 与自定义服务帐户关联:示例:将
privileged
SCC 与fsgroup-runasany
服务帐户关联Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm policy add-scc-to-user privileged -z fsgroup-runasany
$ oc adm policy add-scc-to-user privileged -z fsgroup-runasany
在管道运行和任务运行中使用自定义服务帐户:
示例:Pipeline 使用
fsgroup-runasany
自定义服务帐户运行 YAMLCopy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: <pipeline-run-name> spec: pipelineRef: name: <pipeline-cluster-task-name> taskRunTemplate: serviceAccountName: 'fsgroup-runasany'
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: <pipeline-run-name> spec: pipelineRef: name: <pipeline-cluster-task-name> taskRunTemplate: serviceAccountName: 'fsgroup-runasany'
示例:任务使用
fsgroup-runasany
自定义服务帐户运行 YAMLCopy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: <task-run-name> spec: taskRef: name: <cluster-task-name> taskRunTemplate: serviceAccountName: 'fsgroup-runasany'
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: <task-run-name> spec: taskRef: name: <cluster-task-name> taskRunTemplate: serviceAccountName: 'fsgroup-runasany'
3.4. 其他资源
第 4 章 使用事件监听程序保护 Webhook
作为管理员,您可以使用事件监听程序保护 Webhook。创建命名空间后,您可以通过将 operator.tekton.dev/enable-annotation=enabled
标签添加到命名空间,为 Eventlistener
资源启用 HTTPS。然后,您可以使用重新加密的 TLS 终止创建 Trigger
资源和安全路由。
Red Hat OpenShift Pipelines 中的触发器支持不安全的 HTTP 和安全 HTTPS 连接到 Eventlistener
资源。HTTPS 保护集群内部和外部的连接。
Red Hat OpenShift Pipelines 运行 tekton-operator-proxy-webhook
pod,用于监视命名空间中的标签。当您将标签添加到命名空间时,webhook 在 EventListener
对象上设置 service.beta.openshift.io/serving-cert-secret-name=<secret_name>
注解。这反过来会创建 secret 和所需的证书。
service.beta.openshift.io/serving-cert-secret-name=<secret_name>
service.beta.openshift.io/serving-cert-secret-name=<secret_name>
另外,您可以将创建的 secret 挂载到 Eventlistener
pod 中,以保护请求。
4.1. 提供与 OpenShift 路由的安全连接
要使用重新加密的 TLS 终止创建路由,请运行:
oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
$ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
或者,您可以创建一个重新加密的 TLS 终止 YAML 文件来创建安全路由。
重新加密 TLS 终止 YAML 示例,以创建安全路由
apiVersion: route.openshift.io/v1 kind: Route metadata: name: route-passthrough-secured spec: host: <hostname> to: kind: Service name: frontend tls: termination: reencrypt key: [as in edge termination] certificate: [as in edge termination] caCertificate: [as in edge termination] destinationCACertificate: |- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE-----
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: route-passthrough-secured
spec:
host: <hostname>
to:
kind: Service
name: frontend
tls:
termination: reencrypt
key: [as in edge termination]
certificate: [as in edge termination]
caCertificate: [as in edge termination]
destinationCACertificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
您可以运行 oc create route reencrypt --help
命令显示更多选项。
4.2. 使用安全 HTTPS 连接创建示例 EventListener 资源
本节使用 pipelines-tutorial 示例来演示使用安全 HTTPS 连接创建示例 EventListener 资源。
流程
从 pipelines-tutorial 存储库中的 YAML 文件创建
TriggerBinding
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/01_binding.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/01_binding.yaml
从 pipelines-tutorial 存储库中的 YAML 文件创建
TriggerTemplate
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/02_template.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/02_template.yaml
直接从 pipelines-tutorial 存储库创建
Trigger
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/03_trigger.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/03_trigger.yaml
使用安全 HTTPS 连接创建
EventListener
资源:添加一个标签,在 Eventlistener 资源中启用安全
HTTPS
连接:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
$ oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
从 pipelines-tutorial 存储库中的 YAML 文件创建
EventListener
资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/04_event_listener.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/03_triggers/04_event_listener.yaml
创建带有重新加密 TLS 终止的路由:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
$ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
第 5 章 使用 secret 使用存储库验证管道
管道和任务可能需要凭证才能使用 Git 存储库和容器存储库进行身份验证。在 Red Hat OpenShift Pipelines 中,您可以使用 secret 验证管道运行和在执行过程中与 Git 存储库交互的任务运行和任务运行。
用于使用 Git 存储库进行身份验证的 secret 称为 Git secret。
管道运行或任务运行通过关联的服务帐户获取对 secret 的访问权限。另外,您可以在管道或任务中定义工作区,并将 secret 绑定到工作区。
5.1. 先决条件
-
已安装
oc
OpenShift 命令行工具。
5.2. 使用服务帐户提供 secret
您可以使用服务帐户为 secret 提供 Git 存储库和容器存储库身份验证。
您可以将 secret 与服务帐户关联。机密中的信息可供此服务帐户下运行的任务使用。
5.2.1. 服务帐户的 secret 的类型和注解
如果使用服务帐户提供身份验证 secret,OpenShift Pipelines 支持多种 secret 类型。对于大多数这些 secret 类型,您必须提供注解来定义身份验证 secret 有效的存储库。
5.2.1.1. Git 身份验证 secret
如果使用服务帐户提供身份验证 secret,OpenShift Pipelines 支持以下 Git 身份验证的 secret 类型:
-
kubernetes.io/basic-auth
:基本身份验证的用户名和密码 -
kubernetes.io/ssh-auth
: 基于 SSH 的身份验证的密钥
如果使用服务帐户提供身份验证 secret,Git secret 必须具有一个或多个注解键。每个键的名称必须以 tekton.dev/git-
开头,值是 OpenShift Pipelines 必须使用 secret 中的凭证的 URL。
在以下示例中,OpenShift Pipelines 使用 basic-auth
secret 访问位于 github.com
和 gitlab.com
的存储库。
示例:使用多个 Git 存储库进行基本身份验证的凭证
apiVersion: v1 kind: Secret metadata: name: git-secret-basic annotations: tekton.dev/git-0: github.com tekton.dev/git-1: gitlab.com type: kubernetes.io/basic-auth stringData: username: <username> password: <password>
apiVersion: v1
kind: Secret
metadata:
name: git-secret-basic
annotations:
tekton.dev/git-0: github.com
tekton.dev/git-1: gitlab.com
type: kubernetes.io/basic-auth
stringData:
username: <username>
password: <password>
您还可以使用 ssh-auth
secret 为访问 Git 存储库提供私钥,如下例所示:
示例:用于基于 SSH 的身份验证的私钥
apiVersion: v1 kind: Secret metadata: name: git-secret-ssh annotations: tekton.dev/git-0: https://github.com type: kubernetes.io/ssh-auth stringData: ssh-privatekey:
apiVersion: v1
kind: Secret
metadata:
name: git-secret-ssh
annotations:
tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
ssh-privatekey:
- 1
- SSH 私钥文件的内容。
5.2.1.2. 容器 registry 身份验证 secret
如果使用服务帐户提供身份验证 secret,OpenShift Pipelines 支持以下容器(Docker) registry 身份验证的 secret 类型:
-
kubernetes.io/basic-auth
:基本身份验证的用户名和密码 -
kubernetes.io/dockercfg
:序列化的~/.dockercfg
文件 -
kubernetes.io/dockerconfigjson
:序列化~/.docker/config.json
文件
如果使用服务帐户提供身份验证 secret,kubernetes.io/basic-auth
类型的容器 registry secret 必须具有一个或多个注解键。每个键的名称必须以 tekton.dev/docker-
开头,值是 OpenShift Pipelines 必须使用 secret 中的凭证的 URL。其他类型的容器 registry secret 不需要此注解。
在以下示例中,OpenShift Pipelines 使用 basic-auth
secret (依赖于用户名和密码)访问位于 quay.io
和 my-registry.example.com
的容器 registry。
示例:使用多个容器存储库进行基本身份验证的凭证
apiVersion: v1 kind: Secret metadata: name: docker-secret-basic annotations: tekton.dev/docker-0: quay.io tekton.dev/docker-1: my-registry.example.com type: kubernetes.io/basic-auth stringData: username: <username> password: <password>
apiVersion: v1
kind: Secret
metadata:
name: docker-secret-basic
annotations:
tekton.dev/docker-0: quay.io
tekton.dev/docker-1: my-registry.example.com
type: kubernetes.io/basic-auth
stringData:
username: <username>
password: <password>
您可以从现有配置文件创建 kubernetes.io/dockercfg
和 kubernetes.io/dockerconfigjson
secret,如下例所示:
示例:创建用于从现有配置文件中向容器存储库进行身份验证的 secret 的命令
oc create secret generic docker-secret-config \ --from-file=config.json=/home/user/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
$ oc create secret generic docker-secret-config \
--from-file=config.json=/home/user/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
您还可以使用 oc
命令行工具从凭证创建 kubernetes.io/dockerconfigjson
secret,如下例所示:
示例:创建用于从凭证向容器存储库进行身份验证的 secret 的命令
oc create secret docker-registry docker-secret-config \ --docker-email=<email> \ --docker-username=<username> \ --docker-password=<password> \ --docker-server=my-registry.example.com:5000
$ oc create secret docker-registry docker-secret-config \
--docker-email=<email> \
--docker-username=<username> \
--docker-password=<password> \
--docker-server=my-registry.example.com:5000
5.2.2. 使用服务帐户为 Git 配置基本身份验证
对于管道从密码保护的存储库检索资源,您可以为该管道配置基本身份验证。
考虑使用基于 SSH 的身份验证而不是基本身份验证。
要为管道配置基本身份验证,请创建一个基本身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRun
或 PipelineRun
资源关联。
对于 GitHub,已弃用使用普通密码进行身份验证。而应使用个人访问令牌。
流程
在
secret.yaml
文件中为 secret 创建 YAML 清单。在此清单中,指定用户名和密码或 GitHub 个人访问令牌来访问 目标 Git 存储库。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: Secret metadata: name: basic-user-pass annotations: tekton.dev/git-0: https://github.com type: kubernetes.io/basic-auth stringData: username: <username> password: <password>
apiVersion: v1 kind: Secret metadata: name: basic-user-pass
1 annotations: tekton.dev/git-0: https://github.com type: kubernetes.io/basic-auth stringData: username: <username>
2 password: <password>
3 在
serviceaccount.yaml
文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: ServiceAccount metadata: name: build-bot secrets: - name: basic-user-pass
apiVersion: v1 kind: ServiceAccount metadata: name: build-bot
1 secrets: - name: basic-user-pass
2 为
run.yaml
文件中的任务运行或管道运行创建 YAML 清单,并将服务帐户与任务运行或管道运行关联。使用以下示例之一:将服务帐户与
TaskRun
资源关联:Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 spec: taskRunTemplate: serviceAccountName: build-bot taskRef: name: build-push
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2
1 spec: taskRunTemplate: serviceAccountName: build-bot
2 taskRef: name: build-push
3 将服务帐户与
PipelineRun
资源关联:Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline namespace: default spec: taskRunTemplate: serviceAccountName: build-bot pipelineRef: name: demo-pipeline
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline
1 namespace: default spec: taskRunTemplate: serviceAccountName: build-bot
2 pipelineRef: name: demo-pipeline
3
输入以下命令应用您创建的 YAML 清单:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
5.2.3. 使用服务帐户为 Git 配置 SSH 身份验证
若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。
要为管道配置基于 SSH 的身份验证,请使用 SSH 私钥创建身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRun
或 PipelineRun
资源关联。
流程
-
生成 SSH 私钥,或复制通常在
~/.ssh/id_rsa
文件中提供的现有私钥。 在
secret.yaml
文件中为 secret 创建 YAML 清单。在此清单中,将ssh-privatekey
的值设置为 SSH 私钥文件的内容,并将known_hosts
的值设置为已知主机文件的内容。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: Secret metadata: name: ssh-key annotations: tekton.dev/git-0: github.com type: kubernetes.io/ssh-auth stringData: ssh-privatekey: known_hosts:
apiVersion: v1 kind: Secret metadata: name: ssh-key
1 annotations: tekton.dev/git-0: github.com type: kubernetes.io/ssh-auth stringData: ssh-privatekey:
2 known_hosts:
3 重要如果省略已知主机文件,OpenShift Pipelines 会接受任何服务器的公钥。
-
可选:通过在注解值末尾添加 :<
;port_number&
gt; 来指定自定义 SSH 端口。例如:tekton.dev/git-0: github.com:2222
。 在
serviceaccount.yaml
文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: ServiceAccount metadata: name: build-bot secrets: - name: ssh-key
apiVersion: v1 kind: ServiceAccount metadata: name: build-bot
1 secrets: - name: ssh-key
2 在
run.yaml
文件中,将服务帐户与任务运行或管道运行关联。使用以下示例之一:将服务帐户与任务运行关联:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 spec: taskRunTemplate: serviceAccountName: build-bot taskRef: name: build-push
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2
1 spec: taskRunTemplate: serviceAccountName: build-bot
2 taskRef: name: build-push
3 将服务帐户与管道运行关联:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline namespace: default spec: taskRunTemplate: serviceAccountName: build-bot pipelineRef: name: demo-pipeline
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline
1 namespace: default spec: taskRunTemplate: serviceAccountName: build-bot
2 pipelineRef: name: demo-pipeline
3
应用更改。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
5.2.4. 使用服务帐户配置容器 registry 身份验证
要使管道从 registry 检索容器镜像或将容器镜像推送到 registry,您必须为该 registry 配置身份验证。
要为管道配置 registry 身份验证,请使用 Docker 配置文件创建身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRun
或 PipelineRun
资源关联。
流程
输入以下命令,从现有
config.json
文件创建容器 registry 身份验证 secret,该文件包含身份验证信息:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic my-registry-credentials \ --from-file=config.json=/home/user/credentials/config.json
$ oc create secret generic my-registry-credentials \
1 --from-file=config.json=/home/user/credentials/config.json
2 在
serviceaccount.yaml
文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: ServiceAccount metadata: name: container-bot secrets: - name: my-registry-credentials
apiVersion: v1 kind: ServiceAccount metadata: name: container-bot
1 secrets: - name: my-registry-credentials
2 为任务运行或管道运行创建 YAML 清单,作为
run.yaml
文件运行。在这个文件中,将服务帐户与任务运行或管道运行关联。使用以下示例之一:将服务帐户与任务运行关联:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-container-task-run-2 spec: taskRunTemplate: serviceAccountName: container-bot taskRef: name: build-container
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-container-task-run-2
1 spec: taskRunTemplate: serviceAccountName: container-bot
2 taskRef: name: build-container
3 将服务帐户与管道运行关联:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline namespace: default spec: taskRunTemplate: serviceAccountName: container-bot pipelineRef: name: demo-pipeline
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline
1 namespace: default spec: taskRunTemplate: serviceAccountName: container-bot
2 pipelineRef: name: demo-pipeline
3
输入以下命令应用更改:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc apply --filename serviceaccount.yaml,run.yaml
$ oc apply --filename serviceaccount.yaml,run.yaml
5.2.5. 使用服务帐户进行身份验证的其他注意事项
在某些情况下,您必须完成额外的步骤来使用使用服务帐户提供的身份验证 secret。
5.2.5.1. 任务中的 SSH Git 身份验证
您可以在任务步骤中直接调用 Git 命令并使用 SSH 身份验证,但您必须完成额外的步骤。
OpenShift Pipelines 在 /tekton/home/.ssh
目录中提供 SSH 文件,并将 $HOME
变量设置为 /tekton/home
。但是,Git SSH 身份验证会忽略 $HOME
变量,并将 /etc/passwd
文件中指定的主目录用于用户。因此,使用 Git 命令的步骤必须将 /tekton/home/.ssh
目录符号链接到相关用户的主目录。
例如,如果任务以 root
用户身份运行,则步骤必须在 Git 命令前使用以下命令:
apiVersion: tekton.dev/v1 kind: Task metadata: name: example-git-task spec: steps: - name: example-git-step # ... script: ln -s $HOME/.ssh /root/.ssh # ...
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: example-git-task
spec:
steps:
- name: example-git-step
# ...
script:
ln -s $HOME/.ssh /root/.ssh
# ...
但是,当使用 git
类型的管道资源或 Tekton 目录中提供的 git-clone
任务时,不需要显式符号链接。
有关在 git
类型任务中使用 SSH 身份验证的示例,请参阅 authenticating-git-commands.yaml。
5.2.5.2. 以非 root 用户身份使用 secret
在某些情况下,您可能需要将 secret 用作非 root 用户,例如:
- 容器用于执行运行的用户和组由平台随机化。
- 任务中的步骤定义非 root 安全性上下文。
- 任务指定一个全局非 root 安全上下文,它应用到任务中的所有步骤。
在这种情况下,请考虑以非 root 用户身份运行任务和管道运行的以下方面:
-
Git 的 SSH 身份验证要求用户在
/etc/passwd
目录中配置有效的主目录。指定没有有效主目录的 UID 会导致身份验证失败。 -
SSH 身份验证会忽略
$HOME
环境变量。因此,您必须将 OpenShift Pipelines 定义的$HOME
目录(/tekton/home
)中的 secret 文件符号链接到非 root 用户的有效主目录。
另外,要在非 root 安全上下文中配置 SSH 身份验证,请参阅示例中的 git-clone-and-check
步骤,以验证 git 命令。
5.3. 使用工作区提供 secret
您可以使用工作区为 secret 提供 Git 存储库和容器存储库身份验证。
您可以在任务中配置指定工作区,指定挂载工作区的路径。运行任务时,将 secret 提供为带有此名称的工作区。当 OpenShift Pipelines 执行任务时,secret 中的信息可供任务使用。
如果您使用工作区提供身份验证 secret,则不需要 secret 的注解。
5.3.1. 使用工作区为 Git 配置 SSH 身份验证
若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。
要为管道配置基于 SSH 的身份验证,请使用 SSH 私钥创建身份验证 secret,在任务中为此 secret 配置命名工作区,并在运行任务时指定 secret。
流程
输入以下命令从现有
.ssh
目录中的文件创建 Git SSH 身份验证 secret:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic my-github-ssh-credentials \ --from-file=id_ed25519=/home/user/.ssh/id_ed25519 \ --from-file=known_hosts=/home/user/.ssh/known_hosts
$ oc create secret generic my-github-ssh-credentials \
1 --from-file=id_ed25519=/home/user/.ssh/id_ed25519 \
2 --from-file=known_hosts=/home/user/.ssh/known_hosts
3 在任务定义中,为 Git 身份验证配置命名工作区,如
ssh-directory
:工作区的定义示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone spec: workspaces: - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc.
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone spec: workspaces: - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc.
-
在任务步骤中,使用
$(workspaces.<workspace_name>.path)环境变量中的路径
访问目录,例如$(workspaces.ssh-directory.path)
在运行任务时,通过在
tkn task start
命令中包含 the-workspace
参数来指定命名工作区的 secret:Copy to Clipboard Copied! Toggle word wrap Toggle overflow tkn task start <task_name>
$ tkn task start <task_name> --workspace name=<workspace_name>,secret=<secret_name>
1 # ...
- 1
- 将
<workspace_name
> 替换为您配置的工作区的名称,<secret_name
> 替换为您创建的 secret 的名称。
使用 SSH 密钥克隆 Git 存储库进行身份验证的任务示例
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone spec: workspaces: - name: output description: The git repo will be cloned onto the volume backing this Workspace. - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc. Copied to the user's home before git commands are executed. Used to authenticate with the git remote when performing the clone. Binding a Secret to this Workspace is strongly recommended over other volume types params: - name: url description: Repository URL to clone from. type: string - name: revision description: Revision to checkout. (branch, tag, sha, ref, etc...) type: string default: "" - name: gitInitImage description: The image providing the git-init binary that this Task runs. type: string default: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.37.0" results: - name: commit description: The precise commit SHA that was fetched by this Task. - name: url description: The precise URL that was fetched by this Task. steps: - name: clone image: "$(params.gitInitImage)" script: | #!/usr/bin/env sh set -eu # This is necessary for recent version of git git config --global --add safe.directory '*' cp -R "$(workspaces.ssh-directory.path)" "${HOME}"/.ssh chmod 700 "${HOME}"/.ssh chmod -R 400 "${HOME}"/.ssh/* CHECKOUT_DIR="$(workspaces.output.path)/" /ko-app/git-init \ -url="$(params.url)" \ -revision="$(params.revision)" \ -path="${CHECKOUT_DIR}" cd "${CHECKOUT_DIR}" RESULT_SHA="$(git rev-parse HEAD)" EXIT_CODE="$?" if [ "${EXIT_CODE}" != 0 ] ; then exit "${EXIT_CODE}" fi printf "%s" "${RESULT_SHA}" > "$(results.commit.path)" printf "%s" "$(params.url)" > "$(results.url.path)"
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: git-clone
spec:
workspaces:
- name: output
description: The git repo will be cloned onto the volume backing this Workspace.
- name: ssh-directory
description: |
A .ssh directory with private key, known_hosts, config, etc. Copied to
the user's home before git commands are executed. Used to authenticate
with the git remote when performing the clone. Binding a Secret to this
Workspace is strongly recommended over other volume types
params:
- name: url
description: Repository URL to clone from.
type: string
- name: revision
description: Revision to checkout. (branch, tag, sha, ref, etc...)
type: string
default: ""
- name: gitInitImage
description: The image providing the git-init binary that this Task runs.
type: string
default: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.37.0"
results:
- name: commit
description: The precise commit SHA that was fetched by this Task.
- name: url
description: The precise URL that was fetched by this Task.
steps:
- name: clone
image: "$(params.gitInitImage)"
script: |
#!/usr/bin/env sh
set -eu
# This is necessary for recent version of git
git config --global --add safe.directory '*'
cp -R "$(workspaces.ssh-directory.path)" "${HOME}"/.ssh
chmod 700 "${HOME}"/.ssh
chmod -R 400 "${HOME}"/.ssh/*
CHECKOUT_DIR="$(workspaces.output.path)/"
/ko-app/git-init \
-url="$(params.url)" \
-revision="$(params.revision)" \
-path="${CHECKOUT_DIR}"
cd "${CHECKOUT_DIR}"
RESULT_SHA="$(git rev-parse HEAD)"
EXIT_CODE="$?"
if [ "${EXIT_CODE}" != 0 ] ; then
exit "${EXIT_CODE}"
fi
printf "%s" "${RESULT_SHA}" > "$(results.commit.path)"
printf "%s" "$(params.url)" > "$(results.url.path)"
- 1
- 脚本会将机密的内容(以文件夹的形式)复制到
${HOME}/.ssh
,这是ssh
搜索凭据的标准文件夹。
运行任务的命令示例
tkn task start git-clone
$ tkn task start git-clone
--param url=git@github.com:example-github-user/buildkit-tekton
--workspace name=output,emptyDir=""
--workspace name=ssh-directory,secret=my-github-ssh-credentials
--use-param-defaults --showlog
5.3.2. 使用工作区配置容器 registry 身份验证
要使管道从 registry 检索容器镜像,您必须为该 registry 配置身份验证。
要为容器 registry 配置身份验证,请使用 Docker 配置文件创建身份验证 secret,在任务中为此 secret 配置名为 workspace,并在运行任务时指定 secret。
流程
输入以下命令,从现有
config.json
文件创建容器 registry 身份验证 secret,该文件包含身份验证信息:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic my-registry-credentials \ --from-file=config.json=/home/user/credentials/config.json
$ oc create secret generic my-registry-credentials \
1 --from-file=config.json=/home/user/credentials/config.json
2 在任务定义中,为 Git 身份验证配置命名工作区,如
ssh-directory
:工作区的定义示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: skopeo-copy spec: workspaces: - name: dockerconfig description: Includes a docker `config.json` # ...
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: skopeo-copy spec: workspaces: - name: dockerconfig description: Includes a docker `config.json` # ...
-
在任务步骤中,使用
$(workspaces.<workspace_name>.path)
环境变量中的路径访问目录,如$(workspaces.dockerconfig.path)
。 要运行任务,请在
tkn task start
命令中包含 the-workspace
参数来指定命名工作区的 secret:Copy to Clipboard Copied! Toggle word wrap Toggle overflow tkn task start <task_name>
$ tkn task start <task_name> --workspace name=<workspace_name>,secret=<secret_name>
1 # ...
- 1
- 将
<workspace_name
> 替换为您配置的工作区的名称,<secret_name
> 替换为您创建的 secret 的名称。
使用 Skopeo 从容器存储库复制镜像的示例
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: skopeo-copy spec: workspaces: - name: dockerconfig description: Includes a docker `config.json` steps: - name: clone image: quay.io/skopeo/stable:v1.8.0 env: - name: DOCKER_CONFIG value: $(workspaces.dockerconfig.path) script: | #!/usr/bin/env sh set -eu skopeo copy docker://docker.io/library/ubuntu:latest docker://quay.io/example_repository/ubuntu-copy:latest
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: skopeo-copy
spec:
workspaces:
- name: dockerconfig
description: Includes a docker `config.json`
steps:
- name: clone
image: quay.io/skopeo/stable:v1.8.0
env:
- name: DOCKER_CONFIG
value: $(workspaces.dockerconfig.path)
script: |
#!/usr/bin/env sh
set -eu
skopeo copy docker://docker.io/library/ubuntu:latest docker://quay.io/example_repository/ubuntu-copy:latest
运行任务的命令示例
tkn task start skopeo-copy
$ tkn task start skopeo-copy
--workspace name=dockerconfig,secret=my-registry-credentials
--use-param-defaults --showlog
5.3.3. 使用工作区将 secret 限制到特定步骤
当您使用工作区提供身份验证 secret 并在任务中定义工作区时,默认情况下工作区可用于任务中的所有步骤。
要将 secret 限制到特定的步骤,请在任务规格和步骤规格中定义工作区。
流程
在任务规格和步骤规格中添加
workspaces:
定义,如下例所示:任务定义示例,其中只有一个步骤可以访问凭证工作区
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone-build spec: workspaces: - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc. # ... steps: - name: clone workspaces: - name: ssh-directory # ... - name: build # ...
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: git-clone-build spec: workspaces:
1 - name: ssh-directory description: | A .ssh directory with private key, known_hosts, config, etc. # ... steps: - name: clone workspaces:
2 - name: ssh-directory # ... - name: build
3 # ...
第 6 章 以非 root 用户身份使用 Buildah 构建容器镜像
作为 root 用户在容器上运行 OpenShift Pipelines,可以将容器进程和主机公开给其他潜在的恶意资源。您可以作为容器中的特定非 root 用户运行工作负载来降低此类风险。
在大多数情况下,您可以通过创建一个自定义任务来构建镜像并在此任务中配置用户命名空间,可以在没有 root 权限的情况下运行 Buildah。
如果您的镜像没有成功使用此配置构建,您可以使用自定义服务帐户(SA)和安全上下文约束(SCC)定义;但是,如果使用此选项,则必须启用 Buildah 步骤来提升其权限(allowPrivilegeEscalation: true
)。
6.1. 通过配置用户命名空间,以非 root 用户身份运行 Buildah
配置用户命名空间是以非 root 用户身份在任务中运行 Buildah 的最简单方法。但是,一些镜像可能无法使用这个选项进行构建。
先决条件
-
已安装
oc
命令行工具。
流程
要创建
openshift-pipelines
命名空间中提供的buildah
任务的副本,并将副本的名称改为buildah-as-user
,请输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get task buildah -n openshift-pipelines -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
$ oc get task buildah -n openshift-pipelines -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
输入以下命令编辑复制的
buildah
任务:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc edit task buildah-as-user
$ oc edit task buildah-as-user
在新任务中,创建
annotations
和stepTemplate
部分,如下例所示:在
buildah-as-user
任务中添加示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: Task metadata: annotations: io.kubernetes.cri-o.userns-mode: 'auto:size=65536;map-to-root=true' io.openshift.builder: 'true' name: assemble-containerimage namespace: pipeline-namespace spec: description: This task builds an image. # ... stepTemplate: env: - name: HOME value: /tekton/home image: $(params.builder-image) imagePullPolicy: IfNotPresent name: '' resources: limits: cpu: '1' memory: 4Gi requests: cpu: 100m memory: 2Gi securityContext: capabilities: add: - SETFCAP runAsNonRoot: true runAsUser: 1000 workingDir: $(workspaces.working-directory.path) # ...
apiVersion: tekton.dev/v1 kind: Task metadata: annotations: io.kubernetes.cri-o.userns-mode: 'auto:size=65536;map-to-root=true' io.openshift.builder: 'true' name: assemble-containerimage namespace: pipeline-namespace spec: description: This task builds an image. # ... stepTemplate: env: - name: HOME value: /tekton/home image: $(params.builder-image) imagePullPolicy: IfNotPresent name: '' resources: limits: cpu: '1' memory: 4Gi requests: cpu: 100m memory: 2Gi securityContext: capabilities: add: - SETFCAP runAsNonRoot: true runAsUser: 1000
1 workingDir: $(workspaces.working-directory.path) # ...
- 1
runAsUser:
设置没有严格必要,因为使用了podTemplate
。
-
使用新的
buildah-as-user
任务在管道中构建镜像。
6.2. 通过定义自定义 SA 和 SCC,以非 root 用户身份运行 Buildah
要以非 root 用户身份使用 Buildah 运行容器镜像的构建,可以执行以下步骤:
- 定义自定义服务帐户 (SA) 和安全性上下文约束 (SCC)。
-
配置 Buildah,以使用 ID 为
1000
的build
用户。 - 使用自定义配置映射启动任务运行,或将其与管道运行集成。
6.2.1. 配置自定义服务帐户和安全上下文约束
默认 pipeline
SA 允许使用命名空间范围之外的用户 ID。要减少对默认 SA 的依赖性,您可以为 ID 为 1000
的 build
用户定义具有必要的集群角色和角色绑定的自定义 SA 和 SCC。
目前,Buildah 需要启用 allowPrivilegeEscalation
设置,才能在容器中运行。通过这个设置,Buildah 可以在以非 root 用户身份运行时利用 SETUID
和 SETGID
功能。
流程
使用必要的集群角色和角色绑定创建自定义 SA 和 SCC。
示例:用户 id 为
1000
的自定义 SA 和 SCC。Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 kind: ServiceAccount metadata: name: pipelines-sa-userid-1000 --- kind: SecurityContextConstraints metadata: annotations: name: pipelines-scc-userid-1000 allowHostDirVolumePlugin: false allowHostIPC: false allowHostNetwork: false allowHostPID: false allowHostPorts: false allowPrivilegeEscalation: true allowPrivilegedContainer: false allowedCapabilities: null apiVersion: security.openshift.io/v1 defaultAddCapabilities: null fsGroup: type: MustRunAs groups: - system:cluster-admins priority: 10 readOnlyRootFilesystem: false requiredDropCapabilities: - MKNOD - KILL runAsUser: type: MustRunAs uid: 1000 seLinuxContext: type: MustRunAs supplementalGroups: type: RunAsAny users: [] volumes: - configMap - downwardAPI - emptyDir - persistentVolumeClaim - projected - secret --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pipelines-scc-userid-1000-clusterrole rules: - apiGroups: - security.openshift.io resourceNames: - pipelines-scc-userid-1000 resources: - securitycontextconstraints verbs: - use --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pipelines-scc-userid-1000-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: pipelines-scc-userid-1000-clusterrole subjects: - kind: ServiceAccount name: pipelines-sa-userid-1000
apiVersion: v1 kind: ServiceAccount metadata: name: pipelines-sa-userid-1000
1 --- kind: SecurityContextConstraints metadata: annotations: name: pipelines-scc-userid-1000
2 allowHostDirVolumePlugin: false allowHostIPC: false allowHostNetwork: false allowHostPID: false allowHostPorts: false allowPrivilegeEscalation: true
3 allowPrivilegedContainer: false allowedCapabilities: null apiVersion: security.openshift.io/v1 defaultAddCapabilities: null fsGroup: type: MustRunAs groups: - system:cluster-admins priority: 10 readOnlyRootFilesystem: false requiredDropCapabilities: - MKNOD - KILL runAsUser:
4 type: MustRunAs uid: 1000 seLinuxContext: type: MustRunAs supplementalGroups: type: RunAsAny users: [] volumes: - configMap - downwardAPI - emptyDir - persistentVolumeClaim - projected - secret --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pipelines-scc-userid-1000-clusterrole
5 rules: - apiGroups: - security.openshift.io resourceNames: - pipelines-scc-userid-1000 resources: - securitycontextconstraints verbs: - use --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pipelines-scc-userid-1000-rolebinding
6 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: pipelines-scc-userid-1000-clusterrole subjects: - kind: ServiceAccount name: pipelines-sa-userid-1000
6.2.2. 配置 Buildah 以使用 build
用户
您可以定义一个 Buildah 任务,以使用带有用户 ID 1000
的 build
用户。
流程
创建
openshift-pipelines
命名空间中提供的buildah
任务的副本;将副本的名称更改为buildah-as-user
。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get task buildah -n openshift-pipelines -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
$ oc get task buildah -n openshift-pipelines -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
编辑复制的
buildah
任务。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc edit task buildah-as-user
$ oc edit task buildah-as-user
示例:使用
build
用户修改 Buildah 任务Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: Task metadata: name: buildah-as-user spec: description: >- Buildah task builds source into a container image and then pushes it to a container registry. Buildah Task builds source into a container image using Project Atomic's Buildah build tool.It uses Buildah's support for building from Dockerfiles, using its buildah bud command.This command executes the directives in the Dockerfile to assemble a container image, then pushes that image to a container registry. params: - name: IMAGE description: Reference of the image buildah will produce. - name: BUILDER_IMAGE description: The location of the buildah builder image. default: registry.redhat.io/rhel8/buildah@sha256:99cae35f40c7ec050fed3765b2b27e0b8bbea2aa2da7c16408e2ca13c60ff8ee - name: STORAGE_DRIVER description: Set buildah storage driver default: vfs - name: DOCKERFILE description: Path to the Dockerfile to build. default: ./Dockerfile - name: CONTEXT description: Path to the directory to use as context. default: . - name: TLSVERIFY description: Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry) default: "true" - name: FORMAT description: The format of the built container, oci or docker default: "oci" - name: BUILD_EXTRA_ARGS description: Extra parameters passed for the build command when building images. default: "" - description: Extra parameters passed for the push command when pushing images. name: PUSH_EXTRA_ARGS type: string default: "" - description: Skip pushing the built image name: SKIP_PUSH type: string default: "false" results: - description: Digest of the image just built. name: IMAGE_DIGEST type: string workspaces: - name: source steps: - name: build securityContext: runAsUser: 1000 image: $(params.BUILDER_IMAGE) workingDir: $(workspaces.source.path) script: | echo "Running as USER ID `id`" buildah --storage-driver=$(params.STORAGE_DRIVER) bud \ $(params.BUILD_EXTRA_ARGS) --format=$(params.FORMAT) \ --tls-verify=$(params.TLSVERIFY) --no-cache \ -f $(params.DOCKERFILE) -t $(params.IMAGE) $(params.CONTEXT) [[ "$(params.SKIP_PUSH)" == "true" ]] && echo "Push skipped" && exit 0 buildah --storage-driver=$(params.STORAGE_DRIVER) push \ $(params.PUSH_EXTRA_ARGS) --tls-verify=$(params.TLSVERIFY) \ --digestfile $(workspaces.source.path)/image-digest $(params.IMAGE) \ docker://$(params.IMAGE) cat $(workspaces.source.path)/image-digest | tee /tekton/results/IMAGE_DIGEST volumeMounts: - name: varlibcontainers mountPath: /home/build/.local/share/containers volumes: - name: varlibcontainers emptyDir: {}
apiVersion: tekton.dev/v1 kind: Task metadata: name: buildah-as-user spec: description: >- Buildah task builds source into a container image and then pushes it to a container registry. Buildah Task builds source into a container image using Project Atomic's Buildah build tool.It uses Buildah's support for building from Dockerfiles, using its buildah bud command.This command executes the directives in the Dockerfile to assemble a container image, then pushes that image to a container registry. params: - name: IMAGE description: Reference of the image buildah will produce. - name: BUILDER_IMAGE description: The location of the buildah builder image. default: registry.redhat.io/rhel8/buildah@sha256:99cae35f40c7ec050fed3765b2b27e0b8bbea2aa2da7c16408e2ca13c60ff8ee - name: STORAGE_DRIVER description: Set buildah storage driver default: vfs - name: DOCKERFILE description: Path to the Dockerfile to build. default: ./Dockerfile - name: CONTEXT description: Path to the directory to use as context. default: . - name: TLSVERIFY description: Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry) default: "true" - name: FORMAT description: The format of the built container, oci or docker default: "oci" - name: BUILD_EXTRA_ARGS description: Extra parameters passed for the build command when building images. default: "" - description: Extra parameters passed for the push command when pushing images. name: PUSH_EXTRA_ARGS type: string default: "" - description: Skip pushing the built image name: SKIP_PUSH type: string default: "false" results: - description: Digest of the image just built. name: IMAGE_DIGEST type: string workspaces: - name: source steps: - name: build securityContext: runAsUser: 1000
1 image: $(params.BUILDER_IMAGE) workingDir: $(workspaces.source.path) script: | echo "Running as USER ID `id`"
2 buildah --storage-driver=$(params.STORAGE_DRIVER) bud \ $(params.BUILD_EXTRA_ARGS) --format=$(params.FORMAT) \ --tls-verify=$(params.TLSVERIFY) --no-cache \ -f $(params.DOCKERFILE) -t $(params.IMAGE) $(params.CONTEXT) [[ "$(params.SKIP_PUSH)" == "true" ]] && echo "Push skipped" && exit 0 buildah --storage-driver=$(params.STORAGE_DRIVER) push \ $(params.PUSH_EXTRA_ARGS) --tls-verify=$(params.TLSVERIFY) \ --digestfile $(workspaces.source.path)/image-digest $(params.IMAGE) \ docker://$(params.IMAGE) cat $(workspaces.source.path)/image-digest | tee /tekton/results/IMAGE_DIGEST volumeMounts: - name: varlibcontainers mountPath: /home/build/.local/share/containers
3 volumes: - name: varlibcontainers emptyDir: {}
6.2.3. 使用自定义配置映射或管道运行启动任务运行
定义自定义 Buildah 任务后,您可以创建一个 TaskRun
对象,以具有用户 ID 1000
的 build
用户身份构建镜像。另外,您还可以将 TaskRun
对象集成为 PipelineRun
对象的一部分。
流程
使用自定义
ConfigMap
和Dockerfile
对象创建一个TaskRun
对象。示例:以用户 ID
1000
身份运行 Buildah 的任务运行Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 data: Dockerfile: | ARG BASE_IMG=registry.access.redhat.com/ubi9/ubi FROM $BASE_IMG AS buildah-runner RUN dnf -y update && \ dnf -y install git && \ dnf clean all CMD git kind: ConfigMap metadata: name: dockerfile --- apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: buildah-as-user-1000 spec: taskRunTemplate: serviceAccountName: pipelines-sa-userid-1000 params: - name: IMAGE value: image-registry.openshift-image-registry.svc:5000/test/buildahuser taskRef: kind: Task name: buildah-as-user workspaces: - configMap: name: dockerfile name: source
apiVersion: v1 data: Dockerfile: | ARG BASE_IMG=registry.access.redhat.com/ubi9/ubi FROM $BASE_IMG AS buildah-runner RUN dnf -y update && \ dnf -y install git && \ dnf clean all CMD git kind: ConfigMap metadata: name: dockerfile
1 --- apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: buildah-as-user-1000 spec: taskRunTemplate: serviceAccountName: pipelines-sa-userid-1000
2 params: - name: IMAGE value: image-registry.openshift-image-registry.svc:5000/test/buildahuser taskRef: kind: Task name: buildah-as-user workspaces: - configMap: name: dockerfile
3 name: source
(可选)创建管道和对应的管道运行。
示例:管道和对应的管道运行
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: tekton.dev/v1 kind: Pipeline metadata: name: pipeline-buildah-as-user-1000 spec: params: - name: IMAGE - name: URL workspaces: - name: shared-workspace - name: sslcertdir optional: true tasks: - name: fetch-repository taskRef: resolver: cluster params: - name: kind value: task - name: name value: git-clone - name: namespace value: openshift-pipelines workspaces: - name: output workspace: shared-workspace params: - name: URL value: $(params.URL) - name: SUBDIRECTORY value: "" - name: DELETE_EXISTING value: "true" - name: buildah taskRef: name: buildah-as-user runAfter: - fetch-repository workspaces: - name: source workspace: shared-workspace - name: sslcertdir workspace: sslcertdir params: - name: IMAGE value: $(params.IMAGE) --- apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipelinerun-buildah-as-user-1000 spec: taskRunSpecs: - pipelineTaskName: buildah taskServiceAccountName: pipelines-sa-userid-1000 params: - name: URL value: https://github.com/openshift/pipelines-vote-api - name: IMAGE value: image-registry.openshift-image-registry.svc:5000/test/buildahuser pipelineRef: name: pipeline-buildah-as-user-1000 workspaces: - name: shared-workspace volumeClaimTemplate: spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Mi
apiVersion: tekton.dev/v1 kind: Pipeline metadata: name: pipeline-buildah-as-user-1000 spec: params: - name: IMAGE - name: URL workspaces: - name: shared-workspace - name: sslcertdir optional: true tasks: - name: fetch-repository
1 taskRef: resolver: cluster params: - name: kind value: task - name: name value: git-clone - name: namespace value: openshift-pipelines workspaces: - name: output workspace: shared-workspace params: - name: URL value: $(params.URL) - name: SUBDIRECTORY value: "" - name: DELETE_EXISTING value: "true" - name: buildah taskRef: name: buildah-as-user
2 runAfter: - fetch-repository workspaces: - name: source workspace: shared-workspace - name: sslcertdir workspace: sslcertdir params: - name: IMAGE value: $(params.IMAGE) --- apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipelinerun-buildah-as-user-1000 spec: taskRunSpecs: - pipelineTaskName: buildah taskServiceAccountName: pipelines-sa-userid-1000
3 params: - name: URL value: https://github.com/openshift/pipelines-vote-api - name: IMAGE value: image-registry.openshift-image-registry.svc:5000/test/buildahuser pipelineRef: name: pipeline-buildah-as-user-1000 workspaces: - name: shared-workspace
4 volumeClaimTemplate: spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Mi
- 启动任务运行或管道运行。
6.3. 无特权构建的限制
无特权构建的进程可用于大多数 Dockerfile
对象。但是,一些已知的限制可能会导致构建失败:
-
由于缺少必要权限问题,使用
--mount=type=cache
选项可能会失败。如需更多信息,请参阅本文档。 -
使用
--mount=type=secret
选项会失败,因为挂载资源需要未由自定义 SCC 提供的额外功能。
其他资源