2.8.3. 外部シークレットストアから CSI ボリュームへのシークレットのマウント
Secrets Store CSI Driver Operator をインストールした後、次のいずれかの外部シークレットストアから CSI ボリュームにシークレットをマウントできます。
2.8.3.1. AWS Secrets Manager からのシークレットのマウント リンクのコピーリンクがクリップボードにコピーされました!
Secrets Store CSI Driver Operator を使用して、AWS Secrets Manager の外部シークレットストアから OpenShift Container Platform の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
jqツールをインストールした。 -
ccoctlユーティリティーを抽出して準備した。 - クラスターを Amazon Web Services (AWS) にインストールしており、そのクラスターは AWS Security Token Service (STS) を使用する。
- Secrets Store CSI Driver Operator がインストールされている。詳細は、「Secrets Store CSI ドライバーのインストール」を参照してください。
- 必要なシークレットを格納するように AWS Secrets Manager を設定している。
手順
AWS Secrets Manager プロバイダーをインストールします。
次の設定例を使用して YAML ファイルを作成します。
重要Secrets Store CSI ドライバーの AWS Secrets Manager プロバイダーは、アップストリームプロバイダーです。
この設定は、OpenShift Container Platform で適切に動作するように、アップストリームの AWS ドキュメント で提供されている設定から変更されています。この設定を変更すると、機能に影響が出る場合があります。
aws-provider.yamlファイルの例apiVersion: v1 kind: ServiceAccount metadata: name: csi-secrets-store-provider-aws namespace: openshift-cluster-csi-drivers --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: csi-secrets-store-provider-aws-cluster-role rules: - apiGroups: [""] resources: ["serviceaccounts/token"] verbs: ["create"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get"] - apiGroups: [""] resources: ["pods"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: csi-secrets-store-provider-aws-cluster-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: csi-secrets-store-provider-aws-cluster-role subjects: - kind: ServiceAccount name: csi-secrets-store-provider-aws namespace: openshift-cluster-csi-drivers --- apiVersion: apps/v1 kind: DaemonSet metadata: namespace: openshift-cluster-csi-drivers name: csi-secrets-store-provider-aws labels: app: csi-secrets-store-provider-aws spec: updateStrategy: type: RollingUpdate selector: matchLabels: app: csi-secrets-store-provider-aws template: metadata: labels: app: csi-secrets-store-provider-aws spec: serviceAccountName: csi-secrets-store-provider-aws hostNetwork: false containers: - name: provider-aws-installer image: public.ecr.aws/aws-secrets-manager/secrets-store-csi-driver-provider-aws:1.0.r2-50-g5b4aca1-2023.06.09.21.19 imagePullPolicy: Always args: - --provider-volume=/etc/kubernetes/secrets-store-csi-providers resources: requests: cpu: 50m memory: 100Mi limits: cpu: 50m memory: 100Mi securityContext: privileged: true volumeMounts: - mountPath: "/etc/kubernetes/secrets-store-csi-providers" name: providervol - name: mountpoint-dir mountPath: /var/lib/kubelet/pods mountPropagation: HostToContainer tolerations: - operator: Exists volumes: - name: providervol hostPath: path: "/etc/kubernetes/secrets-store-csi-providers" - name: mountpoint-dir hostPath: path: /var/lib/kubelet/pods type: DirectoryOrCreate nodeSelector: kubernetes.io/os: linux次のコマンドを実行して、
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 apply -f aws-provider.yaml
AWS シークレットオブジェクトの読み取り権限をサービスアカウントに付与します。
次のコマンドを実行して、認証情報リクエストを含むディレクトリーを作成します。
$ mkdir <aws_creds_directory_name>CredentialsRequestリソース設定を定義する YAML ファイルを作成します。次の設定例を参照してください。apiVersion: cloudcredential.openshift.io/v1 kind: CredentialsRequest metadata: name: aws-creds-request namespace: openshift-cloud-credential-operator spec: providerSpec: apiVersion: cloudcredential.openshift.io/v1 kind: AWSProviderSpec statementEntries: - action: - "secretsmanager:GetSecretValue" - "secretsmanager:DescribeSecret" effect: Allow resource: "arn:*:secretsmanager:*:*:secret:testSecret-??????" secretRef: name: aws-creds namespace: my-namespace serviceAccountNames: - <service_account_name>次のコマンドを実行して、OpenID Connect (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=<aws_creds_dir_name> \ --identity-provider-arn arn:aws:iam::<aws_account_id>:oidc-provider/<oidc_provider_name> --output-dir=<output_dir_name>出力例
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です次のコマンドを実行して、ロール ARN を持つサービスアカウントをバインドします。
$ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。
SecretProviderClassオブジェクトを定義する YAML ファイルを作成します。secret-provider-class-aws.yamlの例apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-aws-provider1 namespace: my-namespace2 spec: provider: aws3 parameters:4 objects: | - objectName: "testSecret" objectType: "secretsmanager"次のコマンドを実行して
SecretProviderClassオブジェクトを作成します。$ oc create -f secret-provider-class-aws.yaml
このシークレットプロバイダークラスを使用するデプロイメントを作成します。
Deploymentオブジェクトを定義する YAML ファイルを作成します。deployment.yamlの例apiVersion: apps/v1 kind: Deployment metadata: name: my-aws-deployment1 namespace: my-namespace2 spec: replicas: 1 selector: matchLabels: app: my-storage template: metadata: labels: app: my-storage spec: serviceAccountName: aws-provider containers: - name: busybox 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 volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "my-aws-provider"3 次のコマンドを実行して、
Deploymentオブジェクトを作成します。$ oc create -f deployment.yaml
検証
Pod ボリュームマウントの AWS Secrets Manager からシークレットにアクセスできることを確認します。
次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。
$ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/出力例
testSecret次のコマンドを実行して、Pod マウント内のシークレットを表示します。
$ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret出力例
<secret_value>