×

AWS Secrets 和配置提供程序 (ASCP) 提供了一种将 AWS Secrets 作为 Kubernetes 存储卷公开的方法。使用 ASCP,您可以将密钥存储在 Secrets Manager 中,然后通过在 AWS 上的 Red Hat OpenShift 服务 (ROSA) 上运行的工作负载检索它们。

先决条件

在开始此过程之前,请确保您拥有以下资源和工具

  • 使用 STS 部署的 ROSA 集群

  • Helm 3

  • aws CLI

  • oc CLI

  • jq CLI

其他环境要求

  1. 运行以下命令登录到您的 ROSA 集群

    $ oc login --token=<your-token> --server=<your-server-url>

    您可以通过访问 Red Hat OpenShift 集群管理器中的集群来查找您的登录令牌:从 Red Hat OpenShift 集群管理器获取拉取密钥

  2. 运行以下命令验证您的集群是否具有 STS

    $ oc get authentication.config.openshift.io cluster -o json \
      | jq .spec.serviceAccountIssuer
    示例输出
    "https://xxxxx.cloudfront.net/xxxxx"

    如果您的输出不同,请不要继续。在继续此过程之前,请参阅创建 STS 集群的 Red Hat 文档

  3. 运行以下命令设置SecurityContextConstraints权限以允许 CSI 驱动程序运行

    $ oc new-project csi-secrets-store
    $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:csi-secrets-store:secrets-store-csi-driver
    $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
  4. 运行以下命令创建环境变量以在此过程中稍后使用

    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster \
       -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export AWS_PAGER=""

部署 AWS Secrets 和配置提供程序

  1. 使用 Helm 注册密钥存储 CSI 驱动程序,运行以下命令:

    $ helm repo add secrets-store-csi-driver \
        https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  2. 运行以下命令更新您的 Helm 存储库:

    $ helm repo update
  3. 运行以下命令安装密钥存储 CSI 驱动程序:

    $ helm upgrade --install -n csi-secrets-store \
        csi-secrets-store-driver secrets-store-csi-driver/secrets-store-csi-driver
  4. 运行以下命令部署 AWS 提供程序:

    $ oc -n csi-secrets-store apply -f \
        https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
  5. 运行以下命令检查两个 Daemonset 是否正在运行:

    $ oc -n csi-secrets-store get ds \
        csi-secrets-store-provider-aws \
        csi-secrets-store-driver-secrets-store-csi-driver
  6. 运行以下命令为密钥存储 CSI 驱动程序添加标签,以允许与受限 Pod 安全配置文件一起使用:

    $ oc label csidriver.storage.k8s.io/secrets-store.csi.k8s.io security.openshift.io/csi-ephemeral-volume-profile=restricted

创建密钥和 IAM 访问策略

  1. 运行以下命令在 Secrets Manager 中创建一个密钥:

    $ SECRET_ARN=$(aws --region "$REGION" secretsmanager create-secret \
        --name MySecret --secret-string \
        '{"username":"shadowman", "password":"hunter2"}' \
        --query ARN --output text); echo $SECRET_ARN
  2. 运行以下命令创建一个 IAM 访问策略文档:

    $ cat << EOF > policy.json
    {
       "Version": "2012-10-17",
       "Statement": [{
          "Effect": "Allow",
          "Action": [
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret"
          ],
          "Resource": ["$SECRET_ARN"]
          }]
    }
    EOF
  3. 运行以下命令创建一个 IAM 访问策略:

    $ POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
    --output text iam create-policy \
    --policy-name openshift-access-to-mysecret-policy \
    --policy-document file://policy.json); echo $POLICY_ARN
  4. 运行以下命令创建一个 IAM 角色信任策略文档:

    此信任策略锁定到您在此过程后面创建的命名空间的默认服务帐户。

    $ cat <<EOF > trust-policy.json
    {
       "Version": "2012-10-17",
       "Statement": [
       {
       "Effect": "Allow",
       "Condition": {
         "StringEquals" : {
           "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:my-application:default"]
          }
        },
        "Principal": {
           "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
        },
        "Action": "sts:AssumeRoleWithWebIdentity"
        }
        ]
    }
    EOF
  5. 运行以下命令创建一个 IAM 角色:

    $ ROLE_ARN=$(aws iam create-role --role-name openshift-access-to-mysecret \
    --assume-role-policy-document file://trust-policy.json \
    --query Role.Arn --output text); echo $ROLE_ARN
  6. 运行以下命令将角色附加到策略:

    $ aws iam attach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN

创建使用此密钥的应用程序

  1. 运行以下命令创建一个 OpenShift 项目:

    $ oc new-project my-application
  2. 运行以下命令为默认服务帐户添加注释以使用 STS 角色:

    $ oc annotate -n my-application serviceaccount default \
        eks.amazonaws.com/role-arn=$ROLE_ARN
  3. 运行以下命令创建一个密钥提供程序类以访问我们的密钥:

    $ cat << EOF | oc apply -f -
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: my-application-aws-secrets
    spec:
      provider: aws
      parameters:
        objects: |
          - objectName: "MySecret"
            objectType: "secretsmanager"
    EOF
  4. 运行以下命令使用我们的密钥创建一个部署:

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-application
      labels:
        app: my-application
    spec:
      volumes:
      - name: secrets-store-inline
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "my-application-aws-secrets"
      containers:
      - name: my-application-deployment
        image: k8s.gcr.io/e2e-test-images/busybox:1.29
        command:
          - "/bin/sleep"
          - "10000"
        volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
    EOF
  5. 运行以下命令验证 Pod 是否已挂载密钥:

    $ oc exec -it my-application -- cat /mnt/secrets-store/MySecret

清理

  1. 运行以下命令删除应用程序:

    $ oc delete project my-application
  2. 运行以下命令删除密钥存储 CSI 驱动程序:

    $ helm delete -n csi-secrets-store csi-secrets-store-driver
  3. 运行以下命令删除安全上下文约束:

    $ oc adm policy remove-scc-from-user privileged \
        system:serviceaccount:csi-secrets-store:secrets-store-csi-driver; oc adm policy remove-scc-from-user privileged \
        system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
  4. 运行以下命令删除 AWS 提供程序:

    $ oc -n csi-secrets-store delete -f \
    https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
  5. 运行以下命令删除 AWS 角色和策略:

    $ aws iam detach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN; aws iam delete-role --role-name openshift-access-to-mysecret; aws iam delete-policy --policy-arn $POLICY_ARN
  6. 运行以下命令删除 Secrets Manager 密钥:

    $ aws secretsmanager --region $REGION delete-secret --secret-id $SECRET_ARN