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

Container Service for Kubernetes:csi-secrets-store-provider-alibabacloud を使用した Alibaba Cloud OOS 暗号化パラメーターのインポート

最終更新日:Mar 26, 2026
image

csi-secrets-store-provider-alibabacloud プラグインを使用すると、CloudOps Orchestration Service (OOS) から暗号化パラメーターを直接 Container Service for Kubernetes (ACK) クラスターに取り込むことができます。CSI インラインボリューム経由でファイルとしてマウントする方法と、Kubernetes Secrets に同期する方法のいずれかを選択できます。また、このプラグインはシークレットの自動ローテーションもサポートしており、手動での介入なしに Pod を最新の状態に保つことができます。

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

作業を開始する前に、以下のセキュリティリスクを評価してください。

  • ファイルシステムへの公開:シークレットがファイルシステム経由でアクセス可能な場合、攻撃者がアプリケーションの Common Vulnerabilities and Exposures (CVE) 脆弱性を悪用してクラスターディレクトリを走査し、シークレットを外部に持ち出す可能性があります。

  • 環境変数のリスク:デバッグ時のブレークポイントやログ権限の誤設定により、環境変数として保存されたシークレットが漏洩する可能性があります。シークレットを環境変数としてマウントすることは避けてください。

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

アプリケーションがシークレットの永続化を必要としない場合は、RRSA 権限付与 を使用して Pod に最小限のアクセス権限を付与し、アプリケーションを構成して GetSecretParameter API を直接呼び出してください。この方法により、暗号化パラメーターが Pod のファイルシステムや Kubernetes Secrets に公開されることを回避できます。

前提条件

作業を開始する前に、以下の要件を満たしていることを確認してください。

  • 以下の要件を満たす ACK クラスター:

    • Kubernetes バージョン 1.20 以降

    • クラスタータイプ:ACK マネージドクラスター、ACK 専用クラスター、または登録済みクラスター(ACK Serverless はサポートされていません)

    • クラスターと OOS 暗号化パラメーターが同一リージョン内にあること

  • OOS 暗号化パラメーター。詳細については、「暗号化パラメーターの作成」および「CreateSecretParameter」をご参照ください。

  • クラスターに接続された kubectl クライアント

ステップ 1:認証の構成

プラグインが OOS から暗号化パラメーターを読み取るには権限が必要です。クラスタータイプと Kubernetes バージョンに合った認証方式を選択してください。

方式サポートされるクラスタータイプKubernetes バージョン
RRSA(推奨)ACK マネージドクラスター1.22 以降
ワーカー RAM ロールACK マネージドクラスター、ACK 専用クラスター、登録済みクラスターすべて
AccessKey ペアすべてのクラスタータイプすべて

RRSA は利用可能な場合は推奨されます。Pod レベルで権限を分離でき、AccessKey 認証情報を埋め込むことによるセキュリティリスクを回避できます。

RRSA を使用した権限付与

