2.4. AWS Secrets Manager からシークレットをマウントする SSCSI ドライバーの設定


シークレットを安全に保存および管理するには、GitOps ワークフローを使用し、シークレットを AWS Secrets Manager から OpenShift Container Platform の CSI ボリュームにマウントするように Secrets Store Container Storage Interface (SSCSI) Driver Operator を設定します。たとえば、/environments/dev/ ディレクトリーにある dev namespace のデプロイメント Pod にシークレットをマウントする場合などです。

前提条件

  • GitOps リポジトリーに AWS Secrets Manager リソースが保存されている。

手順

  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 シークレットオブジェクトの読み取りを許可するアクセス許可を付与します。

    1. 認証情報要求は namespace スコープであるため、GitOps リポジトリーの namespace スコープディレクトリーに credentialsrequest-dir-aws フォルダーを作成します。たとえば、次のコマンドを実行して、/environments/dev/ ディレクトリーにある dev namespace に credentialsrequest-dir-aws フォルダーを作成します。

      $ mkdir credentialsrequest-dir-aws
    2. /environments/dev/credentialsrequest-dir-aws/ パスに認証情報リクエスト用の次の設定を含む YAML ファイルを作成し、dev namespace のデプロイメント 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
      シークレット参照の namespace。プロジェクトのデプロイメント設定に従って、この namespace フィールドの値を更新します。
      1
      クラスターが置かれているリージョンのシークレットの ARN。<aws_secret_arn><aws_region> は、クラスターのリージョンと一致する必要があります。一致しない場合は、クラスターが置かれているリージョンにシークレットのレプリケーションを作成します。
      ヒント

      クラスターリージョンを見つけるには、次のコマンドを実行します。

      $ 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. namespace スコープの SecretProviderClass リソースを作成し、シークレットストアプロバイダーを定義します。たとえば、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
      シークレットプロバイダークラスの名前。
      2
      シークレットプロバイダークラスの namespace。namespace は、シークレットを使用するリソースの namespace と一致する必要があります。
      3
      シークレットストアプロバイダーの名前。
      4
      プロバイダー固有の設定パラメーターを指定します。
      5
      AWS で作成したシークレット名。
    2. この YAML ファイルを GitOps リポジトリーにプッシュした後、namespace スコープの SecretProviderClass リソースが Argo CD UI のターゲットアプリケーションページに設定されていることを確認します。

      注記

      アプリケーションの Sync Policy が Auto に設定されていない場合は、Argo CD UI で Sync をクリックして、SecretProviderClass リソースを手動で同期できます。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.