csi-secrets-store-provider-alibabacloud コンポーネントを使用すると、KMS からクラスター内に Kubernetes Secret オブジェクトとしてサービス認証情報をインポートまたは同期できます。これにより、ワークロードが機密情報を安全にアクセスできるようになります。また、CSI インラインボリュームを使用して、サービス認証情報をワークロードのファイルシステムに直接マウントすることも可能です。この方法は、ファイルシステムから機密情報を読み取るアプリケーションに最適です。さらに、このコンポーネントではシークレットのローテーションが可能であり、Kubernetes Secret オブジェクト内の暗号文が漏洩するリスクを低減し、ワークロードと Secrets Manager 間の互換性の問題を解決します。
セキュリティに関する注意事項
ファイルシステムからシークレットを読み取るワークロードと Secrets Manager 間の直接的なやり取りは、互換性の問題を引き起こす可能性があります。csi-secrets-store-provider-alibabacloud コンポーネントはこれらの問題を解決し、シークレットをネイティブな Kubernetes Secret オブジェクトとして同期し、環境変数として使用できるようにします。作業を進める前に、以下のセキュリティリスクを評価してください。
前提条件
次の要件を満たす ACK クラスターを作成します。詳細については、「ACK マネージドクラスターの作成」および「ACK One 登録済みクラスターの作成」をご参照ください。
クラスターは Kubernetes 1.20 以降を実行している必要があります。サポートされているクラスタータイプには、ACK マネージドクラスター、ACK 専用クラスター、ACK Edge クラスター、および ACK One 登録済みクラスター が含まれます。ACK Serverless クラスター はサポートされていません。
kubectl クライアントがご利用のクラスターに接続されている必要があります。
ステップ 1:コンポーネント認証の構成
csi-secrets-store-provider-alibabacloud が KMS から認証情報の取得権限を持つように認証を構成する必要があります。構成しない場合、csi-secrets-store-provider-alibabacloud はクラスターへの認証情報のインポートや同期ができません。クラスタータイプに応じて、以下の 3 つの権限付与方式のいずれかを選択できます。
RRSA を使用した権限付与:この方式は、Kubernetes 1.22 以降を実行する ACK マネージドクラスター に適用されます。
クラスターのワーカー RAM ロールへの権限付与:この方式は、ACK マネージドクラスター、ACK 専用クラスター、および ACK One 登録済みクラスター に適用されます。
特定の RAM ロールを偽装するために AccessKey ID と Secret を指定する:この方式は、すべての ACK クラスターに適用されます。
RRSA を使用した権限付与
csi-secrets-store-provider-alibabacloud のための OIDC ID プロバイダー向け RAM ロールを作成します。次の表のとおりパラメーターを設定してください。詳細については、「OIDC プロバイダー向け RAM ロールの作成」をご参照ください。
パラメーター
説明
IdP タイプ
OIDC を選択します。
アイデンティティプロバイダー者
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をその名前空間の名前に置き換えてください。
カスタムポリシーを作成し、前述の手順で作成した RAM ロールに権限を付与します。
csi-secrets-store-provider-alibabacloud が KMS 認証情報をインポートするために必要な権限ポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。ポリシーの内容は次のとおりです。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前述の手順で作成した RAM ロールに権限を付与します。詳細については、「RAM ロールの権限管理」をご参照ください。
次のテンプレートを使用して、クラスター内に
alibaba-credentialsという名前の Kubernetes Secret を作成します。プレースホルダーの値を置き換える必要があります。次の内容で secretstore-rrsa.yaml という名前のファイルを作成します。プレースホルダーを実際の値に置き換えてください。
{rolearn}:これは、ステップ 2 で作成した RAM ロールの Base64 エンコードされた ARN に置き換えてください。{oidcproviderarn}:これは、クラスターで RRSA を有効化した後に生成された OIDC プロバイダーの Base64 エンコードされた ARN に置き換えてください。
apiVersion: v1 data: rolearn: {rolearn} oidcproviderarn: {oidcproviderarn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque次のコマンドを実行して、Kubernetes Secret をデプロイします。
kubectl apply -f secretstore-rrsa.yaml
ワーカー RAM ロールによる方式
この方式は、ACK マネージドクラスター、ACK 専用クラスター、および ACK One 登録済みクラスター に適用されます。
カスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。ポリシーの内容は次のとおりです。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前述の手順で作成したカスタムポリシーを、クラスターのワーカー RAM ロールにアタッチします。詳細については、「ワーカー RAM ロールへの権限付与」をご参照ください。
AccessKey による方式
この方式は、すべての ACK クラスターに適用されます。
信頼できる Alibaba Cloud アカウント向けの RAM ロールを作成し、csi-secrets-store-provider-alibabacloud コンポーネントで使用します。詳細については、「Alibaba Cloud アカウント向け RAM ロールの作成」をご参照ください。
説明信頼できるエンティティには、現在のアカウント を選択します。
カスタムポリシーを作成し、前述の手順で作成した RAM ロールに権限を付与します。
KMS サービス認証情報にアクセスするために必要な権限ポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。ポリシーの内容は次のとおりです。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前述の手順で作成した RAM ロールに権限を付与します。詳細については、「RAM ロールの権限管理」をご参照ください。
前述のロールを偽装する権限を付与するカスタムポリシーを作成し、そのポリシーを RAM ユーザーにアタッチします。
ロールを偽装する権限を付与するカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。ポリシーの内容は次のとおりです。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram:*:<account-id>:role/<role-name>" } ], "Version": "1" }
次のテンプレートに基づいて、クラスター内に alibaba-credentials という名前の Kubernetes Secret を作成します。プレースホルダーの値を置き換える必要があります。
次の内容で alibaba-credentials.yaml という名前のファイルを作成します。プレースホルダーを実際の値に置き換えてください。
{rolearn}:これは、ステップ 1 で作成した RAM ロールの Base64 エンコードされた ARN に置き換えてください。{ak}:これは、RAM ユーザーの Base64 エンコードされた AccessKey ID に置き換えてください。{sk}:これは、RAM ユーザーの Base64 エンコードされた AccessKey Secret に置き換えてください。apiVersion: v1 data: id: {ak} secret: {sk} rolearn: {rolearn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque
次のコマンドを実行して、Kubernetes Secret をデプロイします。
kubectl apply -f alibaba-credentials.yaml
ステップ 2:csi-secrets-store-provider-alibabacloud コンポーネントのインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、ご利用のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
Helm ページで、デプロイ をクリックします。検索ボックスに csi-secrets-store-provider-alibabacloud と入力して選択します。他のパラメーターはデフォルト設定のままにして、次 をクリックします。
表示されるダイアログボックスで設定を確認します。コンポーネントはデフォルトの kube-system 名前空間にインストールされ、Helm リリース名はコンポーネント名と同じになります。カスタムのアプリケーション名と名前空間を使用する場合は、指示に従ってパラメーターを設定してください。
最新の Chart バージョン を選択します。パラメーター セクションで、ステップ 1 で選択した認証方式に基づいて関連パラメーターを設定し、OK をクリックします。
RRSA を使用した権限付与 を選択した場合は、
rrsa.enableパラメーターを true に設定して、RRSA 機能を有効化します。
その他のパラメーターは次のとおり設定します。
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 ロールへの権限付与 を選択した場合は、デフォルトのパラメーター設定を使用してコンポーネントをインストールできます。
特定の RAM ロールを偽装するために AccessKey ID と Secret を指定する を選択した場合は、次のパラメーターを設定する必要があります。
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: oidcproviderarnKubernetes Secret も生成する場合は、次のパラメーターを設定する必要があります。

secrets-store-csi-driver.syncSecret.enabled:Kubernetes Secret としてシークレットの同期を有効化するかどうかを指定します。trueに設定すると、必要な RBAC ロールおよびロールバインディングがデプロイされます。自動シークレットローテーションを有効化する場合は、次のパラメーターを設定します。

secrets-store-csi-driver.enableSecretRotation:自動シークレットローテーションを有効化するかどうかを指定します。この機能を有効化するには、値を true に設定します。secrets-store-csi-driver.rotationPollInterval:シークレットの同期間隔です。たとえば、120s は 2 分ごとにシークレットが同期されることを意味します。ビジネス要件に応じて値を変更できます。
デプロイが成功すると、対象クラスターの csi-secrets-store-provider-alibabacloud ページにリダイレクトされます。インストール結果を確認してください。次の図に示されているすべてのリソースが正常に作成されていれば、コンポーネントはインストールされています。

ステップ 3:データ同期の構成
認証を構成したら、SecretProviderClass を使用して KMS 認証情報の構成を行います。
テンプレート
以下は、SecretProviderClass テンプレートの形式です。
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: <NAME>
spec:
provider: alibabacloud # この値は 'alibabacloud' に固定されます。
parameters:
objects: |
- objectName: <KMS 暗号化パラメーター名> # KMS 認証情報の名前。
objectType: kms # KMS 認証情報を同期する場合は kms に固定されます。parameters フィールドには、マウントリクエストの次の設定が含まれます。
パラメーター | 必須 | 説明 |
objects | はい | マウントするシークレットを YAML 配列として指定します。例:
|
region | 任意 | Secrets Manager サービスのリージョンです。このパラメーターを指定しない場合、ノードのリージョンが使用されます。ただし、大規模な Pod デプロイメントでは追加のパフォーマンスオーバーヘッドが発生する可能性があるため、リージョンを明示的に指定することを推奨します。 |
pathTranslation | 任意 |
|
使用例
このセクションでは、ACK マネージドクラスター と同じリージョンにある test という名前の KMS サービス認証情報を SecretProviderClass を使用してワークロードにインポートする方法を示します。
次の内容で secretstore.yaml という名前のファイルを作成します。
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-hangzhou" objectType: "kms" objectAlias: "hangzhou-public" kmsEndpoint: "kms.{region}.aliyuncs.com"次のコマンドを実行して、SecretProviderClass をデプロイします。
kubectl apply -f secretstore.yaml次の内容で deploy.yaml という名前のファイルを作成します。
このマニフェストには、前述の手順で作成した SecretProviderClass を CSI インラインボリュームを通じて使用する NGINX デプロイメントが含まれています。認証情報は Pod の
/mnt/secrets-storeディレクトリにマウントされます。デプロイメントの例の詳細については、「デプロイメントの例」をご参照ください。apiVersion: apps/v1 # 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次のコマンドを実行して、アプリケーションをデプロイします。
kubectl apply -f deploy.yamlシークレットが正しくマウントされていることを確認します。
Pod にログインし、SecretProviderClass で指定されたシークレットと同じ名前のファイルがターゲットマウントパス
/mnt/secrets-storeに作成されているか、およびファイルの内容が KMS 認証情報で指定された暗号文であるかを確認します。
KMS 認証情報を Kubernetes Secret に同期する
Secrets Store CSI Driver は、Alibaba Cloud KMS や OOS などの外部シークレット管理サービスから取得したシークレットを自動的に同期し、クラスター内にネイティブな Kubernetes Secret として作成できます。これにより、アプリケーションはコードを変更せずに標準的な方法で外部シークレットを使用できます。
構成方法:SecretProviderClass
この機能を有効化するには、SecretProviderClass リソースの spec にオプションの secretObjects フィールドを追加します。
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: <NAME>
spec:
provider: alibabacloud # この値は alibabacloud に固定されます。変更しないでください。
parameters:
objects: |
- objectName: <KMS 暗号化パラメーター名> # KMS 認証情報の名前。
objectType: kms # KMS 認証情報を同期する場合は kms に固定されます。
secretObjects:
- secretName: <Kubernetes Secret 名> # Kubernetes Secret の名前。
type: <Kubernetes Secret タイプ> # Kubernetes Secret のタイプ。
data:
- objectName: <parameters.objects.objectName> # parameters.objects.objectName の名前。エイリアスが指定されている場合はエイリアスを使用します。
key: <Kubernetes Secret データキー> # Kubernetes Secret データ内のキー名。secretObjects フィールドには、通常次のパラメーターが含まれます。
パラメーター | 必須 | 説明 |
secretName | はい | クラスター内に作成される Kubernetes Secret の名前です。 |
type | はい | 作成する Secret のタイプです。有効な値には、 |
data | はい | 取得したシークレットを
|
同期ライフサイクル
同期された Secret オブジェクトのライフサイクルは、対応する SecretProviderClass をマウントする Pod によって動的にトリガーされます。
作成:最初に
SecretProviderClassを使用する Pod が起動してボリュームをマウントすると、ドライバーが Kubernetes Secret を作成します。更新:csi-secrets-store-provider-alibabacloud プロバイダーをインストールする際に
secrets-store-csi-driver.enableSecretRotationパラメーターをtrueに設定した場合、対応する Kubernetes Secret はsecrets-store-csi-driver.rotationPollIntervalの値に基づいて定期的に更新されます。それ以外の場合は、Secret は更新されません。削除:
SecretProviderClassを使用する最後の Pod が削除されると、対応する Kubernetes Secret も削除されます。
例:認証情報の同期と注入
次の手順では、KMS 認証情報を Kubernetes Secret に同期し、それを NGINX Pod の環境変数として注入する方法を示します。
SecretProviderClass を作成します。
次の内容で syncSecret.yaml という名前のファイルを作成します。これにより、外部シークレットの取得方法と同期方法が定義されます。
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: alibabacloud-sync-secret spec: provider: alibabacloud parameters: objects: | - objectName: test-kms objectAlias: secretalias objectType: kms secretObjects: - secretName: test-sync-secret # 生成される Kubernetes Secret の名前。 type: Opaque data: - objectName: secretalias # objectName または objectAlias に対応します。 key: test # 生成される Kubernetes Secret の data キーを設定します。SecretProviderClass をデプロイします。
kubectl apply -f syncSecret.yaml同期をトリガーするアプリケーション Pod を作成します。
次の内容で
pod-sync-secret.yamlファイルを作成します。この Pod は前述のSecretProviderClassをマウントし、生成されるtest-sync-secretという名前のSecretを参照するためにsecretKeyRefを使用しようとします。kind: Pod apiVersion: v1 metadata: name: pod-sync-secret spec: containers: - name: nginx image: nginx:latest volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true env: - name: SECRET_TEST valueFrom: secretKeyRef: name: test-sync-secret key: test volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "alibabacloud-sync-secret"シークレットの同期をトリガーするために Pod をデプロイします。
kubectl apply -f pod-sync-secret.yaml結果を確認します。
Kubernetes Secret が作成されているか確認します。
kubectl get secret test-sync-secretコマンドの出力には、
test-sync-secretKubernetes Secret が表示されます。環境変数が Pod に正常に注入されているか確認します。
kubectl exec -it $(kubectl get pods | awk '/pod-sync-secret/{print $1}' | head -1) -- env出力には、
SECRET_TEST環境変数とその値(KMS シークレットの値と一致)が含まれます。
kmsEndpoint の構成
専用ゲートウェイまたは共有ゲートウェイを使用して KMS 認証情報にアクセスできます。次の要件に従ってエンドポイントを構成してください。専用ゲートウェイと共有ゲートウェイの違いの詳細については、「共有ゲートウェイと専用ゲートウェイの違い」をご参照ください。
KMS エンドポイントアドレス
KMS エンドポイント構成例
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: test
spec:
provider: alibabacloud # 'alibabacloud' に固定されます
parameters:
# ゲートウェイ使用例:
# hangzhou-public は共有ゲートウェイのパブリックエンドポイントを使用します。{region} は KMS 認証情報が配置されているリージョンに置き換えてください。この方法では、クラスターとは異なるリージョンの KMS 認証情報にアクセスできます。
# hangzhou-vpc は kmsEndpoint フィールドを指定せず、共有ゲートウェイのデフォルト VPC エンドポイントを使用します。
# hangzhou-cryptoservice は専用ゲートウェイを使用します。{kms-instance-id} は KMS インスタンスの ID に置き換えてください。
# london-public は共有ゲートウェイのパブリックエンドポイントを使用します。{region} は KMS 認証情報が配置されているリージョンに置き換えてください。この方法では、クラスターとは異なるリージョンの KMS 認証情報にアクセスできます。
objects: |
- objectName: "test-hangzhou"
objectType: "kms"
objectAlias: "hangzhou-public"
kmsEndpoint: "kms.{region}.aliyuncs.com"
- objectName: "test-hangzhou"
objectType: "kms"
objectAlias: "hangzhou-vpc"
- objectName: "test-hangzhou"
objectType: "kms"
objectAlias: "hangzhou-cryptoservice"
kmsEndpoint: "{kms-instance-id}.cryptoservice.kms.aliyuncs.com"
- objectName: "test-london"
objectAlias: "london-public"
kmsEndpoint: "kms.{region}.aliyuncs.com"関連ドキュメント
ACK Serverless クラスター のワークロード向けに KMS サービス認証情報をインポートするには、「ack-secret-manager を使用した Alibaba Cloud KMS サービス認証情報のインポート」をご参照ください。
KMS から読み取った後に ACK クラスター内でキャッシュされるシークレットを保護するために、保存時の暗号化を行うことができます。詳細については、「Alibaba Cloud KMS を使用したシークレットの保存時暗号化」をご参照ください。