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 Parameter Store
  • Azure Key Vault
  • Google Secret Manager
  • HashiCorp 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 ドライバーをインストールするには、以下を実行します。

  1. Secrets Store CSI Driver Operator をインストールします。

    1. Web コンソールにログインします。
    2. Operators OperatorHub をクリックします。
    3. フィルターボックスに "Secrets Store CSI" と入力し、Secrets Store CSI Driver Operator を見つけます。
    4. Secrets Store CSI Driver Operator ボタンをクリックします。
    5. Secrets Store CSI Driver Operator ページで、Install をクリックします。
    6. Install Operator のページで、以下のことを確認してください。

      • All namespaces on the cluster (default) が選択されている。
      • Installed Namespaceopenshift-cluster-csi-drivers に設定されている。
    7. Install をクリックします。

      インストールが終了すると、Web コンソールの Installed Operators セクションに GCP Filestore CSI Driver Operator がリストされます。

  2. ドライバーの ClusterCSIDriver インスタンス (secrets-store.csi.k8s.io) を作成します。

    1. Administration CustomResourceDefinitions ClusterCSIDriver をクリックします。
    2. Instances タブで Create ClusterCSIDriver をクリックします。

      以下の YAML ファイルを使用します。

      apiVersion: operator.openshift.io/v1
      kind: ClusterCSIDriver
      metadata:
          name: secrets-store.csi.k8s.io
      spec:
        managementState: Managed
    3. Create をクリックします。

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 の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。AWS Secrets Manager からシークレットをマウントするには、クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用している必要があります。

前提条件

  • クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用している。
  • Secrets Store CSI Driver Operator をインストールした。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
  • 必要なシークレットを保存するように AWS Secrets Manager を設定した。
  • ccoctl バイナリーを展開して準備した。
  • jq CLI ツールをインストールした。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. AWS Secrets Manager プロバイダーをインストールします。

    1. プロバイダーリソース用に次の設定を使用して 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

    2. 次のコマンドを実行して、csi-secrets-store-provider-aws サービスアカウントへの特権アクセスを付与します。

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
    3. 次のコマンドを実行して、プロバイダーリソースを作成します。

      $ oc apply -f aws-provider.yaml
  2. サービスアカウントに AWS シークレットオブジェクトの読み取りを許可するアクセス許可を付与します。

    1. 次のコマンドを実行して、認証情報リクエストを含むディレクトリーを作成します。

      $ mkdir credentialsrequest-dir-aws
    2. 認証情報リクエスト用に次の設定を使用して 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

    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. 次のコマンドを実行して、ロール ARN を持つサービスアカウントをバインドします。

      $ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
  3. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. 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"

      1 1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーを aws として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-aws.yaml
  4. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. 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

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      シークレットプロバイダークラスの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  • Pod ボリュームマウントの AWS Secrets Manager からシークレットにアクセスできることを確認します。

    1. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

      出力例

      testSecret

    2. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret

      出力例

      <secret_value>

2.7.3.2. AWS Systems Manager Parameter Store からのシークレットのマウント

Secrets Store CSI Driver Operator を使用して、AWS Systems Manager Parameter Store から OpenShift Container Platform の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。AWS Systems Manager Parameter Store からシークレットをマウントするには、クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用している必要があります。

