2.8.3.2. AWS Systems Manager Parameter Store からのシークレットのマウント
Secrets Store CSI Driver Operator を使用して、AWS Systems Manager Parameter Store の外部シークレットストアから 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 Systems Manager パラメーターストアを設定している。
手順
AWS Systems Manager Parameter Store プロバイダーをインストールします。
次の設定例を使用して YAML ファイルを作成します。
重要Secrets Store CSI ドライバーの AWS Systems Manager Parameter Store プロバイダーは、アップストリームのプロバイダーです。
この設定は、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: - "ssm:GetParameter" - "ssm:GetParameters" effect: Allow resource: "arn:*:ssm:*:*:parameter/testParameter*" 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: "testParameter" objectType: "ssmparameter"次のコマンドを実行して
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 Systems Manager Parameter Store からのシークレットにアクセスできることを確認します。
次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。
$ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/出力例
testParameter次のコマンドを実行して、Pod マウント内のシークレットを表示します。
$ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret出力例
<secret_value>