搜索

5.2. 使用服务帐户提供 secret

download PDF

您可以使用服务帐户为 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.comgitlab.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> 1
  password: <password> 2

1
软件仓库的用户名
2
存储库的密码或个人访问令牌

您还可以使用 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: 1

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.iomy-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> 1
  password: <password> 2

1
registry 的用户名
2
registry 的密码或个人访问令牌

您可以从现有配置文件创建 kubernetes.io/dockercfgkubernetes.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 命令行工具从凭证创建 kubernetes.io/dockerconfigjson secret,如下例所示:

示例:创建用于从凭证向容器存储库进行身份验证的 secret 的命令

$ oc create secret docker-registry docker-secret-config \
  --docker-email=<email> \ 1
  --docker-username=<username> \ 2
  --docker-password=<password> \ 3
  --docker-server=my-registry.example.com:5000 4

1
registry 的电子邮件地址
2
registry 的用户名
3
registry 的密码或个人访问令牌
4
registry 的主机名和端口

5.2.2. 使用服务帐户为 Git 配置基本身份验证

对于管道从密码保护的存储库检索资源,您可以为该管道配置基本身份验证。

注意

考虑使用基于 SSH 的身份验证而不是基本身份验证。

要为管道配置基本身份验证,请创建一个基本身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRunPipelineRun 资源关联。

注意

对于 GitHub,已弃用使用普通密码进行身份验证。而应使用个人访问令牌

流程

  1. secret.yaml 文件中为 secret 创建 YAML 清单。在此清单中,指定用户名和密码或 GitHub 个人访问令牌来访问 目标 Git 存储库。

    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
    1
    secret 的名称。在本例中,basic-user-pass
    2
    Git 存储库的用户名。
    3
    Git 存储库的密码或个人访问令牌。
  2. serviceaccount.yaml 文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: basic-user-pass 2
    1
    服务帐户的名称。在本例中,build-bot
    2
    secret 的名称。在本例中,basic-user-pass
  3. run.yaml 文件中的任务运行或管道运行创建 YAML 清单,并将服务帐户与任务运行或管道运行关联。使用以下示例之一:

    • 将服务帐户与 TaskRun 资源关联:

      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
      1
      任务运行的名称。在本例中,build-push-task-run-2
      2
      服务帐户的名称。在本例中,build-bot
      3
      任务的名称。在本例中,build-push
    • 将服务帐户与 PipelineRun 资源关联:

      apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        taskRunTemplate:
          serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      管道运行的名称。在本例中,demo-pipeline
      2
      服务帐户的名称。在本例中,build-bot
      3
      管道的名称。在本例中,demo-pipeline
  4. 输入以下命令应用您创建的 YAML 清单:

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml

5.2.3. 使用服务帐户为 Git 配置 SSH 身份验证

若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。

要为管道配置基于 SSH 的身份验证,请使用 SSH 私钥创建身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRunPipelineRun 资源关联。

流程

  1. 生成 SSH 私钥,或复制通常在 ~/.ssh/id_rsa 文件中提供的现有私钥。
  2. secret.yaml 文件中为 secret 创建 YAML 清单。在此清单中,将 ssh-privatekey 的值设置为 SSH 私钥文件的内容,并将 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
    1
    包含 SSH 私钥的机密的名称。在本例中,ssh-key
    2
    SSH 私钥文件的内容。
    3
    已知主机文件的内容。
    重要

    如果省略已知主机文件,OpenShift Pipelines 会接受任何服务器的公钥。

  3. 可选:通过在注解值末尾添加 :&lt ;port_number& gt; 来指定自定义 SSH 端口。例如: tekton.dev/git-0: github.com:2222
  4. serviceaccount.yaml 文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: ssh-key 2
    1
    服务帐户的名称。在本例中,build-bot
    2
    包含 SSH 私钥的机密的名称。在本例中,ssh-key
  5. run.yaml 文件中,将服务帐户与任务运行或管道运行关联。使用以下示例之一:

    • 将服务帐户与任务运行关联:

      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
      1
      任务运行的名称。在本例中,build-push-task-run-2
      2
      服务帐户的名称。在本例中,build-bot
      3
      任务的名称。在本例中,build-push
    • 将服务帐户与管道运行关联:

      apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        taskRunTemplate:
          serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      管道运行的名称。在本例中,demo-pipeline
      2
      服务帐户的名称。在本例中,build-bot
      3
      管道的名称。在本例中,demo-pipeline
  6. 应用更改。

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml

5.2.4. 使用服务帐户配置容器 registry 身份验证

要使管道从 registry 检索容器镜像或将容器镜像推送到 registry,您必须为该 registry 配置身份验证。

要为管道配置 registry 身份验证,请使用 Docker 配置文件创建身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRunPipelineRun 资源关联。

流程

  1. 输入以下命令,从现有 config.json 文件创建容器 registry 身份验证 secret,该文件包含身份验证信息:

    $ oc create secret generic my-registry-credentials \ 1
      --from-file=config.json=/home/user/credentials/config.json 2
    1
    secret 的名称,本例中为 my-registry-credentials
    2
    config.json 文件的路径名,本例中为 /home/user/credentials/config.json
  2. serviceaccount.yaml 文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: container-bot 1
    secrets:
      - name: my-registry-credentials 2
    1
    服务帐户的名称。在本例中,container-bot
    2
    包含 SSH 私钥的机密的名称。在本例中,my-registry-credentials
  3. 为任务运行或管道运行创建 YAML 清单,作为 run.yaml 文件运行。在这个文件中,将服务帐户与任务运行或管道运行关联。使用以下示例之一:

    • 将服务帐户与任务运行关联:

      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
      1
      任务运行的名称。在本例中,build-container-task-run-2
      2
      服务帐户的名称。在本例中,container-bot
      3
      任务的名称。在本例中,build-container
    • 将服务帐户与管道运行关联:

      apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        taskRunTemplate:
          serviceAccountName: container-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      管道运行的名称。在本例中,demo-pipeline
      2
      服务帐户的名称。在本例中,container-bot
      3
      管道的名称。在本例中,demo-pipeline
  4. 输入以下命令应用更改:

    $ 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
#     ...

但是,当使用 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 命令

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.