すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:csi-secrets-store-provider-alibabacloud を使用して KMS からシークレットをインポートする

最終更新日:Jul 12, 2025

csi-secrets-store-provider-alibabacloud を使用すると、Key Management Service (KMS) から Container Service for Kubernetes (ACK) クラスタの Kubernetes Secrets にシークレットをインポートまたは同期して、アプリケーションがクラスタ内の機密データに安全にアクセスできるようにすることができます。さらに、このプラグインを使用すると、CSI インラインボリュームを使用してシークレットをアプリケーションに直接マウントできます。これは、ファイルの読み取り API など、ファイルシステム API を呼び出すことによって機密データを取得するアプリケーションに適しています。このコンポーネントを使用すると、シークレットを自動的に更新して、Kubernetes Secrets でシークレットが公開されるリスクを軽減できます。また、アプリケーションと KMS の Secrets Manager との間の互換性の問題を解決するのにも役立ちます。

セキュリティに関する注意事項

デフォルトでは、ボリュームからのシークレットの読み取りには、KMS の Secrets Manager との互換性の問題が伴います。csi-secrets-store-provider-alibabacloud プラグインは、この互換性の問題を解決できます。さらに、環境変数をマウントするときに、クラスタ内に Kubernetes ネイティブの Secret としてシークレットを作成できます。プラグインを使用する前に、以下のセキュリティリスクを評価してください。

  • クラスタ内のシークレットにファイルシステムを介してアクセスできる場合、攻撃者はアプリケーションの Common Vulnerabilities and Exposures (CVE) の脆弱性を悪用して、クラスタ内のディレクトリを走査する可能性があります。その結果、シークレットが漏洩する可能性があります。

  • デバッグブレークポイントの構成が不適切である場合、またはログアクセス権限が広すぎる場合は、クラスタ内のシークレットが公開される可能性があります。潜在的なセキュリティリスクを回避するために、環境変数を介してシークレットを参照しないことをお勧めします。

  • シークレットの同期を有効にする場合は、最小権限の原則に厳密に従ってアクセス権限を制限してください。

アプリケーションのシークレットを永続化する必要がない場合は、RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを承認するを参照して、ポッドに最小限のアクセス権限を付与することをお勧めします。次に、GetSecretValue 操作を直接呼び出すことによって、アプリケーションでシークレットを取得します。これにより、ポッドファイルシステムまたは Kubernetes Secrets でシークレットが公開される可能性が低くなります。

前提条件

ステップ 1: コンポーネント認証情報を構成する

csi-secrets-store-provider-alibabacloud の認証情報を構成して、プラグインが KMS からシークレットを取得するための権限を持っていることを確認する必要があります。そうでない場合、csi-secrets-store-provider-alibabacloud はクラスタにシークレットをインポートまたは同期できません。クラスタタイプに基づいて、以下のいずれかの認証方法を選択できます。

RRSA を使用して権限を付与する

