保护 OpenShift Pipelines
OpenShift Pipelines 的安全功能
摘要
第 1 章 为 OpenShift Pipelines 提供链安全使用 Tekton 链 复制链接链接已复制到粘贴板!
Tekton 链只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
Tekton Chains 是一个 Kubernetes 自定义资源定义(CRD)控制器。您可以使用它来管理使用 Red Hat OpenShift Pipelines 创建的任务和管道的供应链安全。
默认情况下,Tekton Chains 会观察 OpenShift Container Platform 集群中的所有任务运行执行。当任务运行完成时,Tekton Chains 会获取任务运行的快照。然后,它会将快照转换为一个或多个标准有效负载格式,最后签署并存储所有工件。
要捕获有关任务运行的信息,Tekton Chains 使用 Result 和 PipelineResource 对象。当对象不可用时,Tekton 会链 OCI 镜像的 URL 和合格摘要。
PipelineResource 对象已弃用,并将在以后的发行版本中删除 ; 对于手动使用,建议使用 Results 对象。
1.1. 主要特性 复制链接链接已复制到粘贴板!
-
您可以使用诸如
cosign等工具生成的加密密钥为任务运行、任务运行结果和 OCI registry 镜像签名。 -
您可以使用"测试"格式,如
in-toto。 - 您可以使用 OCI 存储库作为存储后端安全存储签名和签名工件。
1.2. 使用 Red Hat OpenShift Pipelines Operator 安装 Tekton 链 复制链接链接已复制到粘贴板!
集群管理员可以使用 TektonChain 自定义资源(CR)来安装和管理 Tekton 链。
Tekton Chains 是 Red Hat OpenShift Pipelines 的一个可选组件。目前,您无法使用 TektonConfig CR 安装它。
先决条件
-
确保在集群中的
openshift-pipelines命名空间中安装了 Red Hat OpenShift Pipelines Operator。
流程
为 Red Hat OpenShift Pipelines 集群创建
TektonChainCR。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
TektonChainCR。oc apply -f TektonChain.yaml
$ oc apply -f TektonChain.yaml1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用
TektonChainCR 的文件名替换。
检查安装的状态。
oc get tektonchains.operator.tekton.dev
$ oc get tektonchains.operator.tekton.devCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. 配置 Tekton 链 复制链接链接已复制到粘贴板!
Tekton Chains 在 openshift-pipelines 命名空间中使用名为 chains-config 的 ConfigMap 对象进行配置。
要配置 Tekton 链,请使用以下示例:
示例:配置 Tekton 链
oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'
$ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'
- 1
- 在 JSON 有效负载中使用支持的键值对组合。
1.3.1. Tekton Chains 配置支持的键 复制链接链接已复制到粘贴板!
集群管理员可以使用各种支持的键和值来配置任务运行、OCI 镜像和存储的规格。
1.3.1.1. 任务运行支持的键 复制链接链接已复制到粘贴板!
| 支持的键 | 描述 | 支持的值 | 默认值 |
|---|---|---|---|
|
| 存储任务运行有效负载的格式。 |
|
|
|
|
任务运行签名的存储后端。您可以将多个后端指定为用逗号分开的列表,如 |
|
|
|
| 签名后端为任务运行有效负载进行签名。 |
|
|
1.3.1.2. OCI 支持的密钥 复制链接链接已复制到粘贴板!
| 支持的键 | 描述 | 支持的值 | 默认值 |
|---|---|---|---|
|
| 存储 OCI 有效负载的格式。 |
|
|
|
|
OCI 签名的存储后端。您可以将多个后端指定为用逗号分开的列表,如 |
|
|
|
| 签名后端以签署 OCI 有效负载。 |
|
|
1.3.1.3. 支持的存储密钥 复制链接链接已复制到粘贴板!
| 支持的键 | 描述 | 支持的值 | 默认值 |
|---|---|---|---|
|
| 用于存储 OCI 签名的 OCI 存储库。 | 目前,链仅支持内部 OpenShift OCI registry;不支持 Quay 等其他流行选项。 |
1.4. 在 Tekton Chains 中签名 secret 复制链接链接已复制到粘贴板!
集群管理员可以生成密钥对,并使用 Tekton 链来使用 Kubernetes secret 为工件签名。要使 Tekton 链正常工作,加密的密钥和密码必须作为 openshift-pipelines 命名空间中的 signing-secrets Kubernetes secret 的一部分存在。
目前,Tekton 链支持 x509 和 cosign 签名方案。
只使用一个受支持的签名方案。
1.4.1. 使用 x509 进行签名 复制链接链接已复制到粘贴板!
要将 x509 签名方案与 Tekton Chains 搭配使用,请将 ed25519 或 ecdsa 类型的 x509.pem 私钥存储在 signing-secrets Kubernetes secret 中。确保密钥保存为未加密的 PKCS8 PEM 文件(BEGIN PRIVATE KEY)。
1.4.2. 使用 cosign 进行签名 复制链接链接已复制到粘贴板!
使用 Tekton 链的 cosign 签名方案:
- 安装 cosign。
生成
cosign.key和cosign.pub密钥对。cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secretsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cosign 提示您输入密码,并创建一个 Kubernetes secret。
-
将加密的
cosign.key私钥和cosign.password解密密码存储在signing-secretsKubernetes secret 中。确保私钥存储为ENCRYPTED COSIGN PRIVATE KEY类型的加密 PEM 文件。
1.4.3. 签名故障排除 复制链接链接已复制到粘贴板!
如果签名 secret 已填充,您可能会遇到以下错误:
Error from server (AlreadyExists): secrets "signing-secrets" already exists
Error from server (AlreadyExists): secrets "signing-secrets" already exists
要解决这个问题:
删除 secret:
oc delete secret signing-secrets -n openshift-pipelines
$ oc delete secret signing-secrets -n openshift-pipelinesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 重新创建密钥对并使用您首选的签名方案将其存储在 secret 中。
1.5. 对 OCI registry 进行身份验证 复制链接链接已复制到粘贴板!
在将签名推送到 OCI Registry 之前,集群管理员必须配置 Tekton 链,以便与 registry 进行身份验证。Tekton Chains 控制器使用与任务运行相同的服务帐户。要设置具有所需凭证(push)到 OCI registry 的服务帐户,请执行以下步骤:
流程
设置 Kubernetes 服务帐户的命名空间和名称。
export NAMESPACE=<namespace> export SERVICE_ACCOUNT_NAME=<service_account>
$ export NAMESPACE=<namespace>1 $ export SERVICE_ACCOUNT_NAME=<service_account>2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 Kubernetes secret。
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 $NAMESPACECopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用 Docker 配置文件的路径替换。默认路径为
~/.docker/config.json。
授予服务帐户对 secret 的访问权限。
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 $NAMESPACECopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果对 Red Hat OpenShift Pipelines 分配到所有任务的默认
pipeline服务帐户进行补丁,Red Hat OpenShift Pipelines Operator 将覆盖服务帐户。作为最佳实践,您可以执行以下步骤:创建单独的服务帐户,以分配给用户的任务运行。
oc create serviceaccount <service_account_name>
$ oc create serviceaccount <service_account_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过设置任务运行模板中的
serviceaccountname字段的值,将服务帐户关联到运行任务。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用新创建的服务帐户的名称替换。
1.5.1. 创建和验证任务运行签名而无需任何其他身份验证 复制链接链接已复制到粘贴板!
要验证使用 Tekton 链与任何其他身份验证一起运行的任务的签名,请执行以下任务:
- 创建加密的 x509 密钥对,并将它保存为 Kubernetes secret。
- 配置 Tekton Chains 后端存储。
- 创建任务运行,为它签名并将签名和有效负载存储为任务运行自身时的注解。
- 从已签名任务运行中检索签名和有效负载。
- 验证任务运行的签名。
先决条件
确保在集群中安装了以下内容:
- Red Hat OpenShift Pipelines Operator
- Tekton Chains
- Cosign
流程
创建加密的 x509 密钥对,并将它保存为 Kubernetes secret:
cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secretsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示时提供密码。Cosign 将生成的私钥存储为
openshift-pipelines命名空间中的signing-secretsKubernetes secret 的一部分。在 Tekton Chains 配置中,禁用 OCI 存储,并将任务运行存储和格式设置为
tekton。oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'$ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 Tekton Chains 控制器,以确保应用了修改后的配置。
oc delete po -n openshift-pipelines -l app=tekton-chains-controller
$ oc delete po -n openshift-pipelines -l app=tekton-chains-controllerCopy 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.yaml1 taskrun.tekton.dev/build-push-run-output-image-qbjvh createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用指向您的任务运行的 URI 或文件路径替换。
检查步骤的状态,并等待 till 进程完成。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从存储为
base64编码注解的对象检索签名和有效负载:export TASKRUN_UID=$(tkn tr describe --last -o jsonpath='{.metadata.uid}') tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" > signature tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/payload-taskrun-$TASKRUN_UID}" | base64 -d > payload$ export TASKRUN_UID=$(tkn tr describe --last -o jsonpath='{.metadata.uid}') $ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" > signature $ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/payload-taskrun-$TASKRUN_UID}" | base64 -d > payloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证签名。
cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload
$ cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload Verified OKCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.6. 使用 Tekton 链来签名和验证镜像并证明 复制链接链接已复制到粘贴板!
集群管理员可以通过执行以下任务来使用 Tekton 链来签名和验证镜像和验证镜像:
- 创建加密的 x509 密钥对,并将它保存为 Kubernetes secret。
- 为 OCI registry 设置身份验证,以在测试过程中存储镜像、镜像签名和签名的镜像。
- 配置 Tekton 链以生成和签署认可。
- 在任务运行中,使用 Kaniko 创建镜像。
- 验证已签名的镜像及已签名证明。
先决条件
确保在集群中安装了以下内容:
流程
创建加密的 x509 密钥对,并将它保存为 Kubernetes secret:
cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secretsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示时提供密码。Cosign 将生成的私钥作为 openshift-pipelines 命名空间中的
signing-secretsKubernetes secret 的一部分存储在openshift-pipelines命名空间中,并将公钥写入cosign.pub本地文件。为镜像 registry 配置身份验证。
- 要将 Tekton Chains 控制器配置为将签名推送到 OCI registry,请使用与任务运行服务帐户关联的凭证。如需更多信息,请参阅"授权到 OCI registry"部分。
要为构建并推送到 registry 的 Kaniko 任务配置身份验证,请创建一个包含所需凭证的 docker
config.json文件的 Kubernetes secret。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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
通过在
chains-config对象中设置artifacts.taskrun.format、artifacts.taskrun.storage和transparency.enabled参数来配置 Tekton 链 :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"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动 Kaniko 任务。
将 Kaniko 任务应用到集群。
oc apply -f examples/kaniko/kaniko.yaml
$ oc apply -f examples/kaniko/kaniko.yaml1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用 Kaniko 任务的 URI 或文件路径替换。
设置适当的环境变量。
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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动 Kaniko 任务。
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-chainsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 观察此任务的日志,直到所有步骤都完成。身份验证成功后,最终镜像将推送到
$REGISTRY/kaniko-chains。
等待一分钟,以允许 Tekton 链生成证据并对其进行签名,然后在任务运行时检查
chains.tekton.dev/signed=true注解的可用性。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用任务运行的名称替换。
验证镜像和 attestation。
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-chainsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Rekor 中找到镜像的验证情况。
- 获取 $REGISTRY/kaniko-chains 镜像摘要。您可以搜索任务运行或拉取镜像以提取摘要。
搜索 Rekor 以查找与镜像
sha256摘要匹配的所有条目。rekor-cli search --sha <image_digest>
$ rekor-cli search --sha <image_digest>1 <uuid_1>2 <uuid_2>3 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 搜索结果显示匹配条目的 UUID。其中其中一个 UUID 包含 attestation。
检查 attestation。
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 | jqCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 2 章 在特权安全上下文中使用 pod 复制链接链接已复制到粘贴板!
如果 Pod 由管道运行或任务运行,则 OpenShift Pipelines 1.3.x 及更新版本的默认配置不允许使用特权安全上下文运行 Pod。对于这样的容器集,默认服务帐户为 pipeline,与 pipelines 服务帐户关联的安全性上下文约束(SCC)是 pipelines-scc。pipelines-scc SCC 与 anyuid SCC 类似,但存在细微差别,如管道 SCC 的 YAML 文件中定义:
pipelines-scc.yaml 片断示例
另外,Buildah 集群任务作为 OpenShift Pipelines 的一部分提供,使用 vfs 作为默认存储驱动程序。
2.1. 运行管道运行和任务运行带有特权安全上下文的 Pod 复制链接链接已复制到粘贴板!
流程
要使用 特权 安全上下文运行 pod(从管道运行或任务运行中),请执行以下修改:
将关联的用户帐户或服务帐户配置为具有显式 SCC。您可以使用以下任一方法执行配置:
运行以下命令:
oc adm policy add-scc-to-user <scc-name> -z <service-account-name>
$ oc adm policy add-scc-to-user <scc-name> -z <service-account-name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,修改
RoleBinding和Role或ClusterRole的 YAML 文件:RoleBinding对象示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow ClusterRole对象示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 根据您使用的角色绑定,使用适当的集群角色替换。
注意作为最佳实践,请创建默认 YAML 文件的副本并在重复文件中进行更改。
-
如果您不使用
vfs存储驱动程序,请将与任务运行或管道运行关联的服务帐户配置为具有特权 SCC,并将安全上下文设置为privileged: true。
2.2. 使用自定义 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 创建自定义 SCC:
示例:创建
my-sccSCCoc create -f my-scc.yaml
$ oc create -f my-scc.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建自定义服务帐户:
示例:创建一个
fsgroup-runasany服务帐户oc create serviceaccount fsgroup-runasany
$ oc create serviceaccount fsgroup-runasanyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将自定义 SCC 与自定义服务帐户关联:
示例:将
my-sccSCC 与fsgroup-runasany服务帐户关联oc adm policy add-scc-to-user my-scc -z fsgroup-runasany
$ oc adm policy add-scc-to-user my-scc -z fsgroup-runasanyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果要将自定义服务帐户用于特权任务,您可以通过运行以下命令将
privilegedSCC 与自定义服务帐户关联:示例:将
privilegedSCC 与fsgroup-runasany服务帐户关联oc adm policy add-scc-to-user privileged -z fsgroup-runasany
$ oc adm policy add-scc-to-user privileged -z fsgroup-runasanyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在管道运行和任务运行中使用自定义服务帐户:
示例:Pipeline 使用
fsgroup-runasany自定义服务帐户运行 YAMLCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例:任务使用
fsgroup-runasany自定义服务帐户运行 YAMLCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 3 章 使用事件监听程序保护 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 中,以保护请求。
3.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 示例,以创建安全路由
您可以运行 oc create route reencrypt --help 命令显示更多选项。
3.2. 使用安全 HTTPS 连接创建示例 EventListener 资源 复制链接链接已复制到粘贴板!
本节使用 pipelines-tutorial 示例来演示使用安全 HTTPS 连接创建示例 EventListener 资源。
流程
从 pipelines-tutorial 存储库中的 YAML 文件创建
TriggerBinding资源: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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从 pipelines-tutorial 存储库中的 YAML 文件创建
TriggerTemplate资源: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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 直接从 pipelines-tutorial 存储库创建
Trigger资源: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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用安全 HTTPS 连接创建
EventListener资源:添加一个标签,在 Eventlistener 资源中启用安全
HTTPS连接:oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
$ oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从 pipelines-tutorial 存储库中的 YAML 文件创建
EventListener资源: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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建带有重新加密 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>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 4 章 使用 git secret 验证管道 复制链接链接已复制到粘贴板!
Git 机密由凭据组成,可以安全地与 Git 存储库交互,通常用于自动执行身份验证。在 Red Hat OpenShift Pipelines 中,您可以使用 Git secret 验证管道运行和在执行过程中与 Git 存储库交互的任务运行。
管道运行或任务运行通过关联的服务帐户获取对 secret 的访问权限。OpenShift Pipelines 支持将 Git secret 用作基于基本身份验证和基于 SSH 的身份验证的注解(键值对)。
4.1. 凭证选择 复制链接链接已复制到粘贴板!
管道运行或任务运行可能需要多次身份验证才能访问不同的 Git 存储库。使用 OpenShift Pipelines 可以使用其凭证的域注解每个 secret。
Git secret 的凭证注解键必须以 tekton.dev/git- 开头,其值是您要 OpenShift Pipelines 使用该凭证的主机的 URL。
在以下示例中,OpenShift Pipelines 使用 basic-auth secret (依赖于用户名和密码)访问位于 github.com 和 gitlab.com 的存储库。
示例:用于基本身份验证的多个凭证
您还可以使用 ssh-auth secret(私钥)来访问 Git 存储库。
示例:用于基于 SSH 的身份验证的私钥
- 1
- SSH 私钥文件的内容。
4.2. 为 Git 配置基本身份验证 复制链接链接已复制到粘贴板!
管道若要从密码保护的存储库检索资源,您必须为该管道配置基本身份验证。
要为管道配置基本身份验证,请使用指定存储库的 Git secret 中的凭证更新 secret.yaml、serviceaccount.yaml 和 run.yaml 文件。完成此过程后,OpenShift Pipelines 可使用该信息来检索指定的管道资源。
对于 GitHub,已弃用使用普通密码进行身份验证。而应使用个人访问令牌。
流程
在
secret.yaml文件中,指定用户名和密码或 GitHub 个人访问令牌来访问目标 Git 存储库。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
serviceaccount.yaml文件中,将 secret 与适当的服务帐户关联。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
run.yaml文件中,将服务帐户与任务运行或管道运行关联。将服务帐户与任务运行关联:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将服务帐户与
PipelineRun资源关联: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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. 为 Git 配置 SSH 身份验证 复制链接链接已复制到粘贴板!
若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。
要为管道配置基于 SSH 的身份验证,请使用指定存储库的 SSH 私钥中的凭证更新 secret.yaml、serviceaccount.yaml 和 run.yaml 文件。完成此过程后,OpenShift Pipelines 可使用该信息来检索指定的管道资源。
考虑使用基于 SSH 的身份验证而不是基本身份验证。
流程
-
生成 SSH 私钥,或复制通常在
~/.ssh/id_rsa文件中提供的现有私钥。 在
secret.yaml文件中,将ssh-privatekey的值设置为 SSH 私钥文件的内容,并将known_hosts的值设置为已知主机文件的内容。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Important如果省略私钥,OpenShift Pipelines 会接受任何服务器的公钥。
-
可选: 要指定一个自定义 SSH 端口,请在
annotation值的末尾添加:<port number>.例如:tekton.dev/git-0: github.com:2222。 在
serviceaccount.yaml文件中,将ssh-keysecret 与build-bot服务帐户关联。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
run.yaml文件中,将服务帐户与任务运行或管道运行关联。将服务帐户与任务运行关联:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将服务帐户与管道运行关联:
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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4. 在 git 类型任务中使用 SSH 身份验证 复制链接链接已复制到粘贴板!
在调用 Git 命令时,您可以在任务的步骤中直接使用 SSH 身份验证。SSH 身份验证忽略 $HOME 变量,并且仅使用 /etc/passwd 文件中指定的用户主目录。因此,任务中的每个步骤都必须将 /tekton/home/.ssh 目录符号链接到相关用户的主目录。
但是,当您使用 git 类型的管道资源或 Tekton 目录中提供的 git-clone 任务时,不需要显式符号链接。
有关在 git 类型任务中使用 SSH 身份验证的示例,请参阅 authenticating-git-commands.yaml。
4.5. 以非 root 用户身份使用 secret 复制链接链接已复制到粘贴板!
在某些情况下,您可能需要将 secret 用作非 root 用户,例如:
- 容器用于执行运行的用户和组由平台随机化。
- 任务中的步骤定义非 root 安全性上下文。
- 任务指定一个全局非 root 安全上下文,它应用到任务中的所有步骤。
在这种情况下,请考虑以非 root 用户身份运行任务和管道运行的以下方面:
-
Git 的 SSH 身份验证要求用户在
/etc/passwd目录中配置有效的主目录。指定没有有效主目录的 UID 会导致身份验证失败。 -
SSH 身份验证会忽略
$HOME环境变量。因此,您必须将 OpenShift Pipelines 定义的$HOME目录(/tekton/home)中的 secret 文件符号链接到非 root 用户的有效主目录。
此外,若要在非 root 安全上下文中配置 SSH 身份验证,请参阅对 git 命令进行身份验证的示例。
4.6. 限制对特定步骤的 secret 访问 复制链接链接已复制到粘贴板!
默认情况下,OpenShift Pipelines 的 secret 存储在 $HOME/tekton/home 目录中,并可用于任务中的所有步骤。
要将 secret 限制为特定的步骤,请使用 secret 定义指定卷,并在特定步骤中挂载卷。
第 5 章 以非 root 用户身份使用 Buildah 构建容器镜像 复制链接链接已复制到粘贴板!
作为 root 用户在容器上运行 OpenShift Pipelines,可以将容器进程和主机公开给其他潜在的恶意资源。您可以作为容器中的特定非 root 用户运行工作负载来降低此类风险。要以非 root 用户身份使用 Buildah 运行容器镜像的构建,可以执行以下步骤:
- 定义自定义服务帐户 (SA) 和安全性上下文约束 (SCC)。
-
配置 Buildah,以使用 ID 为
1000的build用户。 - 使用自定义配置映射启动任务运行,或将其与管道运行集成。
5.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
5.2. 配置 Buildah 以使用 build 用户 复制链接链接已复制到粘贴板!
您可以定义一个 Buildah 任务,以使用带有用户 ID 1000 的 build 用户。
流程
作为普通任务,创建
buildah集群任务的副本。oc get clustertask buildah -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -
$ oc get clustertask buildah -o yaml | yq '. |= (del .metadata |= with_entries(select(.key == "name" )))' | yq '.kind="Task"' | yq '.metadata.name="buildah-as-user"' | oc create -f -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑复制的
buildah任务。oc edit task buildah-as-user
$ oc edit task buildah-as-userCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例:使用
build用户修改 Buildah 任务Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3. 使用自定义配置映射或管道运行启动任务运行 复制链接链接已复制到粘贴板!
定义自定义 Buildah 集群任务后,您可以创建一个 TaskRun 对象,该对象以 build 用户,使用用户 id 1000 来构建镜像。另外,您还可以将 TaskRun 对象集成为 PipelineRun 对象的一部分。
流程
使用自定义
ConfigMap和Dockerfile对象创建一个TaskRun对象。示例:以用户 ID
1000身份运行 Buildah 的任务运行Copy to Clipboard Copied! Toggle word wrap Toggle overflow (可选)创建管道和对应的管道运行。
示例:管道和对应的管道运行
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 启动任务运行或管道运行。
5.4. 无特权构建的限制 复制链接链接已复制到粘贴板!
无特权构建的进程可用于大多数 Dockerfile 对象。但是,一些已知的限制可能会导致构建失败:
-
由于缺少必要权限问题,使用
--mount=type=cache选项可能会失败。如需更多信息,请参阅本文档。 -
使用
--mount=type=secret选项会失败,因为挂载资源需要未由自定义 SCC 提供的额外功能。
其他资源