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

CloudOps Orchestration Service:csi-secrets-store-provider-alibabacloud を使用して OOS 暗号化パラメータをインポートする

最終更新日:Mar 28, 2025

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

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

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

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

  • デバッグのブレークポイントまたは不適切なログ権限により、クラスタ内のシークレットが公開される可能性があります。環境変数を使用してシークレットをマウントまたは使用しないことをお勧めします。この方法にはセキュリティリスクがあるためです。

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

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

前提条件

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

csi-secrets-store-provider-alibabacloud が OOS から暗号化パラメーターを取得するための権限を持つように、csi-secrets-store-provider-alibabacloud の認証情報を設定する必要があります。設定しない場合、csi-secrets-store-provider-alibabacloud は暗号化パラメーターをクラスターにインポートまたは同期できません。以下の方法を使用して、ack-secret-manager が OOS 暗号化パラメーターにアクセスすることを承認できます。

  • RRSA を使用して権限を付与する:この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスターに適用できます。

  • クラスターのワーカー RAM ロールに権限を付与する:この方法は、ACK マネージドクラスターACK 専用クラスター、および 登録済みクラスターに適用されます。

  • RAM ロールを偽装するために使用する AccessKey ペアを指定する:この方法は、すべてのタイプの ACK クラスタに適用されます。

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

RAM Roles for Service Accounts (RRSA) は、Kubernetes 1.22 以降を実行する ACK マネージドクラスターに適用できます。他の承認方法と比較して、RRSA はポッドの権限を分離し、AccessKey ID と AccessKey シークレットの使用によって引き起こされるシークレット漏洩のリスクを回避できます。

  1. ID プロバイダーを作成するために、[ACK コンソール] で RRSA 機能を有効にします。詳細については、「RRSA を有効にする」をご参照ください。

  2. [ID プロバイダー][プリンシパルタイプ] として RAM ロールを作成し、csi-secrets-store-provider-alibabacloud が RAM ロールを使用できるようにします。次の表は、主要なパラメータについて説明しています。詳細な手順については、「OIDC IdP の RAM ロールを作成する」をご参照ください。

    パラメータ

    説明

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

    OIDC を選択します。

    [ID プロバイダー]

    ack-rrsa-<cluster_id> 形式の名前の 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 ポリシーを作成し、そのポリシーを RAM ロールにアタッチします。

    1. csi-secrets-store-provider-alibabacloud を使用して OOS 暗号化パラメータをインポートする際に必要なポリシーを作成します。

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

      {
          "Action": [
             "oos:GetSecretParameter",
             "kms:GetSecretValue"
          ],
          "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. 次のカスタムポリシーを作成します。詳細については、「カスタムポリシーを作成する」をご参照ください。

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

特定の RAM ロールを偽装するために AccessKey ペアを指定する

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

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

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

    1. OOS 暗号化パラメータにアクセスするために必要なポリシーを作成します。

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

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

  3. 作成した RAM ロールを偽装するための権限を提供するカスタム RAM ポリシーを作成し、そのポリシーを使用する RAM ユーザーにアタッチします。

    1. 作成した RAM ロールを偽装するための権限を含むカスタム RAM ポリシーを作成します。

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

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                    "Resource": "acs:ram::***:role/****"  // このセクションのステップ 1 で作成した RAM ロールの Alibaba Cloud リソースネーム (ARN)。
              }
          ],
          "Version": "1"
      }
    2. ポリシーを使用する 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 のバージョン] パラメータを最新バージョンに設定します。[パラメータ] セクションで、ステップ 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 を使用して OOS 暗号化パラメータを構成する必要があります。

構成テンプレートの説明

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

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

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

パラメータ

タイプ

説明

objects

必須

暗号化パラメータをマウントするための YAML 構成。例:

parameters:
    objects: |
        - objectName: "MySecret"
        - objectType: "oos"

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

  • objectName:必須。OOS パラメータストアの暗号化パラメータの名前。詳細については、SecretName をご参照ください。

  • objectType:オプション。このパラメータを使用して、同期する Alibaba Cloud サービスのタイプを指定できます。kms と oos がサポートされています。デフォルト値は kms です。OOS 暗号化パラメータをインポートする場合は、このパラメータを oos に設定する必要があります。

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

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

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

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

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

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

region

オプション

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

pathTranslation

オプション

  • パラメータストアにマウントする暗号化パラメータのファイル名にパス区切り文字が含まれている場合に使用する置換パス区切り文字。たとえば、My/Path/Secret は My_Path_Secret としてマウントされます。

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

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

構成例

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

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

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

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

    NGINX デプロイメントが含まれており、前の例で作成した SecretProviderClass を CSI インラインボリュームを使用して宣言しています。暗号化パラメータは、ポッドの /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 に作成されているかどうかを確認し、暗号化パラメータに OOS に格納されている対応する暗号文が含まれているかどうかを確認します。

関連情報