この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスターとACK Serverless クラスターに適用されます。RRSA 機能を使用して、ポッドレベルの権限制御を実装できます。また、この方法では AccessKey ペアが不要なため、RRSA はシークレットの漏洩を防ぐこともできます。

  1. ACK コンソールで ACK クラスタの RRSA 機能を有効にします。これにより、クラスタの ID プロバイダー (IdP) を作成できます。詳細については、RRSA を有効にするをご参照ください。

  2. 信頼できる ID プロバイダー (IdP) の RAM ロールを作成して、csi-secrets-store-provider-alibabacloud で RAM ロールを使用できるようにします。次の表にパラメーターを示します。詳細については、OIDC IdP の RAM ロールを作成するをご参照ください。

    パラメーター

    説明

    [ID プロバイダータイプ]

    [OIDC] を選択します。

    [ID プロバイダー]

    ack-rrsa-<cluster_id> を選択します。<cluster_id> は、クラスタの ID に置き換えます。

    [条件]

    • oidc:iss: デフォルト値を使用します。

    • oidc:aud: デフォルト値を使用します。

    • oidc:sub: この条件を手動で追加する必要があります。

      • キー: [oidc:sub] を選択します。

      • 演算子: [StringEquals] を選択します。

      • 値: system:serviceaccount:<namespace>:<serviceAccountName> と入力します。<namespace> は、アプリケーションの名前空間に置き換えます。<serviceAccountName> は、アプリケーションで使用されるサービスアカウントに置き換えます。この例では、system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud と入力します。

        説明

        コンポーネントは、デフォルトの kube-system 名前空間にインストールすることをお勧めします。csi-secrets-store-provider-alibabacloud を他の名前空間にインストールする場合は、kube-system を名前空間の名前に置き換えます。

  3. カスタムポリシーを作成し、前のステップで作成した RAM ロールに権限を付与します。

    1. csi-secrets-store-provider-alibabacloud を使用して KMS からシークレットをインポートするときに必要なポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。

      {
          "Action": [
             "kms:GetSecretValue",
             "kms:Decrypt"
          ],
          "Resource": [
              "*"
          ],
          "Effect": "Allow"
      }
    2. 前のステップで作成した RAM ロールに権限を付与します。詳細については、RAM ロールに権限を付与するをご参照ください。

  4. 次の構成テンプレートに基づいて、クラスタに alibaba-credentials という名前の Secret を作成し、指定されたフィールドを置き換えます。

    1. 次の内容に基づいて secretstore-rrsa.yaml という名前のファイルを作成し、指定されたフィールドを置き換えます。

      • {rolearn}: 値をステップ 2で作成した RAM ロールの ARN に置き換えます。ARN は Base64 エンコードされた文字列である必要があります。

      • {oidcproviderarn}: 値を、クラスタで RRSA が有効になった後に生成されたプロバイダー ARN に置き換えます。ARN は Base64 エンコードされた文字列である必要があります。

      apiVersion: v1
      data:
        rolearn: {rolearn}
        oidcproviderarn: {oidcproviderarn}
      kind: Secret
      metadata:
        name: alibaba-credentials
        namespace: kube-system
      type: Opaque
      	                     
    2. 次のコマンドを実行して、Secret をデプロイします。

      kubectl apply -f secretstore-rrsa.yaml

クラスタのワーカー RAM ロールに権限を付与する

この方法は、ACK マネージドクラスターACK 専用クラスター、および登録済みクラスターに適用されます。

  1. 次のコードブロックに基づいてカスタム RAM ポリシーを作成します。詳細については、カスタムポリシーを作成するをご参照ください。

    {
      "Action": [
        "kms:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
    
  2. 前のステップで作成したカスタムポリシーをワーカー RAM ロールにアタッチします。詳細については、ワーカー RAM ロールに権限を付与するをご参照ください。

特定の RAM ロールを引き受けるために使用される AccessKey ペアを指定する

この方法は、すべてのタイプの ACK クラスタに適しています。

  1. 信頼できる Alibaba Cloud アカウントの RAM ロールを作成して、csi-secrets-store-provider-alibabacloud で RAM ロールを使用できるようにします。詳細については、信頼できる Alibaba Cloud アカウントの RAM ロールを作成するをご参照ください。

    説明

    プリンシパル名パラメーターには、[現在のアカウント] を選択します。

  2. カスタム RAM ポリシーを作成し、前のステップで作成した RAM ロールにポリシーをアタッチします。

    1. KMS シークレットにアクセスするために必要なポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。

      {
        "Action": [
          "kms:GetSecretValue",
          "kms:Decrypt"
        ],
        "Resource": [
          "*"
        ],
        "Effect": "Allow"
      }
      
    2. 前のステップで作成した RAM ロールに権限を付与します。詳細については、RAM ロールに権限を付与するをご参照ください。

  3. 前のステップで作成した RAM ロールのカスタムポリシーを作成し、指定された RAM ユーザーに権限を付与します。

    1. 前に作成した RAM ロールのカスタムポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Resource": "acs:ram:*:<account-id>:role/<role-name>" 
              }
          ],
          "Version": "1"
      }

      上記のコードブロックの Resource フィールドは、RAM ロールの ARN を指定します。<account-id> は、作成した RAM ロールが属する Alibaba Cloud アカウントに置き換え、<role-name> は、作成した RAM ロールに置き換えます。RAM ロールの ARN の取得方法の詳細については、RAM ロールの ARN を表示するにはどうすればよいですか? をご参照ください。

    2. 使用する RAM ユーザーにポリシーをアタッチします。これにより、RAM ユーザーは RAM ロールを引き受けることができます。RAM ユーザーに権限を付与する方法の詳細については、RAM ユーザーに権限を付与するをご参照ください。

  4. 次の構成テンプレートに基づいて、クラスタに alibaba-credentials という名前の Secret を作成し、指定されたフィールドを置き換えます。

    1. 次の内容に基づいて alibaba-credentials.yaml という名前のファイルを作成し、指定されたフィールドを置き換えます。

      • {rolearn}: 値をステップ 1で作成した RAM ロールの ARN に置き換えます。ARN は Base64 エンコードされた文字列である必要があります。

      • {ak}: 値を RAM ユーザーの AccessKey ID に置き換えます。これは Base64 エンコードされた文字列である必要があります。

      • {sk}: 値を RAM ユーザーの AccessKey シークレットに置き換えます。これは Base64 エンコードされた文字列である必要があります。

        apiVersion: v1
        data:
          id: {ak}
          secret: {sk}
          rolearn: {rolearn}
        kind: Secret
        metadata:
          name: alibaba-credentials
          namespace: kube-system
        type: Opaque
        
        
    2. 次のコマンドを実行して、Secret をデプロイします。

      kubectl apply -f alibaba-credentials.yaml