前提条件

  • クラスターが AWS にインストールされ、AWS Security Token Service (STS) を使用している。
  • Secrets Store CSI Driver Operator をインストールした。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
  • 必要なシークレットを保存するように AWS Systems Manager Parameter Store を設定した。
  • ccoctl バイナリーを展開して準備した。
  • jq CLI ツールをインストールした。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. AWS Systems Manager Parameter Store プロバイダーをインストールします。

    1. プロバイダーリソース用に次の設定を使用して 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

    2. 次のコマンドを実行して、csi-secrets-store-provider-aws サービスアカウントへの特権アクセスを付与します。

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
    3. 次のコマンドを実行して、プロバイダーリソースを作成します。

      $ oc apply -f aws-provider.yaml
  2. サービスアカウントに AWS シークレットオブジェクトの読み取りを許可するアクセス許可を付与します。

    1. 次のコマンドを実行して、認証情報リクエストを含むディレクトリーを作成します。

      $ mkdir credentialsrequest-dir-aws
    2. 認証情報リクエスト用に次の設定を使用して 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

    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. 次のコマンドを実行して、ロール ARN を持つサービスアカウントをバインドします。

      $ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
  3. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. 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"

      1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーを aws として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-aws.yaml
  4. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. 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

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      シークレットプロバイダークラスの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  • Pod ボリュームマウント内の AWS Systems Manager Parameter Store からのシークレットにアクセスできることを確認します。

    1. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

      出力例

      testParameter

    2. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

      $ oc exec my-aws-deployment-<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 の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。Azure Key Vault からシークレットをマウントするには、クラスターが Microsoft Azure にインストールされている必要があります。

前提条件

  • クラスターが Azure にインストールされている。
  • Secrets Store CSI Driver Operator をインストールした。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
  • 必要なシークレットを保存するように Azure Key Vault を設定した。
  • Azure CLI (az) をインストールした。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. Azure Key Vault プロバイダーをインストールします。

    1. プロバイダーリソース用に次の設定を使用して 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

    2. 次のコマンドを実行して、csi-secrets-store-provider-azure サービスアカウントへの特権アクセスを付与します。

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-azure -n openshift-cluster-csi-drivers
    3. 次のコマンドを実行して、プロバイダーリソースを作成します。

      $ oc apply -f azure-provider.yaml
  2. Key Vault にアクセスするためのサービスプリンシパルを作成します。

    1. 次のコマンドを実行して、サービスプリンシパルのクライアントシークレットを環境変数として設定します。

      $ SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --name https://$KEYVAULT_NAME --query 'password' -otsv)"
    2. 次のコマンドを実行して、サービスプリンシパルのクライアント ID を環境変数として設定します。

      $ SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name https://$KEYVAULT_NAME --query '[0].appId' -otsv)"
    3. 次のコマンドを実行して、サービスプリンシパルのクライアントシークレットと 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}
    4. secrets-store.csi.k8s.io/used=true ラベルを適用して、プロバイダーがこの nodePublishSecretRef シークレットを検索できるようにします。

      $ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
  3. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. 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"

      1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーを azure として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-azure.yaml
  4. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. 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

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      シークレットプロバイダークラスの名前を指定します。
      4
      Azure Key Vault にアクセスするためのサービスプリンシパル認証情報を含む Kubernetes シークレットの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  • Pod ボリュームマウント内の Azure Key Vault からシークレットにアクセスできることを確認します。

    1. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

      $ oc exec my-azure-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

      出力例

      secret1

    2. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

      $ oc exec my-azure-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/secret1

      出力例

      my-secret-value

2.7.3.4. Google Secret Manager からのシークレットのマウント

Secrets Store CSI Driver Operator を使用して、Google Secret Manager から OpenShift Container Platform の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。Google Secret Manager からシークレットをマウントするには、クラスターが Google Cloud Platform (GCP) にインストールされている必要があります。

