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 存储库中。

流程

  1. 运行以下命令,授予 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"

  2. 授予服务帐户读取 AWS secret 对象的权限:

    1. 在 GitOps 仓库的命名空间范围的目录下创建一个 credentialsrequest-dir-aws 文件夹,因为凭据请求是命名空间范围的。例如,运行以下命令,在 dev 命名空间下创建一个 credentialsrequest-dir-aws 文件夹,它位于 /environments/dev/ 目录中:

      $ mkdir credentialsrequest-dir-aws
    2. 使用 /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

      2
      secret 引用的命名空间。根据项目部署设置更新此 namespace 字段的值。
      1
      集群所在的区域中的 secret 的 ARN。& lt;aws_ secret_arn> 的 <aws_ region> 必须与集群区域匹配。如果不匹配,在集群所在的区域中创建 secret 复制。
      提示

      要查找集群区域,请运行以下命令:

      $ oc get infrastructure cluster -o jsonpath='{.status.platformStatus.aws.region}'

      输出示例

      us-west-2

    3. 运行以下命令来检索 OIDC 供应商:

      $ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'

      输出示例

      https://<oidc_provider_name>

      从输出中复制 OIDC 供应商名称 <oidc_provider_name>,在下一步中使用。

    4. 运行以下命令,使用 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

    5. 检查 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"
      		}
      	]
      }

    6. 运行以下命令,使用角色 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

  3. 创建命名空间范围的 SecretProviderClass 资源来定义您的 secret 存储供应商。例如,您可以在 GitOps 存储库的 /environments/dev/apps/app-taxi/services/taxi/base/config 目录中创建 SecretProviderClass 资源。

    1. 在目标部署位于 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"

      1
      secret 供应商类的名称。
      2
      secret 供应商类的命名空间。命名空间必须与将使用 secret 的资源的命名空间匹配。
      3
      secret 存储供应商的名称。
      4
      指定特定于供应商的配置参数。
      5
      您在 AWS 中创建的 secret 名称。
    2. 在将此 YAML 文件推送到 GitOps 存储库后,验证命名空间范围的 SecretProviderClass 资源是否在 Argo CD UI 中的目标应用程序页面中填充。

      注意

      如果应用程序的 Sync Policy 没有设置为 Auto,您可以通过点 Argo CD UI 中的 Sync 来手动同步 SecretProviderClass 资源。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.