ステップ 2: csi-secrets-store-provider-alibabacloud コンポーネントをインストールする

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、目的のクラスターを見つけて名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。

  3. [Helm] ページで、[デプロイ] をクリックします。「Chart」セクションに、[csi-secrets-store-provider-alibabacloud] と入力します。その他のパラメーターはデフォルト設定のままにして、[次へ] をクリックします。

    表示されるダイアログボックスで、コンポーネントがデフォルトの kube-system 名前空間にインストールされ、アプリケーションがコンポーネント名でリリースされることを確認します。カスタムアプリケーション名と名前空間を指定する場合は、プロンプトに従ってアプリケーション名と名前空間を構成します。

  4. [Chart のバージョン] パラメーターを最新バージョンに設定します。「Parameters」セクションで、ステップ 1で選択した認証方法に基づいてパラメーターを構成し、[OK] をクリックします。

    • RRSA を使用して権限を付与することを選択した場合は、rrsa.enable パラメーターを [true] に設定して RRSA を有効にする必要があります。image

      次のコードブロックは、その他のパラメーターを示しています。

      envVarsFromSecret:
      #  ACCESS_KEY_ID:
      #    secretKeyRef: alibaba-credentials
      #    key: id
      #  SECRET_ACCESS_KEY:
      #    secretKeyRef: alibaba-credentials
      #    key: secret
        ALICLOUD_ROLE_ARN:
          secretKeyRef: alibaba-credentials
          key: rolearn
      #  ALICLOUD_ROLE_SESSION_NAME:
      #    secretKeyRef: alibaba-credentials
      #    key: rolesessionname
      #  ALICLOUD_ROLE_SESSION_EXPIRATION:
      #    secretKeyRef: alibaba-credentials
      #   key: rolesessionexpiration
        ALICLOUD_OIDC_PROVIDER_ARN:
          secretKeyRef: alibaba-credentials
          key: oidcproviderarn
    • クラスタのワーカー RAM ロールに権限を付与することを選択した場合は、デフォルトのパラメーター設定を使用して csi-secrets-store-provider-alibabacloud を直接インストールできます。

    • 特定の RAM ロールを引き受ける AccessKey ペアを指定することを選択した場合は、以下のパラメーターを構成する必要があります。

      envVarsFromSecret:
        ACCESS_KEY_ID:
          secretKeyRef: alibaba-credentials
          key: id
        SECRET_ACCESS_KEY:
          secretKeyRef: alibaba-credentials
          key: secret
        ALICLOUD_ROLE_ARN:
          secretKeyRef: alibaba-credentials
          key: rolearn
      #  ALICLOUD_ROLE_SESSION_NAME:
      #    secretKeyRef: alibaba-credentials
      #    key: rolesessionname
      #  ALICLOUD_ROLE_SESSION_EXPIRATION:
      #    secretKeyRef: alibaba-credentials
      #    key: rolesessionexpiration
      #  ALICLOUD_OIDC_PROVIDER_ARN:
      #    secretKeyRef: alibaba-credentials
      #    key: oidcproviderarn
    • スケジュールされたシークレット同期機能を有効にするには、以下のパラメーターを構成する必要があります。image

      • secrets-store-csi-driver.enableSecretRotation: シークレットの自動回転機能を有効にするかどうかを指定します。値を [true] に設定すると、シークレットの自動回転機能が有効になります。

      • secrets-store-csi-driver.rotationPollInterval: シークレットを同期する頻度を指定します。この例では、このパラメーターは [120] 秒に設定されており、シークレットが 2 分ごとに同期されることを指定しています。必要に応じて値を調整できます。

    作成後、クラスタの csi-secrets-store-provider-alibabacloud ページにリダイレクトされ、インストール結果を確認できます。次の図のすべてのリソースが作成されている場合、コンポーネントはインストールされています。image.png

