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 で暗号化パラメータが公開される可能性が低くなります。
前提条件
以下の要件を満たす ACK クラスタが作成されていること。詳細については、「ACK マネージドクラスターを作成する」および「登録済みクラスターを作成する」をご参照ください。
クラスターの Kubernetes バージョンが 1.20 以降であること。ACK マネージドクラスター、ACK 専用クラスター、または 登録済みクラスターを作成できます。ACK Serverless Kubernetes クラスターはサポートされていません。
クラスターと OOS 暗号化パラメータが同じリージョンにあること。
OOS 暗号化パラメータが作成されていること。詳細については、「暗号化パラメータを作成する」および「CreateSecretParameter」をご参照ください。
ステップ 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 シークレットの使用によって引き起こされるシークレット漏洩のリスクを回避できます。
ID プロバイダーを作成するために、[ACK コンソール] で RRSA 機能を有効にします。詳細については、「RRSA を有効にする」をご参照ください。
[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
を実際の名前空間に置き換えます。
カスタム RAM ポリシーを作成し、そのポリシーを RAM ロールにアタッチします。
csi-secrets-store-provider-alibabacloud を使用して OOS 暗号化パラメータをインポートする際に必要なポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。詳細については、「カスタムポリシーを作成する」をご参照ください。
{ "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "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 専用クラスター、および 登録済みクラスターに適用されます。
次のカスタムポリシーを作成します。詳細については、「カスタムポリシーを作成する」をご参照ください。
{ "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }
前のステップで作成したカスタムポリシーをワーカー RAM ロールにアタッチします。詳細については、「ワーカー RAM ロールに権限を付与する」をご参照ください。
特定の RAM ロールを偽装するために AccessKey ペアを指定する
この方法は、すべてのタイプの ACK クラスタに適しています。
信頼された Alibaba Cloud アカウントの RAM ロールを作成し、csi-secrets-store-provider-alibabacloud が RAM ロールを使用できるようにします。詳細については、「信頼された Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
前のステップで作成した RAM ロールに権限を付与するカスタムポリシーを作成します。
OOS 暗号化パラメータにアクセスするために必要なポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。詳細については、「カスタムポリシーを作成する」をご参照ください。
{ "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }
前のステップで作成した RAM ロールにポリシーをアタッチします。詳細については、「RAM ロールに権限を付与する」をご参照ください。
作成した RAM ロールを偽装するための権限を提供するカスタム RAM ポリシーを作成し、そのポリシーを使用する RAM ユーザーにアタッチします。
作成した RAM ロールを偽装するための権限を含むカスタム RAM ポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。詳細については、「カスタムポリシーを作成する」をご参照ください。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::***:role/****" // このセクションのステップ 1 で作成した RAM ロールの Alibaba Cloud リソースネーム (ARN)。 } ], "Version": "1" }
ポリシーを使用する 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 のバージョン] パラメータを最新バージョンに設定します。[パラメータ] セクションで、ステップ 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 を使用して 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 構成。例:
|
region | オプション | 指定されたリージョンの OOS 暗号化パラメータサーバーにリクエストを送信します。このパラメータを指定しない場合、現在のノードのリージョンが選択されます。アプリケーションが多数のポッドで実行されている場合、これによりパフォーマンスオーバーヘッドが増加する可能性があります。したがって、このパラメータを構成してリージョンを指定することをお勧めします。 |
pathTranslation | オプション |
|
構成例
この例では、SecretProviderClass を使用して、同じリージョンの ACK マネージドクラスター のアプリケーションに OOS から暗号化パラメータ test
をインポートする方法を示します。
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"
次のコマンドを実行して、SecretProviderClass をデプロイします。
kubectl apply -f secretstore.yaml
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
次のコマンドを実行して、デプロイメントをデプロイします。
kubectl apply -f deploy.yaml
シークレットがマウントされていることを確認します。
ポッドにログインし、SecretProviderClass で指定された暗号化パラメータがマウントポイント
/mnt/secrets-store
に作成されているかどうかを確認し、暗号化パラメータに OOS に格納されている対応する暗号文が含まれているかどうかを確認します。
関連情報
ACK Serverless Kubernetes クラスター のアプリケーションに OOS から暗号化パラメータをインポートする方法の詳細については、「ack-secret-manager を使用して OOS 暗号化パラメータをインポートする」をご参照ください。
OOS 暗号化パラメータから同期され、ACK クラスタにキャッシュされた Kubernetes Secrets を保護するために、Secret 暗号化機能を有効にすることをお勧めします。詳細については、「KMS を使用して Kubernetes Secrets を暗号化する」をご参照ください。