2.4. 配置 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
输出示例
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "csi-secrets-store-provider-aws"
授予服务帐户读取 AWS secret 对象的权限:
在 GitOps 仓库的命名空间范围的目录下创建一个
credentialsrequest-dir-aws
文件夹,因为凭据请求是命名空间范围的。例如,运行以下命令,在dev
命名空间下创建一个credentialsrequest-dir-aws
文件夹,它位于/environments/dev/
目录中:$ mkdir credentialsrequest-dir-aws
使用
/environments/dev/credentialsrequest-dir-aws/
路径中的凭证请求创建 YAML 文件,将 secret 挂载到dev
命名空间中的部署 pod:credentialsrequest.yaml
文件示例apiVersion: cloudcredential.openshift.io/v1 kind: CredentialsRequest metadata: name: aws-provider-test namespace: openshift-cloud-credential-operator spec: providerSpec: apiVersion: cloudcredential.openshift.io/v1 kind: AWSProviderSpec statementEntries: - action: - "secretsmanager:GetSecretValue" - "secretsmanager:DescribeSecret" effect: Allow resource: "<aws_secret_arn>" 1 secretRef: name: aws-creds namespace: dev 2 serviceAccountNames: - default
提示要查找集群区域,请运行以下命令:
$ oc get infrastructure cluster -o jsonpath='{.status.platformStatus.aws.region}'
输出示例
us-west-2
运行以下命令来检索 OIDC 供应商:
$ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
输出示例
https://<oidc_provider_name>
从输出中复制 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
输出示例
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
从输出中复制
<aws_role_arn>
以在下一步中使用。例如,arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds
。检查 AWS 上的角色策略,以确认角色策略中
"Resource"
的<aws_region
> 与集群区域匹配:角色策略示例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], "Resource": "arn:aws:secretsmanager:<aws_region>:<aws_account_id>:secret:my-secret-xxxxxx" } ] }
运行以下命令,使用角色 ARN 绑定服务帐户:
$ oc annotate -n <namespace> sa/<app_service_account> eks.amazonaws.com/role-arn="<aws_role_arn>"
示例命令
$ oc annotate -n dev sa/default eks.amazonaws.com/role-arn="<aws_role_arn>"
输出示例
serviceaccount/default annotated
创建命名空间范围的
SecretProviderClass
资源来定义您的 secret 存储供应商。例如,您可以在 GitOps 存储库的/environments/dev/apps/app-taxi/services/taxi/base/config
目录中创建SecretProviderClass
资源。在目标部署位于 GitOps 存储库中的同一目录中创建一个
secret-provider-class-aws.yaml
文件:secret-provider-class-aws.yaml
示例apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-aws-provider 1 namespace: dev 2 spec: provider: aws 3 parameters: 4 objects: | - objectName: "testSecret" 5 objectType: "secretsmanager"
在将此 YAML 文件推送到 GitOps 存储库后,验证命名空间范围的
SecretProviderClass
资源是否在 Argo CD UI 中的目标应用程序页面中填充。注意如果应用程序的 Sync Policy 没有设置为
Auto
,您可以通过点 Argo CD UI 中的 Sync 来手动同步SecretProviderClass
资源。