Chains 的认证

概述

必须先配置认证,才能在 Chains 中使用以下功能:

  • 在签名镜像后,将签名推送到 OCI registry
  • 在使用 Keyless signing 时,通过 Fulcio 获取 Signing Certificates

OCI Registry 认证

要推送到 OCI registry,Chains controller 会在两个位置查找凭据:

  1. 执行 Task 的 pod 中
  2. 配置用于运行 Task 的 service account 中

创建 Registry 凭据

基于现有凭据创建 Secret

如果你已经运行过 podman login,可以将存储在 config.json 中的凭据复制到 Kubernetes 中。

NOTE

请确保未使用任何外部凭据存储(例如操作系统的原生 keychain)来存储这些凭据,并且 config.json 的格式如下:

{
 "auths": {
   "<registry>": {
     "auth": "redacted"
   }
 }
}

使用 config.json 创建一个 secret:

kubectl create secret generic registry-credentials \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson \
    -n $NAMESPACE

通过命令行提供凭据创建 Secret

首先,你需要获取 registry 的凭据(此示例中它们保存在名为 credentials.json 的文件中)。然后,创建一个类型为 kubernetes.io/dockerconfigjson 的 Kubernetes secret:

kubectl create secret docker-registry registry-credentials \
  --docker-server=<gcr.io> \
  --docker-username=<username> \
  --docker-email=<email> \
  --docker-password=<password> \
  -n $NAMESPACE

设置 config.json 键

$ DOCKER_CONFIG=$(kubectl get secret -n $NAMESPACE $REGISTRY_CREDENTIALS -o jsonpath='{.data.\.dockerconfigjson}')
$ kubectl patch secret -n $NAMESPACE $REGISTRY_CREDENTIALS -p "{\"data\":{\"config.json\":\"$DOCKER_CONFIG\"}}"

使用 pod 设置凭据

使用 Pod 模板

Tekton 支持指定 Pod template 来自定义运行 Task 的 Pod。你必须在使用 cli 启动 Task 时提供 Pod template,或者将其嵌入到 TaskRun 中。

下面是一个配置了 registry-credentials secret 的 TaskRun 示例:

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  name: mytaskrun
  namespace: default
spec:
  taskRef:
    name: mytask
  podTemplate:
    imagePullSecrets:
    - name: registry-credentials

使用 ServiceAccount

为 service account 授予对该 secret 的访问权限:

kubectl patch serviceaccount $SERVICE_ACCOUNT_NAME \
  -p "{\"secrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE

现在,Chains 对在 service account $SERVICE_ACCOUNT_NAME 下运行的任何 TaskRun 都具有推送权限。

TIP

ServiceAccount 的 imagePullSecrets 属性中的 secret 也会被纳入考虑。不过,其他 Tekton 组件可能不会这样做。推荐使用 secrets 属性。

用于 Keyless Signing 的 Fulcio 认证

NOTE
  • 此方法要求环境能够访问 Internet。
  • 如果你已经部署了私有 Fulcio 服务,也可以通过调整相关配置来使用这些功能。
  • 关于部署私有 Fulcio 服务不在本文档的范围内,请参考相关文档。

基本配置

默认部署在安装到 EKS 或 GKE 集群时可用于公共 Fulcio。你只需将以下内容添加到 tekton-chains 命名空间中 chains-config ConfigMap 的 data 部分:

signers.x509.fulcio.enabled: "true"

自定义 Fulcio 端点

如果你运行的是自己的 Fulcio 实例,则需要为其进行相应配置。你还需要通过在 chains-config 中添加以下内容,将 Chains 指向你的 fulcio 实例:

signers.x509.fulcio.address: <"http://fulcio.fulcio-system.svc">

参考