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」をご参照ください。
ステップ 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 マネージドクラスターに適用されます。
ACK コンソールACK コンソール で RRSA を有効にして ID プロバイダーを作成します。詳細については、「RRSA の有効化」をご参照ください。
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:sub StringEquals条件を追加し、値をsystem:serviceaccount:<namespace>:<serviceAccountName>に設定します。本トピックのテストアプリケーションでは、system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloudカスタム RAM ポリシーを作成し、RAM ロールにアタッチします。
以下の内容でポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。 ``
json { "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }``ポリシーを RAM ロールにアタッチします。「RAM ロールへの権限付与」をご参照ください。
クラスター内に
alibaba-credentialsSecret を作成します。以下の内容で
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: OpaqueSecret をデプロイします: ``
bash kubectl apply -f secretstore-rrsa.yaml``
ワーカー RAM ロールへの権限付与
この方式は、ACK マネージドクラスター、ACK 専用クラスター、および登録済みクラスターに適用されます。
以下の内容でカスタムポリシーを作成します。「カスタムポリシーの作成」をご参照ください。
{ "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }ポリシーをワーカー RAM ロールにアタッチします。「ワーカー RAM ロールへの権限付与」をご参照ください。
AccessKey ペアを指定して RAM ロールを偽装
この方式は、すべての ACK クラスタータイプで動作します。
信頼された Alibaba Cloud アカウント用の RAM ロールを作成します。「信頼された Alibaba Cloud アカウント用の RAM ロールの作成」をご参照ください。
OOS アクセスを許可するカスタムポリシーを作成し、RAM ロールにアタッチします。
以下の内容でポリシーを作成します。「カスタムポリシーの作成」をご参照ください。 ``
json { "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }``ポリシーを RAM ロールにアタッチします。「RAM ロールへの権限付与」をご参照ください。
sts:AssumeRole権限を付与するカスタム RAM ポリシーを作成し、RAM ユーザーにアタッチします。以下の内容でポリシーを作成します。ARN はステップ 1 で作成した RAM ロールの Alibaba Cloud リソースネーム (ARN) に置き換えてください。「カスタムポリシーの作成」をご参照ください。
json { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::*:role/**" } ], "Version": "1" }ポリシーを RAM ユーザーにアタッチします。「RAM ユーザーへの権限付与」をご参照ください。
クラスター内に
alibaba-credentialsSecret を作成します。以下の内容で
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: OpaqueSecret をデプロイします: ``
bash kubectl apply -f alibaba-credentials.yaml``
ステップ 2:csi-secrets-store-provider-alibabacloud コンポーネントのインストール
ACK コンソールACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。
クラスター ページで、管理対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、アプリケーション > Helm を選択します。
Helm ページで、デプロイ をクリックします。[Chart] セクションで、csi-secrets-store-provider-alibabacloud を検索し、他のパラメーターはデフォルト設定のままにします。次へ をクリックします。表示されるダイアログボックスで、コンポーネントがデフォルトの
kube-system名前空間にインストールされることを確認します。カスタム名前空間およびアプリケーション名を使用する場合は、指示に従って構成してください。Chart バージョン を最新バージョンに設定します。[Parameters] セクションで、認証方式に基づいてパラメーターを構成し、OK をクリックします。インストール後、csi-secrets-store-provider-alibabacloud ページにリダイレクトされます。次の図に示されているすべてのリソースが作成されていれば、コンポーネントは正常にインストールされています。
RRSA:
rrsa.enableをtrueに設定し、以下のパラメーターを構成します:
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シークレットのローテーション(オプション):暗号化パラメーターの更新を自動同期するには、以下のパラメーターを構成します:

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

ステップ 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/Secret は My_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 をインポートします。
以下の内容で
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"SecretProviderClass を適用します:
kubectl apply -f secretstore.yaml以下の内容で
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アプリケーションをデプロイします:
kubectl apply -f deploy.yamlシークレットがマウントされていることを確認します。Pod にログインし、SecretProviderClass で指定された暗号化パラメーターがマウントポイント
/mnt/secrets-storeに作成されているか確認し、さらに OOS に保存されている暗号文が含まれているか確認します。
次のステップ
ACK Serverless クラスターに OOS 暗号化パラメーターをインポートするには、「ack-secret-manager を使用した OOS 暗号化パラメーターのインポート」をご参照ください。
OOS から同期され ACK クラスター内にキャッシュされた Kubernetes Secrets を保護するには、Secret 暗号化を有効にしてください。「KMS を使用した Kubernetes Secrets の暗号化」をご参照ください。