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 でシークレットが公開される可能性が低くなります。
前提条件
以下の要件を満たす ACK クラスタが作成されていること。詳細については、ACK マネージドクラスターを作成するおよびACK One 登録済みクラスターを作成するをご参照ください。
クラスタの Kubernetes バージョンが 1.20 以降であること。ACK マネージドクラスター、ACK 専用クラスター、または登録済みクラスターを作成できます。ACK Serverless クラスターはサポートされていません。
クラスタと KMS シークレットが同じリージョンにあること。
ステップ 1: コンポーネント認証情報を構成する
csi-secrets-store-provider-alibabacloud の認証情報を構成して、プラグインが KMS からシークレットを取得するための権限を持っていることを確認する必要があります。そうでない場合、csi-secrets-store-provider-alibabacloud はクラスタにシークレットをインポートまたは同期できません。クラスタタイプに基づいて、以下のいずれかの認証方法を選択できます。
RRSA を使用して権限を付与する: この方法は、Kubernetes 1.22 以降を実行するACK マネージドクラスターに適用できます。
クラスタのワーカー Resource Access Management (RAM) ロールに権限を付与する: この方法は、ACK マネージドクラスター、ACK 専用クラスター、および登録済みクラスターに適用されます。
特定の RAM ロールを引き受ける AccessKey ペアを指定する: この方法は、すべてのタイプの ACK クラスタに適用できます。
RRSA を使用して権限を付与する
この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスターとACK Serverless クラスターに適用されます。RRSA 機能を使用して、ポッドレベルの権限制御を実装できます。また、この方法では AccessKey ペアが不要なため、RRSA はシークレットの漏洩を防ぐこともできます。
ACK コンソールで ACK クラスタの RRSA 機能を有効にします。これにより、クラスタの ID プロバイダー (IdP) を作成できます。詳細については、RRSA を有効にするをご参照ください。
信頼できる 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を名前空間の名前に置き換えます。
カスタムポリシーを作成し、前のステップで作成した RAM ロールに権限を付与します。
csi-secrets-store-provider-alibabacloud を使用して KMS からシークレットをインポートするときに必要なポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前のステップで作成した RAM ロールに権限を付与します。詳細については、RAM ロールに権限を付与するをご参照ください。
次の構成テンプレートに基づいて、クラスタに alibaba-credentials という名前の Secret を作成し、指定されたフィールドを置き換えます。
次の内容に基づいて 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次のコマンドを実行して、Secret をデプロイします。
kubectl apply -f secretstore-rrsa.yaml
クラスタのワーカー RAM ロールに権限を付与する
この方法は、ACK マネージドクラスター、ACK 専用クラスター、および登録済みクラスターに適用されます。
次のコードブロックに基づいてカスタム RAM ポリシーを作成します。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前のステップで作成したカスタムポリシーをワーカー RAM ロールにアタッチします。詳細については、ワーカー RAM ロールに権限を付与するをご参照ください。
特定の RAM ロールを引き受けるために使用される AccessKey ペアを指定する
この方法は、すべてのタイプの ACK クラスタに適しています。
信頼できる Alibaba Cloud アカウントの RAM ロールを作成して、csi-secrets-store-provider-alibabacloud で RAM ロールを使用できるようにします。詳細については、信頼できる Alibaba Cloud アカウントの RAM ロールを作成するをご参照ください。
説明プリンシパル名パラメーターには、[現在のアカウント] を選択します。
カスタム RAM ポリシーを作成し、前のステップで作成した RAM ロールにポリシーをアタッチします。
KMS シークレットにアクセスするために必要なポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前のステップで作成した RAM ロールに権限を付与します。詳細については、RAM ロールに権限を付与するをご参照ください。
前のステップで作成した RAM ロールのカスタムポリシーを作成し、指定された RAM ユーザーに権限を付与します。
前に作成した 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 を表示するにはどうすればよいですか? をご参照ください。使用する RAM ユーザーにポリシーをアタッチします。これにより、RAM ユーザーは RAM ロールを引き受けることができます。RAM ユーザーに権限を付与する方法の詳細については、RAM ユーザーに権限を付与するをご参照ください。
次の構成テンプレートに基づいて、クラスタに alibaba-credentials という名前の Secret を作成し、指定されたフィールドを置き換えます。
次の内容に基づいて 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
次のコマンドを実行して、Secret をデプロイします。
kubectl apply -f alibaba-credentials.yaml
ステップ 2: csi-secrets-store-provider-alibabacloud コンポーネントをインストールする
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、目的のクラスターを見つけて名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Helm] ページで、[デプロイ] をクリックします。「Chart」セクションに、[csi-secrets-store-provider-alibabacloud] と入力します。その他のパラメーターはデフォルト設定のままにして、[次へ] をクリックします。
表示されるダイアログボックスで、コンポーネントがデフォルトの kube-system 名前空間にインストールされ、アプリケーションがコンポーネント名でリリースされることを確認します。カスタムアプリケーション名と名前空間を指定する場合は、プロンプトに従ってアプリケーション名と名前空間を構成します。
[Chart のバージョン] パラメーターを最新バージョンに設定します。「Parameters」セクションで、ステップ 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 ロールに権限を付与することを選択した場合は、デフォルトのパラメーター設定を使用して 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スケジュールされたシークレット同期機能を有効にするには、以下のパラメーターを構成する必要があります。
secrets-store-csi-driver.enableSecretRotation: シークレットの自動回転機能を有効にするかどうかを指定します。値を [true] に設定すると、シークレットの自動回転機能が有効になります。secrets-store-csi-driver.rotationPollInterval: シークレットを同期する頻度を指定します。この例では、このパラメーターは [120] 秒に設定されており、シークレットが 2 分ごとに同期されることを指定しています。必要に応じて値を調整できます。
作成後、クラスタの csi-secrets-store-provider-alibabacloud ページにリダイレクトされ、インストール結果を確認できます。次の図のすべてのリソースが作成されている場合、コンポーネントはインストールされています。
ステップ 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 構成。例:
|
region | いいえ | 指定されたリージョンの Secrets Manager サーバーにリクエストを送信します。このパラメーターを指定しない場合、現在のノードのリージョンが選択されます。アプリケーションが多数のポッドで実行されている場合、これによりパフォーマンスのオーバーヘッドが増加する可能性があります。したがって、このパラメーターを構成してリージョンを指定することをお勧めします。 |
pathTranslation | いいえ |
|
構成例
この例では、SecretProviderClass を使用して、同じリージョンの ACK マネージドクラスターのアプリケーションに KMS からシークレット test をインポートする方法を示します。
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"次のコマンドを実行して、SecretProviderClass をデプロイします。
kubectl apply -f secretstore.yamldeploy.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次のコマンドを実行して、デプロイメントをデプロイします。
kubectl apply -f deploy.yamlシークレットがマウントされていることを確認します。
ポッドにログインし、SecretProviderClass で指定されたシークレットがマウントターゲット
/mnt/secrets-storeに作成されているかどうかを確認し、シークレットに KMS に格納されている対応する暗号文が含まれているかどうかを確認します。
kmsEndpoint の説明
専用ゲートウェイまたは共有ゲートウェイを介して KMS シークレットを取得できます。ゲートウェイにアクセスする前に、次の表に基づいて KMS エンドポイントを構成します。専用ゲートウェイを介したアクセスと共有ゲートウェイを介したアクセスの違いの詳細については、KMS にアクセスするための共有ゲートウェイと専用ゲートウェイの違いをご参照ください。
KMS エンドポイント
ゲートウェイタイプ | ドメインタイプ | エンドポイント | 説明 |
専用ゲートウェイ | KMS プライベートドメイン | {kms-instance-id}.cryptoservice.kms.aliyuncs.com |
|
共有ゲートウェイ | VPC ドメイン | kms-vpc.{region}.aliyuncs.com |
|
共有ゲートウェイ | パブリックドメイン | kms.{region}.aliyuncs.com |
|
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}関連情報
ACK Serverless クラスターのアプリケーションに KMS からシークレットをインポートする方法の詳細については、ack-secret-manager を使用して KMS からシークレットをインポートするをご参照ください。
KMS から読み取られ、ACK クラスタにキャッシュされたシークレットを保護するために、ワンクリック暗号化を実行できます。詳細については、KMS を使用して Kubernetes Secrets を暗号化するをご参照ください。