ステップ 3: データ同期情報を構成する

認証情報を構成した後、SecretProviderClass を使用して KMS シークレットを構成する必要があります。

構成テンプレートの説明

次のコードブロックは、SecretProviderClass テンプレートを示しています。

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <NAME>
spec:
  provider: alibabacloud   # 値を alibabacloud に設定します。
  parameters:

parameters セクションには、通常、Kubernetes Secrets をマウントするための以下のリクエストパラメーターが含まれています。

パラメーター

必須

説明

objects

はい

Kubernetes Secrets をマウントするための YAML 構成。例:

parameters:
    objects: |
        - objectName: "MySecret"

objects パラメーターには、以下のサブフィールドが含まれています。

  • objectName: 必須。このフィールドは、KMS の Secrets Manager 内のシークレットの名前を指定します。詳細については、SecretName をご参照ください。

  • objectType: オプション。このフィールドを使用して、同期する Alibaba Cloud サービスのタイプを指定できます。有効な値: kms および oos。デフォルト値: kms。KMS からシークレットをインポートする場合は、このフィールドを空のままにすることができます。

  • objectAlias: オプション。このフィールドを使用して、ポッドにマウントされるファイルの名前を指定できます。このフィールドを指定しない場合、デフォルトで objectName の値が使用されます。

  • objectVersion: オプション。このフィールドは、KMS の Secrets Manager の VersionId パラメーターに対応しています。VersionId パラメーターは、ApsaraDB RDS シークレット、PolarDB シークレット、ApsaraDB for Redis/Tair シークレット、RAM シークレット、および ECS シークレットではサポートされていません。

  • objectVersionLabel: オプション。このフィールドは、KMS の Secrets Manager の VersionStage パラメーターに対応しています。ステージラベルが ACSPrevious または ACSCurrent であるシークレット値のみを、RAM シークレット、ApsaraDB RDS シークレット、PolarDB シークレット、ApsaraDB for Redis シークレット、Tair シークレット、および Elastic Compute Service (ECS) シークレットに対してクエリできます。

  • jmesPath: オプション。このフィールドは、JSON 形式のシークレットで指定されたキーと値のペアを解析するために使用されます。たとえば、次のサンプルテストシークレットには JSON セグメントが含まれています。

    {
        "username": "testuser",
        "password": "testpassword"
    }

    usernamepassword を別々のシークレットファイルとしてマウントするには、JMESPath フィールドを構成します。JMESPath フィールドを使用する場合は、以下のサブフィールドを指定する必要があります。

    • path: 必須。このフィールドは、JMESPath に基づいてパス検索の指定された構成項目を定義します。

    • objectAlias: オプション。このフィールドは、シークレットをポッドにマウントするファイルの名前を指定します。

  • kmsEndpoint: オプション。このフィールドは、KMS サービスリクエストのエンドポイントアドレスを指定します。未構成の場合、デフォルトのエンドポイントが使用されます。KMS の共有ゲートウェイまたは専用ゲートウェイとして構成できます。構成は資格情報レベルで適用されます。つまり、各資格情報で個別のエンドポイントアドレスを指定できます。詳細については、kmsEndpoint の説明をご参照ください。

region

いいえ

指定されたリージョンの Secrets Manager サーバーにリクエストを送信します。このパラメーターを指定しない場合、現在のノードのリージョンが選択されます。アプリケーションが多数のポッドで実行されている場合、これによりパフォーマンスのオーバーヘッドが増加する可能性があります。したがって、このパラメーターを構成してリージョンを指定することをお勧めします。

pathTranslation