前提条件

  • Secrets Store CSI Driver Operator をインストールした。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
  • 必要なシークレットを保存するように Google Secret Manager を設定した。
  • Google Cloud サービスアカウントから key.json という名前のサービスアカウントキーを作成した。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. Google Secret Manager プロバイダーをインストールします。

    1. プロバイダーリソース用に次の設定を使用して YAML ファイルを作成します。

      gcp-provider.yaml ファイルの例

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: csi-secrets-store-provider-gcp
        namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: csi-secrets-store-provider-gcp-rolebinding
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: csi-secrets-store-provider-gcp-role
      subjects:
        - kind: ServiceAccount
          name: csi-secrets-store-provider-gcp
          namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: csi-secrets-store-provider-gcp-role
      rules:
        - apiGroups:
            - ""
          resources:
            - serviceaccounts/token
          verbs:
            - create
        - apiGroups:
            - ""
          resources:
            - serviceaccounts
          verbs:
            - get
      ---
      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
        name: csi-secrets-store-provider-gcp
        namespace: openshift-cluster-csi-drivers
        labels:
          app: csi-secrets-store-provider-gcp
      spec:
        updateStrategy:
          type: RollingUpdate
        selector:
          matchLabels:
            app: csi-secrets-store-provider-gcp
        template:
          metadata:
            labels:
              app: csi-secrets-store-provider-gcp
          spec:
            serviceAccountName: csi-secrets-store-provider-gcp
            initContainers:
            - name: chown-provider-mount
              image: busybox
              command:
              - chown
              - "1000:1000"
              - /etc/kubernetes/secrets-store-csi-providers
              volumeMounts:
              - mountPath: "/etc/kubernetes/secrets-store-csi-providers"
                name: providervol
              securityContext:
                privileged: true
            hostNetwork: false
            hostPID: false
            hostIPC: false
            containers:
              - name: provider
                image: us-docker.pkg.dev/secretmanager-csi/secrets-store-csi-driver-provider-gcp/plugin@sha256:a493a78bbb4ebce5f5de15acdccc6f4d19486eae9aa4fa529bb60ac112dd6650
                securityContext:
                  privileged: true
                imagePullPolicy: IfNotPresent
                resources:
                  requests:
                    cpu: 50m
                    memory: 100Mi
                  limits:
                    cpu: 50m
                    memory: 100Mi
                env:
                  - name: TARGET_DIR
                    value: "/etc/kubernetes/secrets-store-csi-providers"
                volumeMounts:
                  - mountPath: "/etc/kubernetes/secrets-store-csi-providers"
                    name: providervol
                    mountPropagation: None
                    readOnly: false
                livenessProbe:
                  failureThreshold: 3
                  httpGet:
                    path: /live
                    port: 8095
                  initialDelaySeconds: 5
                  timeoutSeconds: 10
                  periodSeconds: 30
            volumes:
              - name: providervol
                hostPath:
                  path: /etc/kubernetes/secrets-store-csi-providers
            tolerations:
              - key: kubernetes.io/arch
                operator: Equal
                value: amd64
                effect: NoSchedule
            nodeSelector:
              kubernetes.io/os: linux

    2. 次のコマンドを実行して、csi-secrets-store-provider-gcp サービスアカウントに特権アクセスを付与します。

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-gcp -n openshift-cluster-csi-drivers
    3. 次のコマンドを実行して、プロバイダーリソースを作成します。

      $ oc apply -f gcp-provider.yaml
  2. Google Secret Manager シークレットの読み取り権限を付与します。

    1. 次のコマンドを実行して新しいプロジェクトを作成します。

      $ oc new-project my-namespace
    2. 次のコマンドを実行して、Pod セキュリティーアドミッション用の my-namespace namespace にラベルを付けます。

      $ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
    3. Pod のデプロイメント用のサービスアカウントを作成します。

      $ oc create serviceaccount my-service-account --namespace=my-namespace
    4. 次のコマンドを実行して、key.json ファイルから汎用シークレットを作成します。

      $ oc create secret generic secrets-store-creds -n my-namespace --from-file=key.json 1
      1
      この key.json ファイルは Google Secret Manager から作成したものです。
    5. secrets-store.csi.k8s.io/used=true ラベルを適用して、プロバイダーがこの nodePublishSecretRef シークレットを検索できるようにします。

      $ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
  3. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. SecretProviderClass オブジェクトを定義する YAML ファイルを作成します。

      secret-provider-class-gcp.yaml の例

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-gcp-provider                        1
        namespace: my-namespace                      2
      spec:
        provider: gcp                                3
        parameters:                                  4
          secrets: |
            - resourceName: "projects/my-project/secrets/testsecret1/versions/1"
              path: "testsecret1.txt"

      1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーを gcp として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-gcp.yaml
  4. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. Deployment オブジェクトを定義する YAML ファイルを作成します。

      deployment.yaml の例

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-gcp-deployment                              1
        namespace: my-namespace                              2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-storage
        template:
          metadata:
            labels:
              app: my-storage
          spec:
            serviceAccountName: my-service-account           3
            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-gcp-provider"   4
                  nodePublishSecretRef:
                    name: secrets-store-creds                5

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      作成したサービスアカウントを指定します。
      4
      シークレットプロバイダークラスの名前を指定します。
      5
      Google Secret Manager にアクセスするためのサービスプリンシパル認証情報を含む Kubernetes シークレットの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  • Pod ボリュームマウント内の Google Secret Manager からのシークレットにアクセスできることを確認します。

    1. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

      $ oc exec my-gcp-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

      出力例

      testsecret1

    2. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

      $ oc exec my-gcp-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testsecret1

      出力例

      <secret_value>

