安全性
使用安全功能配置安全通信,并保护传输中可能敏感数据
摘要
第 1 章 配置与 Redis 的安全通信 复制链接链接已复制到粘贴板!
在 Red Hat OpenShift GitOps 中使用传输层安全 (TLS) 加密,您可以保护 Argo CD 组件和 Redis 缓存之间的通信,并保护传输中潜在的敏感数据。
您可以使用以下配置之一保护与 Redis 的通信:
-
启用
autotls设置,为 TLS 加密发布适当的证书。 -
通过使用密钥和证书对创建
argocd-operator-redis-tlssecret,手动配置 TLS 加密。
启用或没有启用高可用性 (HA) 时都可以使用这两个配置。
1.1. 先决条件 复制链接链接已复制到粘贴板!
-
您可以使用
cluster-admin权限访问集群。 - 访问 OpenShift Container Platform web 控制台。
- 在集群中安装了 Red Hat OpenShift GitOps Operator。
1.2. 为启用了 autotls 的 Redis 配置 TLS 复制链接链接已复制到粘贴板!
您可以通过在新的或已有的 Argo CD 实例中启用 autotls 设置来为 Redis 配置 TLS 加密。配置会自动置备 argocd-operator-redis-tls secret,且不需要进一步的步骤。目前,OpenShift Container Platform 是唯一受支持的 secret 供应商。
默认情况下禁用 autotls 设置。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
创建启用了
autotls的 Argo CD 实例:- 在 Web 控制台的 Administrator 视角中,使用左侧导航面板进入 Administration → CustomResourceDefinitions。
-
搜索
argocds.argoproj.io并点ArgoCD自定义资源定义 (CRD)。 - 在 CustomResourceDefinition 详情页面中,点 Instances 选项卡,然后点 Create ArgoCD。
编辑或替换类似以下示例的 YAML:
启用 autotls 的 Argo CD CR 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示另外,您可以通过运行以下命令来在已经存在的 Argo CD 实例上启用
autotls设置:oc patch argocds.argoproj.io <instance-name> --type=merge -p '{"spec":{"redis":{"autotls":"openshift"}}}'$ oc patch argocds.argoproj.io <instance-name> --type=merge -p '{"spec":{"redis":{"autotls":"openshift"}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Create。
验证 Argo CD pod 是否已就绪并在运行:
oc get pods -n <namespace>
$ oc get pods -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定运行 Argo CD 实例的命名空间,如
openshift-gitops。
禁用 HA 的输出示例
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 26s argocd-redis-84b77d4f58-vp6zm 1/1 Running 0 37s argocd-repo-server-5b959b57f4-znxjq 1/1 Running 0 37s argocd-server-6b8787d686-wv9zh 1/1 Running 0 37s
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 26s argocd-redis-84b77d4f58-vp6zm 1/1 Running 0 37s argocd-repo-server-5b959b57f4-znxjq 1/1 Running 0 37s argocd-server-6b8787d686-wv9zh 1/1 Running 0 37sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意启用 HA 的 TLS 配置需要一个至少有三个 worker 节点的集群。如果您启用了使用 HA 配置的 Argo CD 实例,可能需要几分钟时间才会显示输出。
启用了 HA 的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
argocd-operator-redis-tlssecret 是否已创建:oc get secrets argocd-operator-redis-tls -n <namespace>
$ oc get secrets argocd-operator-redis-tls -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定运行 Argo CD 实例的命名空间,如
openshift-gitops。
输出示例
NAME TYPE DATA AGE argocd-operator-redis-tls kubernetes.io/tls 2 30s
NAME TYPE DATA AGE argocd-operator-redis-tls kubernetes.io/tls 2 30sCopy to Clipboard Copied! Toggle word wrap Toggle overflow secret 必须是
kubernetes.io/tls类型,大小为2。
1.3. 为禁用了 autotls 的 Redis 配置 TLS 复制链接链接已复制到粘贴板!
您可以使用密钥和证书对创建 argocd-operator-redis-tls secret,为 Redis 手动配置 TLS 加密。另外,您必须注解 secret 以指示它属于适当的 Argo CD 实例。对于启用了高可用性 (HA) 的实例,创建证书和 secret 的步骤会有所不同。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
创建 Argo CD 实例:
- 在 Web 控制台的 Administrator 视角中,使用左侧导航面板进入 Administration → CustomResourceDefinitions。
-
搜索
argocds.argoproj.io并点ArgoCD自定义资源定义 (CRD)。 - 在 CustomResourceDefinition 详情页面中,点 Instances 选项卡,然后点 Create ArgoCD。
编辑或替换类似以下示例的 YAML:
禁用 autotls 的 ArgoCD CR 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Create。
验证 Argo CD pod 是否已就绪并在运行:
oc get pods -n <namespace>
$ oc get pods -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定运行 Argo CD 实例的命名空间,如
openshift-gitops。
禁用 HA 的输出示例
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 26s argocd-redis-84b77d4f58-vp6zm 1/1 Running 0 37s argocd-repo-server-5b959b57f4-znxjq 1/1 Running 0 37s argocd-server-6b8787d686-wv9zh 1/1 Running 0 37s
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 26s argocd-redis-84b77d4f58-vp6zm 1/1 Running 0 37s argocd-repo-server-5b959b57f4-znxjq 1/1 Running 0 37s argocd-server-6b8787d686-wv9zh 1/1 Running 0 37sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意启用 HA 的 TLS 配置需要一个至少有三个 worker 节点的集群。如果您启用了使用 HA 配置的 Argo CD 实例,可能需要几分钟时间才会显示输出。
启用了 HA 的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
根据您的 HA 配置,使用以下选项之一为 Redis 服务器创建一个自签名证书:
对于禁用了 HA 的 Argo CD 实例,请运行以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定运行 Argo CD 实例的命名空间,如
openshift-gitops。
输出示例
Generating a RSA private key ...............++++ ............................++++ writing new private key to '/tmp/redis.key'
Generating a RSA private key ...............++++ ............................++++ writing new private key to '/tmp/redis.key'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于启用了 HA 的 Argo CD 实例,运行以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定运行 Argo CD 实例的命名空间,如
openshift-gitops。
输出示例
Generating a RSA private key ...............++++ ............................++++ writing new private key to '/tmp/redis-ha.key'
Generating a RSA private key ...............++++ ............................++++ writing new private key to '/tmp/redis-ha.key'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令,验证生成的证书和密钥是否在
/tmp目录中可用:cd /tmp
$ cd /tmpCopy to Clipboard Copied! Toggle word wrap Toggle overflow ls
$ lsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 禁用 HA 的输出示例
... redis.crt redis.key ...
... redis.crt redis.key ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用了 HA 的输出示例
... redis-ha.crt redis-ha.key ...
... redis-ha.crt redis-ha.key ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您的 HA 配置,使用以下选项之一创建
argocd-operator-redis-tlssecret:对于禁用了 HA 的 Argo CD 实例,请运行以下命令:
oc create secret tls argocd-operator-redis-tls --key=/tmp/redis.key --cert=/tmp/redis.crt
$ oc create secret tls argocd-operator-redis-tls --key=/tmp/redis.key --cert=/tmp/redis.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于启用了 HA 的 Argo CD 实例,运行以下命令:
oc create secret tls argocd-operator-redis-tls --key=/tmp/redis-ha.key --cert=/tmp/redis-ha.crt
$ oc create secret tls argocd-operator-redis-tls --key=/tmp/redis-ha.key --cert=/tmp/redis-ha.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
secret/argocd-operator-redis-tls created
secret/argocd-operator-redis-tls createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
注解 secret 以表示它属于 Argo CD CR:
oc annotate secret argocd-operator-redis-tls argocds.argoproj.io/name=<instance-name>
$ oc annotate secret argocd-operator-redis-tls argocds.argoproj.io/name=<instance-name>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定 Argo CD 实例的名称,如
argocd。
输出示例
secret/argocd-operator-redis-tls annotated
secret/argocd-operator-redis-tls annotatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证 Argo CD pod 是否已就绪并在运行:
oc get pods -n <namespace>
$ oc get pods -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定运行 Argo CD 实例的命名空间,如
openshift-gitops。
禁用 HA 的输出示例
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 26s argocd-redis-84b77d4f58-vp6zm 1/1 Running 0 37s argocd-repo-server-5b959b57f4-znxjq 1/1 Running 0 37s argocd-server-6b8787d686-wv9zh 1/1 Running 0 37s
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 26s argocd-redis-84b77d4f58-vp6zm 1/1 Running 0 37s argocd-repo-server-5b959b57f4-znxjq 1/1 Running 0 37s argocd-server-6b8787d686-wv9zh 1/1 Running 0 37sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您启用了使用 HA 配置的 Argo CD 实例,可能需要几分钟时间才会显示输出。
启用了 HA 的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 2 章 使用带有 GitOps 的 Secret Store CSI 驱动程序安全地管理 secret 复制链接链接已复制到粘贴板!
本指南指导您完成将 Secret Store Container Storage Interface (SSCSI)驱动程序与 OpenShift Container Platform 4.14 及之后的版本中的 GitOps Operator 集成的过程。
2.1. 使用带有 GitOps 的 Secrets Store CSI 驱动程序管理 secret 概述 复制链接链接已复制到粘贴板!
有些应用程序需要敏感信息,如密码和用户名,它们必须被视为良好的安全实践。如果因为集群中未正确配置基于角色的访问控制(RBAC)而公开敏感信息,则具有 API 或 etcd 访问权限的任何人都可以检索或修改 secret。
有权在命名空间中创建 pod 的任何人都可以使用该 RBAC 来读取该命名空间中的所有 secret。使用 SSCSI Driver Operator,您可以使用外部 secret 存储来安全地存储和向 pod 提供敏感信息。
2.1.1. 优点 复制链接链接已复制到粘贴板!
将 SSCSI 驱动程序与 GitOps Operator 集成具有以下优点:
- 提高 GitOps 工作流的安全性和效率
- 有助于将 secret 作为卷附加到部署 pod 中
- 确保安全而高效地访问敏感信息
2.2. Secret 存储供应商 复制链接链接已复制到粘贴板!
以下 secret 存储供应商可用于 Secret Store CSI Driver Operator:
- AWS Secrets Manager
- AWS Systems Manager Parameter Store
- Microsoft Azure Key Vault
- HashiCorp Vault
2.3. 使用 GitOps 在 OpenShift 上配置 AWS Secrets Manager 复制链接链接已复制到粘贴板!
本指南提供了一些示例,可帮助您将 GitOps 工作流与 Secrets Store Container Storage Interface (SSCSI) Driver Operator 搭配使用,将 secret 从 AWS Secret Manager 挂载到 OpenShift Container Platform 中的 CSI 卷。
例如,假设您使用 AWS Secret Manager 作为带有 SSCSI Driver Operator 的 secret 存储供应商。以下示例显示了 GitOps 存储库中的目录结构,它可以使用 AWS Secret Manager 中的 secret:
GitOps 存储库中的目录结构示例
2.3.1. 在 GitOps 仓库中存储 AWS Secret Manager 资源 复制链接链接已复制到粘贴板!
您可以将 AWS Secret Manager 配置存储在 GitOps 存储库中,以进行声明性和版本控制的 secret 管理。
在托管的 control plane 集群中不支持使用带有 AWS Secret Manager 的 SSCSI Driver Operator。
先决条件
-
您可以使用
cluster-admin权限访问集群。 - 访问 OpenShift Container Platform web 控制台。
-
您已提取并准备好
ccoctl二进制文件。 -
已安装
jqCLI 工具。 - 您的集群安装在 AWS 上,并使用 AWS 安全令牌服务 (STS)。
- 您已将 AWS Secrets Manager 配置为存储所需的 secret。
- 在集群中安装了 SSCSI Driver Operator。
- 在集群中安装了 Red Hat OpenShift GitOps Operator。
- 您有一个 GitOps 存储库可以使用 secret。
- 您可以使用 Argo CD admin 帐户登录到 Argo CD 实例。
流程
安装 AWS Secrets Manager 供应商并添加资源:
在 GitOps 仓库中,创建一个目录并添加
aws-provider.yaml文件,使用以下配置来部署 AWS Secret Manager 供应商的资源:重要SSCSI 驱动程序的 AWS Secret Manager 供应商是一个上游供应商。
此配置会根据上游 AWS 文档中提供的配置进行修改,以便它可以与 OpenShift Container Platform 正常工作。对此配置的更改可能会影响功能。
aws-provider.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 GitOps 仓库中添加
secret-provider-app.yaml文件,为 AWS Secret Manager 创建应用程序和部署资源:secret-provider-app.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 更新
repoURL字段的值,以指向您的 GitOps 存储库。
将资源与默认的 Argo CD 实例同步,以在集群中部署这些资源:
在部署应用程序的
openshift-cluster-csi-drivers命名空间中添加标签,以便openshift-gitops命名空间中的 Argo CD 实例可以管理它:oc label namespace openshift-cluster-csi-drivers argocd.argoproj.io/managed-by=openshift-gitops
$ oc label namespace openshift-cluster-csi-drivers argocd.argoproj.io/managed-by=openshift-gitopsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将 GitOps 存储库中的资源应用到集群,包括您刚才推送的
aws-provider.yaml文件:输出示例
application.argoproj.io/argo-app created application.argoproj.io/secret-provider-app created ...
application.argoproj.io/argo-app created application.argoproj.io/secret-provider-app created ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在 Argo CD UI 中,您可以观察 csi-secrets-store-provider-aws daemonset 继续同步资源。要解决这个问题,您必须配置 SSCSI 驱动程序来从 AWS Secret Manager 挂载 secret。
2.3.2. 配置 SSCSI 驱动程序以从 AWS Secret Manager 挂载 secret 复制链接链接已复制到粘贴板!
要安全地存储和管理您的 secret,请使用 GitOps 工作流,并将 Secret Store Container Storage Interface (SSCSI) Driver Operator 将 secret 从 AWS Secret Manager 挂载到 OpenShift Container Platform 中的 CSI 卷。例如,请考虑您要将 secret 挂载到 dev 命名空间下的部署 pod 中,该 pod 位于 /environments/dev/ 目录下。
先决条件
- 您有 AWS Secrets Manager 资源存储在 GitOps 存储库中。
流程
运行以下命令,授予
csi-secrets-store-provider-aws服务帐户的特权访问权限:oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-driversCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "csi-secrets-store-provider-aws"
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "csi-secrets-store-provider-aws"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 授予服务帐户读取 AWS secret 对象的权限:
在 GitOps 仓库的命名空间范围的目录下创建一个
credentialsrequest-dir-aws文件夹,因为凭据请求是命名空间范围的。例如,运行以下命令,在dev命名空间下创建一个credentialsrequest-dir-aws文件夹,它位于/environments/dev/目录中:mkdir credentialsrequest-dir-aws
$ mkdir credentialsrequest-dir-awsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
/environments/dev/credentialsrequest-dir-aws/路径中的凭证请求创建 YAML 文件,将 secret 挂载到dev命名空间中的部署 pod:credentialsrequest.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示要查找集群区域,请运行以下命令:
oc get infrastructure cluster -o jsonpath='{.status.platformStatus.aws.region}'$ oc get infrastructure cluster -o jsonpath='{.status.platformStatus.aws.region}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
us-west-2
us-west-2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来检索 OIDC 供应商:
oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
$ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
https://<oidc_provider_name>
https://<oidc_provider_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从输出中复制 OIDC 供应商名称
<oidc_provider_name>,在下一步中使用。运行以下命令,使用
ccoctl工具处理凭证请求:ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-output$ ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-outputCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-creds
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-credsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从输出中复制
<aws_role_arn>以在下一步中使用。例如,arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds。检查 AWS 上的角色策略,以确认角色策略中
"Resource"的<aws_region> 与集群区域匹配:角色策略示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,使用角色 ARN 绑定服务帐户:
oc annotate -n <namespace> sa/<app_service_account> eks.amazonaws.com/role-arn="<aws_role_arn>"
$ oc annotate -n <namespace> sa/<app_service_account> eks.amazonaws.com/role-arn="<aws_role_arn>"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令
oc annotate -n dev sa/default eks.amazonaws.com/role-arn="<aws_role_arn>"
$ oc annotate -n dev sa/default eks.amazonaws.com/role-arn="<aws_role_arn>"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
serviceaccount/default annotated
serviceaccount/default annotatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建命名空间范围的
SecretProviderClass资源来定义您的 secret 存储供应商。例如,您可以在 GitOps 存储库的/environments/dev/apps/app-taxi/services/taxi/base/config目录中创建SecretProviderClass资源。在目标部署位于 GitOps 存储库中的同一目录中创建一个
secret-provider-class-aws.yaml文件:secret-provider-class-aws.yaml示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在将此 YAML 文件推送到 GitOps 存储库后,验证命名空间范围的
SecretProviderClass资源是否在 Argo CD UI 中的目标应用程序页面中填充。注意如果应用程序的 Sync Policy 没有设置为
Auto,您可以通过点 Argo CD UI 中的 Sync 来手动同步SecretProviderClass资源。
2.3.3. 配置 GitOps 受管资源以使用挂载的 secret 复制链接链接已复制到粘贴板!
您必须通过将卷挂载配置添加到部署,并将容器 pod 配置为使用挂载的 secret 来配置 GitOps 管理的资源。
先决条件
- 您有 AWS Secrets Manager 资源存储在 GitOps 存储库中。
- 您已将 Secret Store Container Storage Interface (SSCSI)驱动程序配置为从 AWS Secret Manager 挂载 secret。
流程
配置 GitOps 受管资源。例如,请考虑将卷挂载配置添加到
app-taxi应用的部署中,且100-deployment.yaml文件位于/environments/dev/apps/app-taxi/services/taxi/base/config/目录中。- 在 Argo CD UI 中,点目标应用程序页面中的 REFRESH 以应用更新的部署清单。
- 验证目标应用程序页面中都已成功同步所有资源。
验证您是否可以从 pod 卷挂载中的 AWS Secret Manager 访问 secret:
列出 pod 挂载中的 secret:
oc exec <deployment_name>-<hash> -n <namespace> -- ls /mnt/secrets-store/
$ oc exec <deployment_name>-<hash> -n <namespace> -- ls /mnt/secrets-store/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令
oc exec taxi-5959644f9-t847m -n dev -- ls /mnt/secrets-store/
$ oc exec taxi-5959644f9-t847m -n dev -- ls /mnt/secrets-store/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
<secret_name>
<secret_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看 pod 挂载中的 secret:
oc exec <deployment_name>-<hash> -n <namespace> -- cat /mnt/secrets-store/<secret_name>
$ oc exec <deployment_name>-<hash> -n <namespace> -- cat /mnt/secrets-store/<secret_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令
oc exec taxi-5959644f9-t847m -n dev -- cat /mnt/secrets-store/testSecret
$ oc exec taxi-5959644f9-t847m -n dev -- cat /mnt/secrets-store/testSecretCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
<secret_value>
<secret_value>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
您可以通过在 OpenShift Container Platform 上使用 Secrets Store CSI Driver Operator 将 HashiCorp Vault 配置为 secret 供应商。与 Argo CD 管理的 GitOps 工作流结合使用时,此设置可让您安全地从 Vault 检索 secret,并将其注入到 OpenShift 上运行的应用程序。
构建 GitOps 存储库并配置 Vault CSI 供应商,以便与 OpenShift Container Platform 中的 Secret Store CSI Driver 集成。
以下 GitOps 存储库布局示例用于将 Vault 与应用程序集成。
GitOps 存储库中的目录结构示例
2.4.1. 使用 GitOps 安装 Vault CSI 供应商 复制链接链接已复制到粘贴板!
通过部署使用 HashiCorp 的官方 Helm Chart 的 Argo CD 应用程序来安装 Vault CSI 供应商。这个方法通过一个版本控制的 Argo CD Application 资源以声明性方式管理安装来遵循 GitOps 最佳实践。
先决条件
- 以管理员身份登陆到 OpenShift Container Platform 集群。
- 访问 OpenShift Container Platform web 控制台。
- 在集群中安装了 SSCSI Driver Operator。
- 您已在 OpenShift Container Platform 集群上安装了 Red Hat OpenShift GitOps。
- 您有一个 GitOps 存储库可以使用 secret。
流程
为 Vault CSI 供应商创建 Argo CD 应用程序资源。
创建 Argo CD Application 资源来部署 Vault CSI 供应商。将此资源添加到 GitOps 存储库中,如
config/argocd/vault-secret-provider-app.yaml:vault-secret-provider-app.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意Helm 值中的
server.enabled: true和dataStorage.enabled: false设置使用临时存储部署 HashiCorp Vault 服务器实例。此设置适用于开发或测试环境。对于生产环境,您可以使用持久性卷(PV)启用dataStorage,或使用外部 Vault 集群,并将server.enabled设置为false。如果已部署了 Vault 服务器,您可以将server.enabled设置为false。
将
vault-secret-provider-app.yaml文件从 GitOps 存储库应用到集群:oc apply -f vault-secret-provider-app.yaml
$ oc apply -f vault-secret-provider-app.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 部署 Vault CSI 供应商后,
vault-csi-providerDaemonSet 可能无法运行。出现这个问题的原因是,OpenShift Container Platform 默认限制特权容器。另外,Vault CSI 供应商和 Secrets Store CSI Driver 需要访问hostPath挂载,OpenShift Container Platform 块会因为 pod 以特权方式运行。要解决 OpenShift Container Platform 中的权限问题:
对
vault-csi-providerDaemonSet 进行补丁,使其容器作为特权运行:oc patch daemonset vault-csi-provider -n vault-csi-provider --type=json --patch='[{"op":"add","path":"/spec/template/spec/containers/0/securityContext","value":{"privileged":true}}]$ oc patch daemonset vault-csi-provider -n vault-csi-provider --type=json --patch='[{"op":"add","path":"/spec/template/spec/containers/0/securityContext","value":{"privileged":true}}]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 授予 Secrets Store CSI Driver 服务帐户对 OpenShift Container Platform 中特权安全上下文约束(SCC)的访问权限。
oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-cluster-csi-drivers:secrets-store-csi-driver-operator
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-cluster-csi-drivers:secrets-store-csi-driver-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为 Vault CSI Provider 服务帐户授予 OpenShift Container Platform 中特权安全性上下文约束(SCC)的访问权限。
oc adm policy add-scc-to-user privileged \ system:serviceaccount:vault-csi-provider:vault-csi-provider
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:vault-csi-provider:vault-csi-providerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果在 Helm Chart 中将
server.enabled设为true,则 Vault 服务器 Pod 默认使用 OpenShift Container Platform 块的特定用户 ID (UID)或组 ID (GID)运行。为 Vault 服务器服务帐户授予所需的安全性上下文约束(SCC)权限。
oc adm policy add-scc-to-user anyuid system:serviceaccount:vault-csi-provider:vault
$ oc adm policy add-scc-to-user anyuid system:serviceaccount:vault-csi-provider:vaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.2. 初始化并配置 Vault 以存储 Secret 复制链接链接已复制到粘贴板!
使用 Argo CD 部署 Vault 并应用必要的 SCC 权限和 DaemonSet 补丁后,初始化 Vault,取消密封,并配置 Kubernetes 身份验证以启用安全的 secret 存储和访问。
流程
访问 Vault Pod。
如果 Vault 在 OpenShift Container Platform 集群中运行,例如,作为
vault-csi-provider命名空间中的vault-0pod,请运行以下命令访问 pod 中的 Vault CLI:oc exec -it vault-0 -n vault-csi-provider -- /bin/sh
$ oc exec -it vault-0 -n vault-csi-provider -- /bin/shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
初始化 Vault。
如果您的 Vault 实例尚未初始化,请运行以下命令:
vault operator init
$ vault operator initCopy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,会显示以下输出。
5 Unseal Keys - required to unseal the Vault. Initial Root Token - required to log in and configure Vault.
5 Unseal Keys - required to unseal the Vault. Initial Root Token - required to log in and configure Vault.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要安全地存储这些凭据。对于不密封 Vault,至少需要 3 个非密封密钥。如果密钥丢失,则永久阻止对存储的 secret 的访问。
非密封 Vault.
Vault 以密封状态启动。运行以下命令使用上一步中获取的五个 Unseal Keys 的三个内容:
vault operator unseal <Unseal Key 1>
$ vault operator unseal <Unseal Key 1> vault operator unseal <Unseal Key 2> vault operator unseal <Unseal Key 3>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 取消密封后,Vault 变为活动状态并可供使用。
登录 Vault。
要使用 root 令牌登录到 Vault,请运行以下命令:
vault login <Initial Root Token>
$ vault login <Initial Root Token>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这为管理员提供了启用和配置 secret 引擎和身份验证方法的访问权限。
在 Vault 中启用 Kubernetes 身份验证。
运行以下命令,以在 Vault 中启用 Kubernetes 身份验证。
vault auth enable kubernetes
$ vault auth enable kubernetesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这允许 Kubernetes 工作负载(如 pod)使用其服务帐户通过 Vault 进行身份验证。
在 Vault 中配置 Kubernetes 验证方法。
要配置 Vault 以便与 Kubernetes API 通信,请运行以下命令:
vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc" \ token_reviewer_jwt="$(cat/var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_host="https://${KUBERNETES_PORT_443_TCP_ADDR}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt$ vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc" \ token_reviewer_jwt="$(cat/var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_host="https://${KUBERNETES_PORT_443_TCP_ADDR}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 因此,会显示以下输出。
Success! Data written to: auth/kubernetes/config
Success! Data written to: auth/kubernetes/configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
-
<issuer> 是 Kubernetes 令牌签发者 URL 的名称。 -
<token_reviewer_jwt> 是一个 JSON Web Token (JWT),Vault 用来调用 KubernetesTokenReviewAPI,用于验证服务帐户令牌。 -
<kubernetes_host> 是 Vault 用于与 Kubernetes API 服务器通信的 URL。 -
<kubernetes_ca_cert> 是 Vault 用于安全与 Kubernetes API 服务器通信的 CA 证书。
-
2.4.3. 在 Vault 中管理 Secret、策略和角色 复制链接链接已复制到粘贴板!
要在 Vault 中创建 secret,请定义 Vault 策略并配置 Kubernetes 身份验证角色,使 Kubernetes 工作负载能够安全地检索 secret。
流程
启用 KV Secrets Engine
使用 Key-Value (KV)版本 2 secret 引擎来存储支持版本控制的任意 secret。运行以下命令在路径 secret/ 中启用 KV secret 引擎:
vault secrets enable -path=secret/ kv
$ vault secrets enable -path=secret/ kvCopy to Clipboard Copied! Toggle word wrap Toggle overflow
在 Vault 中存储机密。
使用 KV Version 2 secret 引擎存储 secret。运行以下命令,将 secret 数据、用户名和密码存储在路径
secret/demo/config:vault kv put secret/demo/config username="demo-user" password="demo-pass"
$ vault kv put secret/demo/config username="demo-user" password="demo-pass"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 Vault 策略。
要创建授予对 secret 的读取访问权限的策略,请运行以下命令:
vault policy write demo-app-policy -<<EOF path "secret/demo/config" { capabilities = ["read"] } EOF$ vault policy write demo-app-policy -<<EOF path "secret/demo/config" { capabilities = ["read"] } EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此
demo-app-policy授予对secret/demo/config的读取访问权限,稍后链接到 Kubernetes 角色。
在 Vault 中创建 Kubernetes 身份验证角色。
要创建将 Kubernetes 服务帐户绑定到 Vault 策略的角色,请运行以下命令:
vault write auth/kubernetes/role/app \ bound_service_account_names=demo-app-sa \ bound_service_account_namespaces=demo-app \ policies=demo-app-policy \ ttl=24h
$ vault write auth/kubernetes/role/app \ bound_service_account_names=demo-app-sa \ bound_service_account_namespaces=demo-app \ policies=demo-app-policy \ ttl=24hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这允许使用服务帐户向 Vault 进行身份验证并检索该 secret。
其中:
-
<bound_service_account_names> 是 Vault 信任的 Kubernetes 服务帐户的名称。 -
<bound_service_account_namespaces> 是服务帐户所在的命名空间的名称。 -
<policies> 是附加的 Vault 策略的名称。 -
<TTL> 是为令牌发布的生存时间值。
-
2.4.4. 配置 GitOps 受管资源以使用 Vault 挂载的 secret 复制链接链接已复制到粘贴板!
使用 Secret Store CSI 驱动程序和 Vault 供应商,安全地将 HashiCorp Vault 中的 secret 注入 GitOps 管理的 Kubernetes 工作负载。secret 挂载为 pod 文件系统中文件,允许应用程序在不将其存储在 Kubernetes Secret 对象中的情况下访问数据。
流程
创建
SecretProviderClass。在应用程序的清单目录中创建一个
SecretProviderClass资源,如environments/dev/apps/demo-app/manifest/secretProviderClass.yaml。此资源定义 Secret Store CSI 驱动程序如何从 Vault 检索 secret。vault-secret-provider-app.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个应用程序,如
ServiceAccount。为应用程序工作负载创建一个 Kubernetes
ServiceAccount。ServiceAccount名称必须与 Vault Kubernetes 身份验证角色中定义的bound_service_account_names值匹配。将清单存储在 GitOps 存储库中,如environments/dev/apps/demo-app/manifest/serviceAccount.yaml。ServiceAccount.yaml文件示例apiVersion: v1 kind: ServiceAccount metadata: name: demo-app-sa namespace: demo-app
apiVersion: v1 kind: ServiceAccount metadata: name: demo-app-sa namespace: demo-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建应用程序部署:
修改应用程序的部署,以使用指定的
ServiceAccount并使用 CSI 卷挂载 secret。将更新的清单存储在 GitOps 存储库中,如environments/dev/apps/demo-app/manifest/deployment.yaml:deployment.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
serviceAccountName- 分配 KubernetesServiceAccount名称,如demo-app-sa,供应用 Pod 使用。此ServiceAccount是使用 HashiCorp Vault 进行身份验证的基础,因为它链接到授予授予检索所需 secret 权限的 Vault 角色。- 2
volumeMounts- 将 vault-secrets 卷挂载到/mnt/secrets-store目录中的容器中。- 3
volumes- 使用secrets-store.csi.k8s.io驱动程序定义 vault-secrets 卷,并引用demo-app-credsSecretProviderClass。
为工作负载定义 Argo CD 应用程序:
定义 Argo CD 应用程序资源以部署应用程序组件,如
ServiceAccount、SecretProviderClass和来自 GitOps 存储库的Deployment。将 Argo CD 清单存储在目录位置,如environments/dev/apps/demo-app/argocd/demo-app.yaml。demo-app.yaml文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.5. 验证 secret 注入 复制链接链接已复制到粘贴板!
验证 secret 注入,以确保 Vault 包含预期值。
流程
检查 Pod 状态。
在 Argo CD 应用程序同步并部署了所有资源后,验证应用程序 pod 是否在
demo-app命名空间中运行。运行以下命令:oc get pods -n demo-app
$ oc get pods -n demo-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow
打开 Shell 会话。
使用应用容器集的名称打开 shell 会话。将
<your-app-pod-name> 替换为实际的 pod 名称。oc exec -it <your-app-pod-name> -n demo-app -- sh
$ oc exec -it <your-app-pod-name> -n demo-app -- shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证挂载的 secret。
要验证 secret 是否挂载到预期的路径中,请运行以下命令:
ls -l /mnt/secrets-store
$ ls -l /mnt/secrets-store cat /mnt/secrets-store/demoAppUsername cat /mnt/secrets-store/demoAppPasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证挂载的 secret 文件
demoAppUsername和demoAppPassword是否包含来自 Vault 的预期值。
第 3 章 在 Argo CD Web UI 中屏蔽敏感注解 复制链接链接已复制到粘贴板!
Argo CD 从 Argo CD 用户界面(UI)和命令行界面(CLI)隐藏 Secret 资源上的敏感注解值。用户可以通过在 Argo CD 自定义资源(CR)中指定要屏蔽的注解键来配置此功能。此功能可以防止意外公开敏感信息,如令牌或 API 密钥,存储在 Secret 资源上的注解中。
要启用此功能,请在 Argo CD CR 的 .spec.extraConfig 下添加 resource.sensitive.mask.annotations 键。指定要屏蔽的、以逗号分隔的注解键列表。
确保 resource.sensitive.mask.annotations 中列出的注解键准确且与您的用例相关。此功能不支持通配符,需要 Argo CD CR 中的显式配置。
先决条件
- 您已创建了 Argo CD 实例。如需更多信息,请参阅"安装用户定义的 Argo CD 实例"。
3.1. 在 Argo CD Web UI 中启用敏感注解掩码 复制链接链接已复制到粘贴板!
要在 Argo CD 用户界面(UI)中启用敏感注解掩码,您可以在 Argo CD 自定义资源(CR)中添加注解键 resource.sensitive.mask.annotations。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
- 在 Web 控制台的 Administrator 视角中,点 Operators → Installed Operators。
- 从 Project 列表中,创建或选择您要安装用户定义的 Argo CD 实例的项目。
- 在安装的 Operator 列表中,选择 Red Hat OpenShift GitOps,然后点 Argo CD 选项卡。
要编辑 Argo CD CR,请完成以下步骤:
-
在
.spec.extraConfig部分下,添加resource.sensitive.mask.annotations键。 要屏蔽以逗号分隔的值列表,请在以下 YAML 片断中指定注解键:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定以逗号分隔的敏感注解值列表,如
openshift.io/token-secret.value、api-key和token。
-
在
要验证 Argo CD 资源中的值是否已成功更新,请完成以下步骤:
- 在 Web 控制台的 Administrator 视角中,点 Operators → Installed Operators。
-
在 Project 选项中,选择
Argo CD命名空间。 - 在安装的 Operator 列表中,选择 Red Hat OpenShift GitOps,然后点 Argo CD 选项卡。
- 验证 ArgoCD 实例的 Status 字段显示为 Phase: Available。
Argo CD 在 Argo CD UI 中隐藏指定注解键的值。