いいえ

  • Secrets Manager にマウントするシークレットのファイル名にパス区切り文字が含まれている場合に使用する置換パス区切り文字。たとえば、My/Path/Secret は My_Path_Secret としてマウントされます。

  • このパラメーターを指定しない場合、置換のパス区切り文字はアンダースコア (_) になります。

  • パス区切り文字の置換を無効にするには、パラメーターを "False" に設定します。

構成例

この例では、SecretProviderClass を使用して、同じリージョンの ACK マネージドクラスターのアプリケーションに KMS からシークレット test をインポートする方法を示します。

  1. secretstore.yaml という名前のファイルを作成し、ファイルに次の内容を追加して SecretProviderClass を定義します。

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: test
    spec:
      provider: alibabacloud   # 値を alibabacloud に設定します。
      parameters:
        objects: | # objectType パラメーターは oos または kms に設定できます。デフォルト値: kms。
          - objectName: "test-hangzhou"
            objectType: "kms"
            objectAlias: "hangzhou-public"
            kmsEndpoint:  "kms.{region}.aliyuncs.com"
  2. 次のコマンドを実行して、SecretProviderClass をデプロイします。

    kubectl apply -f secretstore.yaml
  3. deploy.yaml という名前のファイルを作成し、ファイルに次の内容を追加します。

    NGINX デプロイメントが含まれており、CSI インラインボリュームを使用して前の例で作成した SecretProviderClass を宣言しています。シークレットは、ポッドの /mnt/secrets-store ディレクトリにマウントされます。デプロイメントの詳細については、デプロイメントの例をご参照ください。

    apiVersion: apps/v1  # API バージョンが 1.8.0 より前の場合は、apps/v1beta1 を使用します。
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          volumes:
            - name: secrets-store-inline
              csi:
                driver: secrets-store.csi.k8s.io
                readOnly: true
                volumeAttributes:
                  secretProviderClass: "test-secrets"
          containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 # この値を実際のイメージに置き換えます。
              ports:
                - containerPort: 80
              resources:
                limits:
                  cpu: "500m"
              volumeMounts:
                - name: secrets-store-inline
                  mountPath: "/mnt/secrets-store"
                  readOnly: true
  4. 次のコマンドを実行して、デプロイメントをデプロイします。

    kubectl apply -f deploy.yaml
  5. シークレットがマウントされていることを確認します。

    ポッドにログインし、SecretProviderClass で指定されたシークレットがマウントターゲット /mnt/secrets-store に作成されているかどうかを確認し、シークレットに KMS に格納されている対応する暗号文が含まれているかどうかを確認します。

kmsEndpoint の説明

専用ゲートウェイまたは共有ゲートウェイを介して KMS シークレットを取得できます。ゲートウェイにアクセスする前に、次の表に基づいて KMS エンドポイントを構成します。専用ゲートウェイを介したアクセスと共有ゲートウェイを介したアクセスの違いの詳細については、KMS にアクセスするための共有ゲートウェイと専用ゲートウェイの違いをご参照ください。

KMS エンドポイント

ゲートウェイタイプ

ドメインタイプ

エンドポイント

説明

専用ゲートウェイ

KMS プライベートドメイン

{kms-instance-id}.cryptoservice.kms.aliyuncs.com

  • KMS シークレットインスタンスとクラスターが同じリージョンおよび同じ仮想プライベートクラウド (VPC) にある。

  • {kms-instance-id} は、KMS シークレットインスタンスの ID に置き換えます。

  • KMS シークレットインスタンスのバージョンが 3.0 以降であること。

共有ゲートウェイ

VPC ドメイン

kms-vpc.{region}.aliyuncs.com

  • KMS シークレットとクラスターが同じリージョンにある。

  • {region} は、KMS シークレットが配置されているリージョンに置き換えます。

  • このアドレスは、追加の設定なしでデフォルト構成で使用できます。

共有ゲートウェイ

パブリックドメイン

kms.{region}.aliyuncs.com

  • {region} は、KMS シークレットが配置されているリージョンに置き換えます。

  • クラスターはパブリックネットワークにアクセスできます。

KMS エンドポイントの構成例

{region}kmsEndpoint{kms-instance-id}{region}apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test
spec:
  provider: alibabacloud # 値を alibabacloud に設定します。
  parameters:
    # objects: KMS ゲートウェイの使用例
    # hangzhou-public: 共有ゲートウェイパブリックエンドポイントを使用します。<code data-tag="code" id="0c3242c29695n">{region}

関連情報