2.7.3.5. HashiCorp Vault からのシークレットのマウント

Secrets Store CSI Driver Operator を使用して、HashiCorp Vault から OpenShift Container Platform の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。

重要

Secrets Store CSI Driver Operator を使用して HashiCorp Vault からシークレットをマウントする機能は、次のクラウドプロバイダーでテストされています。

  • Amazon Web Services (AWS)
  • Microsoft Azure

他のクラウドプロバイダーも機能する可能性がありますが、まだテストされていません。今後、別のクラウドプロバイダーが追加でテストされる可能性があります。

前提条件

  • Secrets Store CSI Driver Operator をインストールした。手順は、Secrets Store CSI ドライバーのインストール を参照してください。
  • Helm をインストールした。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、HashiCorp Helm リポジトリーを追加します。

    $ helm repo add hashicorp https://helm.releases.hashicorp.com
  2. 次のコマンドを実行して、すべてのリポジトリーを更新し、Helm が最新バージョンを認識するようにします。

    $ helm repo update
  3. HashiCorp Vault プロバイダーをインストールします。

    1. 次のコマンドを実行して、Vault の新しいプロジェクトを作成します。

      $ oc new-project vault
    2. 次のコマンドを実行して、Pod セキュリティーアドミッション用の vault namespace にラベルを付けます。

      $ oc label ns vault security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
    3. 次のコマンドを実行して、Vault サービスアカウントに特権アクセスを許可します。

      $ oc adm policy add-scc-to-user privileged -z vault -n vault
    4. 次のコマンドを実行して、vault-csi-provider サービスアカウントに特権アクセスを許可します。

      $ oc adm policy add-scc-to-user privileged -z vault-csi-provider -n vault
    5. 以下のコマンドを実行して HashiCorp Vault をデプロイします。

      $ helm install vault hashicorp/vault --namespace=vault \
        --set "server.dev.enabled=true" \
        --set "injector.enabled=false" \
        --set "csi.enabled=true" \
        --set "global.openshift=true" \
        --set "injector.agentImage.repository=docker.io/hashicorp/vault" \
        --set "server.image.repository=docker.io/hashicorp/vault" \
        --set "csi.image.repository=docker.io/hashicorp/vault-csi-provider" \
        --set "csi.agent.image.repository=docker.io/hashicorp/vault" \
        --set "csi.daemonSet.providersDir=/var/run/secrets-store-csi-providers"
    6. 次のコマンドを実行して、vault-csi-driver デーモンセットにパッチを適用し、securityContextprivileged に設定します。

      $ oc patch daemonset -n vault vault-csi-provider --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true} }]'
    7. 次のコマンドを実行して、vault-csi-provider Pod が正常に起動したことを確認します。

      $ oc get pods -n vault

      出力例

      NAME                       READY   STATUS    RESTARTS   AGE
      vault-0                    1/1     Running   0          24m
      vault-csi-provider-87rgw   1/2     Running   0          5s
      vault-csi-provider-bd6hp   1/2     Running   0          4s
      vault-csi-provider-smlv7   1/2     Running   0          5s

  4. 必要なシークレットを保存するように HashiCorp Vault を設定します。

    1. 次のコマンドを実行してシークレットを作成します。

      $ oc exec vault-0 --namespace=vault -- vault kv put secret/example1 testSecret1=my-secret-value
    2. 次のコマンドを実行して、シークレットがパス secret/example1 で読み取り可能であることを確認します。

      $ oc exec vault-0 --namespace=vault -- vault kv get secret/example1

      出力例

      = Secret Path =
      secret/data/example1
      
      ======= Metadata =======
      Key                Value
      ---                -----
      created_time       2024-04-05T07:05:16.713911211Z
      custom_metadata    <nil>
      deletion_time      n/a
      destroyed          false
      version            1
      
      === Data ===
      Key            Value
      ---            -----
      testSecret1    my-secret-value

  5. Kubernetes 認証を使用するように Vault を設定します。

    1. 次のコマンドを実行して、Kubernetes 認証方法を有効にします。

      $ oc exec vault-0 --namespace=vault -- vault auth enable kubernetes

      出力例

      Success! Enabled kubernetes auth method at: kubernetes/

    2. Kubernetes 認証メソッドを設定します。

      1. 次のコマンドを実行して、トークンレビューアーを環境変数として設定します。

        $ TOKEN_REVIEWER_JWT="$(oc exec vault-0 --namespace=vault -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
      2. 次のコマンドを実行して、Kubernetes サービスの IP アドレスを環境変数として設定します。

        $ KUBERNETES_SERVICE_IP="$(oc get svc kubernetes -o go-template="{{ .spec.clusterIP }}")"
      3. 次のコマンドを実行して、Kubernetes auth メソッドを更新します。

        $ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/config \
          issuer="https://kubernetes.default.svc.cluster.local" \
          token_reviewer_jwt="${TOKEN_REVIEWER_JWT}" \
          kubernetes_host="https://${KUBERNETES_SERVICE_IP}:443" \
          kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

        出力例

        Success! Data written to: auth/kubernetes/config

    3. 次のコマンドを実行して、アプリケーションのポリシーを作成します。

      $ oc exec -i vault-0 --namespace=vault -- vault policy write csi -<<EOF
        path "secret/data/*" {
        capabilities = ["read"]
        }
        EOF

      出力例

      Success! Uploaded policy: csi

    4. 次のコマンドを実行して、アプリケーションにアクセスするための認証ロールを作成します。

      $ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/role/csi \
        bound_service_account_names=default \
        bound_service_account_namespaces=default,test-ns,negative-test-ns,my-namespace \
        policies=csi \
        ttl=20m

      出力例

      Success! Data written to: auth/kubernetes/role/csi

    5. 次のコマンドを実行して、すべての Vault Pod が正常に実行されていることを確認します。

      $ oc get pods -n vault

      出力例

      NAME                       READY   STATUS    RESTARTS   AGE
      vault-0                    1/1     Running   0          43m
      vault-csi-provider-87rgw   2/2     Running   0          19m
      vault-csi-provider-bd6hp   2/2     Running   0          19m
      vault-csi-provider-smlv7   2/2     Running   0          19m

    6. 次のコマンドを実行して、すべての secrets-store-csi-driver Pod が正常に実行されていることを確認します。

      $ oc get pods -n openshift-cluster-csi-drivers | grep -E "secrets"

      出力例

      secrets-store-csi-driver-node-46d2g                  3/3     Running   0             45m
      secrets-store-csi-driver-node-d2jjn                  3/3     Running   0             45m
      secrets-store-csi-driver-node-drmt4                  3/3     Running   0             45m
      secrets-store-csi-driver-node-j2wlt                  3/3     Running   0             45m
      secrets-store-csi-driver-node-v9xv4                  3/3     Running   0             45m
      secrets-store-csi-driver-node-vlz28                  3/3     Running   0             45m
      secrets-store-csi-driver-operator-84bd699478-fpxrw   1/1     Running   0             47m

  6. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. SecretProviderClass オブジェクトを定義する YAML ファイルを作成します。

      secret-provider-class-vault.yaml の例

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-vault-provider                   1
        namespace: my-namespace                   2
      spec:
        provider: vault                           3
        parameters:                               4
          roleName: "csi"
          vaultAddress: "http://vault.vault:8200"
          objects:  |
            - secretPath: "secret/data/example1"
              objectName: "testSecret1"
              secretKey: "testSecret1

      1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーは vault として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-vault.yaml
  7. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. Deployment オブジェクトを定義する YAML ファイルを作成します。

      deployment.yaml の例

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: busybox-deployment                                    1
        namespace: my-namespace                                     2
        labels:
          app: busybox
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: busybox
        template:
          metadata:
            labels:
              app: busybox
          spec:
            terminationGracePeriodSeconds: 0
            containers:
            - image: registry.k8s.io/e2e-test-images/busybox:1.29-4
              name: busybox
              imagePullPolicy: IfNotPresent
              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-vault-provider"        3

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      シークレットプロバイダークラスの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  • Pod ボリュームマウント内の HashiCorp Vault からシークレットにアクセスできることを確認します。

    1. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

      $ oc exec busybox-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

      出力例

      testSecret1

    2. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

      $ oc exec busybox-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret1

      出力例

      my-secret-value

