2.7. 外部シークレットストアを使用した機密データの Pod への提供
アプリケーションによっては、パスワードやユーザー名など開発者に使用させない秘密情報が必要になります。
Kubernetes Secret
オブジェクトを使用して機密情報を提供する代わりに、外部シークレットストアを使用して機密情報を保存できます。Secrets Store CSI Driver Operator を使用して、外部シークレットストアと統合し、シークレットコンテンツを Pod ボリュームとしてマウントできます。
GCP Filestore CSI Driver Operator は、テクノロジープレビュー機能としてのみ提供されます。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
2.7.1. Secrets Store CSI Driver Operator について
Kubernetes シークレットは Base64 エンコーディングで保存されます。etcd は、これらのシークレットの保存時に暗号化しますが、シークレットの取得時に、シークレットが復号化されてユーザーに表示されます。クラスターでロールベースのアクセス制御が適切に設定されていない場合、API または etcd へのアクセス権を持つユーザーは誰でもシークレットを取得または変更できます。さらに、namespace で Pod を作成する権限を持つ人は誰でも、そのアクセス権を使用して、その namespace 内の任意のシークレットを読み取ることができます。
シークレットを安全に保存および管理するには、プロバイダープラグインを使用して、Azure Key Vault などの外部シークレット管理システムからシークレットをマウントするように OpenShift Container Platform Secrets Store Container Storage Interface (CSI) Driver Operator を設定できます。アプリケーションはシークレットを使用できますが、アプリケーション Pod が破棄されるとシークレットはシステム上に保持されません。
Secrets Store CSI Driver Operator (secrets-store.csi.k8s.io
) を使用すると、OpenShift Container Platform で、エンタープライズグレードの外部シークレットストアに保存されている複数のシークレット、キー、証明書をボリュームとして Pod にマウントできます。Secrets Store CSI Driver Operator は、gRPC を使用してプロバイダーと通信し、指定された外部シークレットストアからマウントコンテンツを取得します。ボリュームがアタッチされると、その中のデータがコンテナーのファイルシステムにマウントされます。シークレットストアボリュームはインラインでマウントされます。
2.7.1.1. シークレットストアプロバイダー
次のシークレットストアプロバイダーは、Secrets Store CSI Driver Operator で使用できます。
- AWS Secrets Manager
- AWS Systems Manager パラメーターストア
- Azure Key Vault
2.7.1.2. 自動ローテーション
Secrets Store CSI ドライバーは、外部シークレットストアのコンテンツを使用して、マウントされたボリューム内のコンテンツを定期的にローテーションします。外部シークレットストアでシークレットが更新されると、マウントされたボリュームでもシークレットが更新されます。Secrets Store CSI Driver Operator は、2 分ごとに更新をポーリングします。
Kubernetes シークレットとしてマウントされたコンテンツの同期を有効にした場合は、Kubernetes シークレットもローテーションされます。
シークレットデータを使用するアプリケーションは、シークレットの更新を監視する必要があります。
2.7.2. Secrets Store CSI ドライバーのインストール
前提条件
- OpenShift Container Platform Web コンソールにアクセスできる。
- 管理者としてクラスターにアクセスできる。
手順
Secrets Store CSI ドライバーをインストールするには、以下を実行します。
Secrets Store CSI Driver Operator をインストールします。
- Web コンソールにログインします。
-
Operators
OperatorHub をクリックします。 - フィルターボックスに "Secrets Store CSI" と入力し、Secrets Store CSI Driver Operator を見つけます。
- Secrets Store CSI Driver Operator ボタンをクリックします。
- Secrets Store CSI Driver Operator ページで、Install をクリックします。
Install Operator のページで、以下のことを確認してください。
- All namespaces on the cluster (default) が選択されている。
- Installed Namespace が openshift-cluster-csi-drivers に設定されている。
Install をクリックします。
インストールが終了すると、Web コンソールの Installed Operators セクションに GCP Filestore CSI Driver Operator がリストされます。
ドライバーの
ClusterCSIDriver
インスタンス (secrets-store.csi.k8s.io
) を作成します。-
Administration
CustomResourceDefinitions ClusterCSIDriver をクリックします。 Instances タブで Create ClusterCSIDriver をクリックします。
以下の YAML ファイルを使用します。
apiVersion: operator.openshift.io/v1 kind: ClusterCSIDriver metadata: name: secrets-store.csi.k8s.io spec: managementState: Managed
- Create をクリックします。
-
Administration
2.7.3. 外部シークレットストアから CSI ボリュームへのシークレットのマウント
Secrets Store CSI Driver Operator をインストールした後、次のいずれかの外部シークレットストアから CSI ボリュームにシークレットをマウントできます。
2.7.3.1. AWS Secrets Manager からのシークレットのマウント
Secrets Store CSI Driver Operator を使用して、AWS Secrets Manager から OpenShift Container Platform の CSI ボリュームにシークレットをマウントできます。AWS Secrets Manager からシークレットをマウントするには、クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用する必要があります。
ホスト型コントロールプレーンクラスターで AWS Secrets Manager を使用する Secrets Store CSI Driver Operator を使用することはサポートされていません。
前提条件
- クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用している。
- Secrets Store CSI Driver Operator がインストールされている。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
- 必要なシークレットを保存するように AWS Secrets Manager を設定している。
-
ccoctl
バイナリーを抽出して準備している。 -
jq
CLI ツールがインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
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 credentialsrequest-dir-aws
認証情報リクエスト用に次の設定を使用して YAML ファイルを作成します。
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: "arn:*:secretsmanager:*:*:secret:testSecret-??????" secretRef: name: aws-creds namespace: my-namespace serviceAccountNames: - aws-provider
次のコマンドを実行して、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=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
。 です次のコマンドを実行して、ロール 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-provider 1 namespace: my-namespace 2 spec: provider: aws 3 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-deployment 1 namespace: my-namespace 2 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 busybox-<hash> -n my-namespace -- ls /mnt/secrets-store/
出力例
testSecret
Pod マウントのシークレットを表示します。
$ oc exec busybox-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
出力例
<secret_value>
2.7.3.2. AWS Systems Manager パラメーターストアからのシークレットのマウント
Secrets Store CSI Driver Operator を使用して、AWS Systems Manager Parameter Store から OpenShift Container Platform の CSI ボリュームにシークレットをマウントできます。AWS Systems Manager パラメーターストアからシークレットをマウントするには、クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用する必要があります。
ホスト型コントロールプレーンクラスターで AWS Systems Manager パラメーターストアで Secrets Store CSI Driver Operator を使用することはサポートされていません。
前提条件
- クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用している。
- Secrets Store CSI Driver Operator がインストールされている。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
- 必要なシークレットを保存するように AWS Systems Manager パラメーターストアを設定している。
-
ccoctl
バイナリーを抽出して準備している。 -
jq
CLI ツールがインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
AWS Systems Manager パラメーターストアプロバイダーをインストールします。
プロバイダーリソース用に次の設定を使用して YAML ファイルを作成します。
重要Secrets Store CSI ドライバーの AWS Systems 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 credentialsrequest-dir-aws
認証情報リクエスト用に次の設定を使用して YAML ファイルを作成します。
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: - "ssm:GetParameter" - "ssm:GetParameters" effect: Allow resource: "arn:*:ssm:*:*:parameter/testParameter*" secretRef: name: aws-creds namespace: my-namespace serviceAccountNames: - aws-provider
次のコマンドを実行して、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=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
。 です次のコマンドを実行して、ロール 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-provider 1 namespace: my-namespace 2 spec: provider: aws 3 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-deployment 1 namespace: my-namespace 2 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 パラメーターストアからシークレットにアクセスできることを確認します。
Pod マウント内のシークレットをリスト表示します。
$ oc exec busybox-<hash> -n my-namespace -- ls /mnt/secrets-store/
出力例
testParameter
Pod マウントのシークレットを表示します。
$ oc exec busybox-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
出力例
<secret_value>
2.7.3.3. Azure Key Vault からのシークレットのマウント
Secrets Store CSI Driver Operator を使用して、Azure Key Vault から OpenShift Container Platform の CSI ボリュームにシークレットをマウントできます。Azure Key Vault からシークレットをマウントするには、クラスターが Microsoft Azure にインストールされている必要があります。
前提条件
- クラスターは Azure にインストールされている。
- Secrets Store CSI Driver Operator がインストールされている。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
- 必要なシークレットを保存するように Azure Key Vault を設定している。
-
Azure CLI (
az
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
Azure Key Vault プロバイダーをインストールします。
プロバイダーリソース用に次の設定を使用して YAML ファイルを作成します。
重要Secrets Store CSI ドライバーの Azure Key Vault プロバイダーは、アップストリームプロバイダーです。
この設定は、OpenShift Container Platform で適切に動作するように、アップストリームの Azure ドキュメント で提供されている設定から変更されています。この設定を変更すると、機能に影響が出る場合があります。
azure-provider.yaml
ファイルの例apiVersion: v1 kind: ServiceAccount metadata: name: csi-secrets-store-provider-azure namespace: openshift-cluster-csi-drivers --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: csi-secrets-store-provider-azure-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-azure-cluster-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: csi-secrets-store-provider-azure-cluster-role subjects: - kind: ServiceAccount name: csi-secrets-store-provider-azure namespace: openshift-cluster-csi-drivers --- apiVersion: apps/v1 kind: DaemonSet metadata: namespace: openshift-cluster-csi-drivers name: csi-secrets-store-provider-azure labels: app: csi-secrets-store-provider-azure spec: updateStrategy: type: RollingUpdate selector: matchLabels: app: csi-secrets-store-provider-azure template: metadata: labels: app: csi-secrets-store-provider-azure spec: serviceAccountName: csi-secrets-store-provider-azure hostNetwork: true containers: - name: provider-azure-installer image: mcr.microsoft.com/oss/azure/secrets-store/provider-azure:v1.4.1 imagePullPolicy: IfNotPresent args: - --endpoint=unix:///provider/azure.sock - --construct-pem-chain=true - --healthz-port=8989 - --healthz-path=/healthz - --healthz-timeout=5s livenessProbe: httpGet: path: /healthz port: 8989 failureThreshold: 3 initialDelaySeconds: 5 timeoutSeconds: 10 periodSeconds: 30 resources: requests: cpu: 50m memory: 100Mi limits: cpu: 50m memory: 100Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: 0 capabilities: drop: - ALL volumeMounts: - mountPath: "/provider" name: providervol affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet volumes: - name: providervol hostPath: path: "/var/run/secrets-store-csi-providers" tolerations: - operator: Exists nodeSelector: kubernetes.io/os: linux
次のコマンドを実行して、
csi-secrets-store-provider-azure
サービスアカウントへの特権アクセスを付与します。$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-azure -n openshift-cluster-csi-drivers
次のコマンドを実行して、プロバイダーリソースを作成します。
$ oc apply -f azure-provider.yaml
Key Vault にアクセスするためのサービスプリンシパルを作成します。
次のコマンドを実行して、サービスプリンシパルのクライアントシークレットを環境変数として設定します。
$ SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --name https://$KEYVAULT_NAME --query 'password' -otsv)"
次のコマンドを実行して、サービスプリンシパルのクライアント ID を環境変数として設定します。
$ SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name https://$KEYVAULT_NAME --query '[0].appId' -otsv)"
次のコマンドを実行して、サービスプリンシパルのクライアントシークレットと ID を使用して汎用シークレットを作成します。
$ oc create secret generic secrets-store-creds -n my-namespace --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
secrets-store.csi.k8s.io/used=true
ラベルを適用して、プロバイダーがこのnodePublishSecretRef
シークレットを検索できるようにします。$ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。
SecretProviderClass
オブジェクトを定義する YAML ファイルを作成します。secret-provider-class-azure.yaml
の例apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-azure-provider 1 namespace: my-namespace 2 spec: provider: azure 3 parameters: 4 usePodIdentity: "false" useVMManagedIdentity: "false" userAssignedIdentityID: "" keyvaultName: "kvname" objects: | array: - | objectName: secret1 objectType: secret tenantId: "tid"
次のコマンドを実行して
SecretProviderClass
オブジェクトを作成します。$ oc create -f secret-provider-class-azure.yaml
このシークレットプロバイダークラスを使用するデプロイメントを作成します。
Deployment
オブジェクトを定義する YAML ファイルを作成します。deployment.yaml
の例apiVersion: apps/v1 kind: Deployment metadata: name: my-azure-deployment 1 namespace: my-namespace 2 spec: replicas: 1 selector: matchLabels: app: my-storage template: metadata: labels: app: my-storage spec: 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-azure-provider" 3 nodePublishSecretRef: name: secrets-store-creds 4
次のコマンドを実行して、
Deployment
オブジェクトを作成します。$ oc create -f deployment.yaml
検証
Pod ボリュームマウント内の Azure Key Vault からシークレットにアクセスできることを確認します。
Pod マウント内のシークレットをリスト表示します。
$ oc exec busybox-<hash> -n my-namespace -- ls /mnt/secrets-store/
出力例
secret1
Pod マウントのシークレットを表示します。
$ oc exec busybox-<hash> -n my-namespace -- cat /mnt/secrets-store/secret1
出力例
my-secret-value
2.7.4. マウントされたコンテンツを Kubernetes シークレットとして同期できるようにする
同期を有効にして、マウントされたボリューム上のコンテンツから Kubernetes シークレットを作成できます。同期を有効にする例としては、デプロイメント内で環境変数を使用して Kubernetes シークレットを参照することが挙げられます。
シークレットを OpenShift Container Platform クラスターおよび etcd に保存しない場合は、同期を有効にしないでください。この機能は、環境変数を使用してシークレットを参照する場合など、必要な場合にのみ有効にしてください。
同期を有効にすると、シークレットをマウントする Pod を開始した後、マウントされたボリュームのシークレットが Kubernetes シークレットとして同期されます。
コンテンツをマウントしたすべての Pod が削除されると、同期された Kubernetes シークレットも削除されます。
前提条件
- Secrets Store CSI Driver Operator がインストールされている。
- シークレットストアプロバイダーがインストールされている。
- シークレットプロバイダークラスが作成されている。
-
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
次のコマンドを実行して、
SecretProviderClass
リソースを編集します。$ oc edit secretproviderclass my-azure-provider 1
- 1
my-azure-provider
をシークレットプロバイダークラスの名前に置き換えます。
同期された Kubernetes シークレットの設定を含む
secretsObjects
セクションを追加します。apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-azure-provider namespace: my-namespace spec: provider: azure secretObjects: 1 - secretName: tlssecret 2 type: kubernetes.io/tls 3 labels: environment: "test" data: - objectName: tlskey 4 key: tls.key 5 - objectName: tlscrt key: tls.crt parameters: usePodIdentity: "false" keyvaultName: "kvname" objects: | array: - | objectName: tlskey objectType: secret - | objectName: tlscrt objectType: secret tenantId: "tid"
- 変更を適用するためにファイルを保存します。
2.7.5. Pod ボリュームマウント内のシークレットのステータスの表示
Pod ボリュームマウント内のシークレットのバージョンなどの詳細情報を表示できます。
Secrets Store CSI Driver Operator は、Pod と同じ namespace に SecretProviderClassPodStatus
リソースを作成します。このリソースを確認すると、Pod ボリュームマウントのシークレットに関するバージョンなどの詳細情報を確認できます。
前提条件
- Secrets Store CSI Driver Operator がインストールされている。
- シークレットストアプロバイダーがインストールされている。
- シークレットプロバイダークラスが作成されている。
- Secrets Store CSI Driver Operator からボリュームをマウントする Pod をデプロイしている。
-
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
次のコマンドを実行して、Pod ボリュームマウントのシークレットに関する詳細情報を表示します。
$ oc get secretproviderclasspodstatus <secret_provider_class_pod_status_name> -o yaml 1
- 1
- シークレットプロバイダークラスの Pod ステータスオブジェクトの名前は、
<pod_name>-<namespace>-<secret_provider_class_name>
の形式になります。
出力例
... status: mounted: true objects: - id: secret/tlscrt version: f352293b97da4fa18d96a9528534cb33 - id: secret/tlskey version: 02534bc3d5df481cb138f8b2a13951ef podName: busybox-<hash> secretProviderClassName: my-azure-provider targetPath: /var/lib/kubelet/pods/f0d49c1e-c87a-4beb-888f-37798456a3e7/volumes/kubernetes.io~csi/secrets-store-inline/mount
2.7.6. Secrets Store CSI Driver Operator のアンインストール
前提条件
- OpenShift Container Platform Web コンソールにアクセスできる。
- 管理者としてクラスターにアクセスできる。
手順
Secrets Store CSI Driver Operator をアンインストールするには、以下を実行します。
-
Secrets-store.csi.k8s.io
プロバイダーを使用するすべてのアプリケーション Pod を停止します。 - 選択したシークレットストアのサードパーティープロバイダープラグインをすべて削除します。
Container Storage Interface (CSI) ドライバーと関連するマニフェストを削除します。
-
Administration
CustomResourceDefinitions ClusterCSIDriver をクリックします。 - Instances タブの左端にある secrets-store.csi.k8s.io でドロップダウンメニューをクリックし、Delete ClusterCSIDriver をクリックします。
- プロンプトが表示されたら、Delete をクリックします。
-
Administration
- CSI ドライバー Pod が稼働していないことを確認します。
Secrets Store CSI Driver Operator をアンインストールします。
注記Operator をアンインストールする前に、まず CSI ドライバーを削除する必要があります。
-
Operators
Installed Operators をクリックします。 - Installed Operators ページで、スクロールするか、Search by name ボックスに "Secrets Store CSI" と入力して Operator を見つけ、クリックします。
-
Installed Operators > Operator details ページの右上に表示される Actions
Uninstall Operator をクリックします。 Uninstall Operator ウィンドウでプロンプトが表示されたら、Uninstall ボタンをクリックして namespace から Operator を削除します。Operator によってクラスターにデプロイされたアプリケーションは手動でクリーンアップする必要があります。
アンインストールすると、Secrets Store CSI Driver Operator は Web コンソールの Installed Operators セクションにリストされなくなります。
-
Operators