4.15. 使用 git secret 验证管道
Git 机密由凭据组成,可以安全地与 Git 存储库交互,通常用于自动执行身份验证。在 Red Hat OpenShift Pipelines 中,您可以使用 Git secret 验证管道运行和在执行过程中与 Git 存储库交互的任务运行。
管道运行或任务运行通过关联的服务帐户获取对 secret 的访问权限。管道支持将 Git secret 用作基于基本身份验证和基于 SSH 的身份验证的注解(密钥值对)。
4.15.1. 凭证选择
管道运行或任务运行可能需要多次身份验证才能访问不同的 Git 存储库。使用 Pipelines 可以使用其凭证的域注解每个 secret。
Git secret 的凭证注解键必须以 tekton.dev/git-
开头,其值是您要管道使用该凭证的主机的 URL。
在以下示例中,Pipelines 使用 basic-auth
secret(依赖于用户名和密码)访问位于 github.com
和 gitlab.com
的存储库。
示例:用于基本身份验证的多个凭证
apiVersion: v1 kind: Secret metadata: 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
您还可以使用 ssh-auth
secret(私钥)来访问 Git 存储库。
示例:用于基于 SSH 的身份验证的私钥
apiVersion: v1
kind: Secret
metadata:
annotations:
tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
ssh-privatekey: 1
- 1
- SSH 私钥文件的内容。
4.15.2. 为 Git 配置基本身份验证
管道若要从密码保护的存储库检索资源,您必须为该管道配置基本身份验证。
要为管道配置基本身份验证,请使用指定存储库的 Git secret 中的凭证更新 secret.yaml
、serviceaccount.yaml
和 run.yaml
文件。完成此过程后,Pipelines 可使用该信息来检索指定的管道资源。
对于 GitHub,已弃用使用普通密码进行身份验证。而应使用个人访问令牌。
流程
在
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
在
serviceaccount.yaml
文件中,将 secret 与适当的服务帐户关联。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: basic-user-pass 2
在
run.yaml
文件中,将服务帐户与任务运行或管道运行关联。将服务帐户与任务运行关联:
apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: build-push-task-run-2 1 spec: serviceAccountName: build-bot 2 taskRef: name: build-push 3
将服务帐户与
PipelineRun
资源关联:apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
应用更改。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
4.15.3. 为 Git 配置 SSH 身份验证
若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。
要为管道配置基于 SSH 的身份验证,请使用指定存储库的 SSH 私钥中的凭证更新 secret.yaml
、serviceaccount.yaml
和 run.yaml
文件。完成此过程后,Pipelines 可使用该信息来检索指定的管道资源。
考虑使用基于 SSH 的身份验证而不是基本身份验证。
流程
-
生成 SSH 私钥,或复制通常在
~/.ssh/id_rsa
文件中提供的现有私钥。 在
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
小心如果省略私钥,Pipelines 接受任何服务器的公钥。
-
可选: 要指定一个自定义 SSH 端口,请在
annotation
值的末尾添加:<port number>
.例如:tekton.dev/git-0: github.com:2222
。 在
serviceaccount.yaml
文件中,将ssh-key
secret 与build-bot
服务帐户关联。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: ssh-key 2
在
run.yaml
文件中,将服务帐户与任务运行或管道运行关联。将服务帐户与任务运行关联:
apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: build-push-task-run-2 1 spec: serviceAccountName: build-bot 2 taskRef: name: build-push 3
将服务帐户与管道运行关联:
apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
应用更改。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
4.15.4. 在 git 类型任务中使用 SSH 身份验证
在调用 Git 命令时,您可以在任务的步骤中直接使用 SSH 身份验证。SSH 身份验证忽略 $HOME
变量,并且仅使用 /etc/passwd
文件中指定的用户主目录。因此,任务中的每个步骤都必须将 /tekton/home/.ssh
目录符号链接到相关用户的主目录。
但是,当您使用 git
类型的管道资源或 Tekton 目录中提供的 git-clone
任务时,不需要显式符号链接。
有关在 git
类型任务中使用 SSH 身份验证的示例,请参阅 authenticating-git-commands.yaml。
4.15.5. 以非 root 用户身份使用 secret
在某些情况下,您可能需要将 secret 用作非 root 用户,例如:
- 容器用于执行运行的用户和组由平台随机化。
- 任务中的步骤定义非 root 安全性上下文。
- 任务指定一个全局非 root 安全上下文,它应用到任务中的所有步骤。
在这种情况下,请考虑以非 root 用户身份运行任务和管道运行的以下方面:
-
Git 的 SSH 身份验证要求用户在
/etc/passwd
目录中配置有效的主目录。指定没有有效主目录的 UID 会导致身份验证失败。 -
SSH 身份验证会忽略
$HOME
环境变量。因此,您必须将由 Pipelines(/tekton/home
) 定义的$HOME
目录中的 secret 文件符号链接到非 root 用户的有效主目录。
此外,若要在非 root 安全上下文中配置 SSH 身份验证,请参阅对 git 命令进行身份验证的示例。
4.15.6. 限制对特定步骤的 secret 访问
默认情况下,Pipelines 的 secret 存储在 $HOME/tekton/home
目录中,并可用于任务中的所有步骤。
要将 secret 限制为特定的步骤,请使用 secret 定义指定卷,并在特定步骤中挂载卷。