2.7.4. マウントされたコンテンツを Kubernetes シークレットとして同期できるようにする

同期を有効にして、マウントされたボリューム上のコンテンツから Kubernetes シークレットを作成できます。同期を有効にする例としては、デプロイメント内で環境変数を使用して Kubernetes シークレットを参照することが挙げられます。

警告

シークレットを OpenShift Container Platform クラスターおよび etcd に保存しない場合は、同期を有効にしないでください。この機能は、環境変数を使用してシークレットを参照する場合など、必要な場合にのみ有効にしてください。

同期を有効にすると、シークレットをマウントする Pod を開始した後、マウントされたボリュームのシークレットが Kubernetes シークレットとして同期されます。

コンテンツをマウントしたすべての Pod が削除されると、同期された Kubernetes シークレットも削除されます。

前提条件

  • Secrets Store CSI Driver Operator がインストールされている。
  • シークレットストアプロバイダーがインストールされている。
  • シークレットプロバイダークラスが作成されている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、SecretProviderClass リソースを編集します。

    $ oc edit secretproviderclass my-azure-provider 1
    1
    my-azure-provider をシークレットプロバイダークラスの名前に置き換えます。
  2. 同期された 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"
    1
    同期された Kubernetes シークレットの設定を指定します。
    2
    作成する Kubernetes Secret オブジェクトの名前を指定します。
    3
    作成する Kubernetes Secret オブジェクトのタイプを指定します。たとえば、Opaque または kubernetes.io/tls です。
    4
    同期するマウントされたコンテンツのオブジェクト名またはエイリアスを指定します。
    5
    Kubernetes シークレットに設定するデータフィールドを、指定した objectName から指定します。
  3. 変更を適用するためにファイルを保存します。

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 をアンインストールするには、以下を実行します。

  1. Secrets-store.csi.k8s.io プロバイダーを使用するすべてのアプリケーション Pod を停止します。
  2. 選択したシークレットストアのサードパーティープロバイダープラグインをすべて削除します。
  3. Container Storage Interface (CSI) ドライバーと関連するマニフェストを削除します。

    1. Administration CustomResourceDefinitions ClusterCSIDriver をクリックします。
    2. Instances タブの左端にある secrets-store.csi.k8s.io でドロップダウンメニューをクリックし、Delete ClusterCSIDriver をクリックします。
    3. プロンプトが表示されたら、Delete をクリックします。
  4. CSI ドライバー Pod が稼働していないことを確認します。
  5. Secrets Store CSI Driver Operator をアンインストールします。

    注記

    Operator をアンインストールする前に、まず CSI ドライバーを削除する必要があります。

    1. Operators Installed Operators をクリックします。
    2. Installed Operators ページで、スクロールするか、Search by name ボックスに "Secrets Store CSI" と入力して Operator を見つけ、クリックします。
    3. Installed Operators > Operator details ページの右上に表示される Actions Uninstall Operator をクリックします。
    4. Uninstall Operator ウィンドウでプロンプトが表示されたら、Uninstall ボタンをクリックして namespace から Operator を削除します。Operator によってクラスターにデプロイされたアプリケーションは手動でクリーンアップする必要があります。

      アンインストールすると、Secrets Store CSI Driver Operator は Web コンソールの Installed Operators セクションにリストされなくなります。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.