RAM Roles for Service Accounts (RRSA) は、Kubernetes 1.22 以降を実行している ACK マネージドクラスターに適用されます。

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

  2. ID プロバイダープリンシパルタイプ として指定して RAM ロールを作成します。以下の主要なパラメーターを構成してください。手順の詳細については、「OIDC IdP 用の RAM ロールの作成」をご参照ください。

    コンポーネントはデフォルトの kube-system 名前空間にインストールします。csi-secrets-store-provider-alibabacloud を別の名前空間にインストールする場合は、kube-system をその名前空間に置き換えてください。
    パラメーター
    ID プロバイダータイプOIDC
    ID プロバイダーack-rrsa-<cluster_id> という名前のプロバイダーを選択します。ここで、<cluster_id> はご利用のクラスター ID です
    条件:oidc:issデフォルト値を維持します
    条件:oidc:audデフォルト値を維持します
    条件:oidc:subStringEquals 条件を追加し、値を system:serviceaccount:<namespace>:<serviceAccountName> に設定します。本トピックのテストアプリケーションでは、system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud
  3. カスタム RAM ポリシーを作成し、RAM ロールにアタッチします。

    1. 以下の内容でポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。 ``json { "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" } ``

    2. ポリシーを RAM ロールにアタッチします。「RAM ロールへの権限付与」をご参照ください。

  4. クラスター内に alibaba-credentials Secret を作成します。

    1. 以下の内容で secretstore-rrsa.yaml という名前のファイルを作成します。{rolearn} はステップ 2 で作成した RAM ロールの ARN を Base64 エンコードしたものに、{oidcproviderarn} は RRSA を有効化した際に生成されたプロバイダー ARN を Base64 エンコードしたものに置き換えてください。

      yaml apiVersion: v1 data: rolearn: {rolearn} oidcproviderarn: {oidcproviderarn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque 
    2. Secret をデプロイします: ``bash kubectl apply -f secretstore-rrsa.yaml ``

ワーカー RAM ロールへの権限付与

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

  1. 以下の内容でカスタムポリシーを作成します。「カスタムポリシーの作成」をご参照ください。

    {
      "Action": [
        "oos:GetSecretParameter",
        "kms:GetSecretValue"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  2. ポリシーをワーカー RAM ロールにアタッチします。「ワーカー RAM ロールへの権限付与」をご参照ください。

AccessKey ペアを指定して RAM ロールを偽装

この方式は、すべての ACK クラスタータイプで動作します。

  1. 信頼された Alibaba Cloud アカウント用の RAM ロールを作成します。「信頼された Alibaba Cloud アカウント用の RAM ロールの作成」をご参照ください。

  2. OOS アクセスを許可するカスタムポリシーを作成し、RAM ロールにアタッチします。

    1. 以下の内容でポリシーを作成します。「カスタムポリシーの作成」をご参照ください。 ``json { "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" } ``

    2. ポリシーを RAM ロールにアタッチします。「RAM ロールへの権限付与」をご参照ください。

  3. sts:AssumeRole 権限を付与するカスタム RAM ポリシーを作成し、RAM ユーザーにアタッチします。

    1. 以下の内容でポリシーを作成します。ARN はステップ 1 で作成した RAM ロールの Alibaba Cloud リソースネーム (ARN) に置き換えてください。「カスタムポリシーの作成」をご参照ください。

      json { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::*:role/**" } ], "Version": "1" } 
    2. ポリシーを RAM ユーザーにアタッチします。「RAM ユーザーへの権限付与」をご参照ください。

  4. クラスター内に alibaba-credentials Secret を作成します。

    1. 以下の内容で alibaba-credentials.yaml という名前のファイルを作成します。{rolearn} は RAM ロールの ARN を Base64 エンコードしたものに、{ak} は RAM ユーザーの AccessKey ID を Base64 エンコードしたものに、{sk} は RAM ユーザーの AccessKey Secret を Base64 エンコードしたものに置き換えてください。

      yaml apiVersion: v1 data: id: {ak} secret: {sk} rolearn: {rolearn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque 
    2. Secret をデプロイします: ``bash kubectl apply -f alibaba-credentials.yaml ``

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

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

  2. クラスター ページで、管理対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、アプリケーション > Helm を選択します。

  3. Helm ページで、デプロイ をクリックします。[Chart] セクションで、csi-secrets-store-provider-alibabacloud を検索し、他のパラメーターはデフォルト設定のままにします。次へ をクリックします。表示されるダイアログボックスで、コンポーネントがデフォルトの kube-system 名前空間にインストールされることを確認します。カスタム名前空間およびアプリケーション名を使用する場合は、指示に従って構成してください。

  4. Chart バージョン を最新バージョンに設定します。[Parameters] セクションで、認証方式に基づいてパラメーターを構成し、OK をクリックします。インストール後、csi-secrets-store-provider-alibabacloud ページにリダイレクトされます。次の図に示されているすべてのリソースが作成されていれば、コンポーネントは正常にインストールされています。

    • RRSArrsa.enabletrue に設定し、以下のパラメーターを構成します:image

      yaml 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 ロール:パラメーター設定はデフォルトのまま使用します。

    • AccessKey ペア:以下のパラメーターを構成します:

      yaml 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.enableSecretRotationtrue に設定すると、自動ローテーションが有効になります
      secrets-store-csi-driver.rotationPollInterval暗号化パラメーターの同期頻度を指定します。この例では、このパラメーターを 120 秒に設定しており、2 分ごとに暗号化パラメーターが同期されます。必要に応じて値を調整できます

    image.png

ステップ 3:データ同期の構成

SecretProviderClass リソースを使用して、クラスターに取り込む OOS 暗号化パラメーターと、それを Pod に公開する方法を定義します。

SecretProviderClass パラメーター

このプラグイン用のすべての SecretProviderClass リソースは、provider: alibabacloud を使用します。

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <NAME>
spec:
  provider: alibabacloud
  parameters:

parameters セクションでは、以下のフィールドがサポートされています。

パラメーター必須説明
objectsはいマウントする暗号化パラメーターをリストする YAML 構成。各エントリーは、以下に記載されているサブフィールドをサポートしています
regionいいえリクエストを送信する OOS リージョン。省略した場合、現在のノードのリージョンが使用されます。アプリケーションが多数の Pod で実行される場合は、パフォーマンスオーバーヘッドを回避するためにこのフィールドを明示的に指定してください
pathTranslationいいえパラメーター名内のパス区切り文字 (/) を置き換える文字。デフォルトはアンダースコア (_) です。たとえば、My/Path/SecretMy_Path_Secret になります。"False" に設定すると、置き換えが無効になります

`objects` サブフィールド:

サブフィールド必須説明
objectNameはいOOS パラメーターストア内の暗号化パラメーターの名前
objectTypeいいえ読み取り元の Alibaba Cloud サービス。サポートされる値:kms(デフォルト)および oos。OOS 暗号化パラメーターの場合は、oos に設定する必要があります
objectAliasいいえPod にパラメーターをマウントする際のファイル名。デフォルトは objectName
jmesPathいいえJSON 形式の暗号化パラメーターから特定のキーと値のペアを抽出します。使用する場合は、path(必須、JMESPath 式)および objectAlias(オプション、マウント時のファイル名)を指定します

例:JSON 暗号化パラメーターの解析

OOS 暗号化パラメーターに以下が含まれている場合:

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

jmesPath を使用して、username および password を個別のファイルとしてマウントします:

objects: |
  - objectName: "MySecret"
    objectType: "oos"
    jmesPath:
      - path: "username"
        objectAlias: "username"
      - path: "password"
        objectAlias: "password"

サンプルアプリケーションのデプロイ

この例では、同一リージョン内の ACK マネージドクラスターに OOS 暗号化パラメーター test をインポートします。

  1. 以下の内容で secretstore.yaml という名前のファイルを作成します:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: test-secrets
    spec:
      provider: alibabacloud
      parameters:
        objects: |           # objectType のデフォルトは kms。OOS パラメーターの場合は oos に設定
          - objectName: "test"
          - objectType: "oos"
  2. SecretProviderClass を適用します:

    kubectl apply -f secretstore.yaml
  3. 以下の内容で deploy.yaml という名前のファイルを作成します。Deployment は CSI インラインボリュームを使用して、暗号化パラメーターを Pod 内の /mnt/secrets-store にマウントします。その他の例については、「Deployment の例」をご参照ください。

    apiVersion: apps/v1
    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. シークレットがマウントされていることを確認します。Pod にログインし、SecretProviderClass で指定された暗号化パラメーターがマウントポイント /mnt/secrets-store に作成されているか確認し、さらに OOS に保存されている暗号文が含まれているか確認します。

次のステップ