ack-secret-manager を使用すると、Key Management Service (KMS) から Container Service for Kubernetes (ACK) クラスタにシークレットを Kubernetes Secrets としてインポートまたは同期できます。Kubernetes Secrets は、クラスタ内の機密情報を保存するために使用されます。このコンポーネントを使用すると、KMS から ACK クラスタへのシークレットの同期を自動化できます。このようにして、クラスタ内のアプリケーションは、ファイルシステムを使用して指定された Secrets をマウントし、最新の KMS シークレットを使用できます。これは、アプリケーションと Secrets Manager との間の互換性の向上に役立ちます。
セキュリティに関する考慮事項
ほとんどの場合、KMS シークレットに関する情報は、アプリケーションが取得するためのファイルに保存されます。この状況では、KMS Secrets Manager から直接シークレットを取得することに互換性の問題が生じます。ack-secret-manager コンポーネントはこの互換性の問題を解決できます。また、このコンポーネントを使用して、KMS から ACK クラスタ内の Kubernetes Secrets にシークレットを同期することもできます。その後、Kubernetes Secrets を環境変数としてマウントして使用できます。このコンポーネントを使用する前に、以下のセキュリティリスクを評価してください:
クラスタ内のシークレットにファイルシステムを介してアクセスできる場合、攻撃者はアプリケーションの Common Vulnerabilities and Exposures (CVE) の脆弱性を悪用して、クラスタ内のディレクトリを走査する可能性があります。その結果、シークレットが漏洩する可能性があります。
デバッグ ブレークポイントの構成が不適切である場合、またはログアクセス権限が過剰である場合、クラスタ内のシークレットが公開される可能性があります。潜在的なセキュリティリスクを回避するために、環境変数を介してシークレットを参照しないことをお勧めします。
シークレットの同期を有効にする場合は、最小権限の原則に厳密に従ってアクセス権限を制限してください。
アプリケーションのシークレットを永続化する必要がない場合は、RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを承認するを参照して、ポッドに最小限のアクセス権限を付与することをお勧めします。次に、GetSecretValue 操作を直接呼び出すことによって、アプリケーションでシークレットを取得します。これにより、ポッド ファイルシステムまたは Kubernetes Secrets でシークレットが公開される可能性が低くなります。
前提条件
使用する KMS シークレットと同じリージョンに ACK クラスタが作成されていること。詳細については、ACK マネージドクラスターを作成する、ACK One 登録済みクラスターを作成する、およびServerless Kubernetes クラスターを作成するをご参照ください。
ステップ 1:ack-secret-manager をインストールする
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、目的のクラスターを見つけて名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Helm] ページで、[デプロイ] をクリックします。[チャート] セクションの [デプロイ] パネルで、[ack-secret-manager] を見つけて選択し、その他のパラメーターにはデフォルト値を使用し、[次へ] をクリックします。
[確認] メッセージに、チャートがデフォルトで kube-system 名前空間にインストールされ、デフォルトのアプリケーション名が使用されることが表示されます。[はい] をクリックします。カスタム アプリケーションとカスタム名前空間を使用するには、[基本情報] ステップで [アプリケーション名] パラメーターと [名前空間] パラメーターを構成します。
[パラメーター] ステップで、最新のチャートバージョンを選択し、その他のパラメーターを構成して、[OK] をクリックします。
認証にサービスアカウントの Resource Access Management (RAM) ロール (RRSA) を有効にするには、rrsa.enable パラメーターを [true] に設定します。

シークレットの定期的な同期を有効にするには、次の図に示すパラメーターを構成します。

command.disablePolling:シークレットのラウンドロビンを無効にするかどうかを指定します。[false] の値は、シークレットのラウンドロビンを有効にします。command.pollingInterval:同期の頻度。[120s] の値は、シークレットが 2 分ごとに同期されることを指定します。ビジネス要件に基づいてカスタム値を指定できます。
同期を保留中の KMS シークレットである多数の ExternalSecrets を含むクラスター内のシークレットを調整するには、構成が不適切な場合、KMS 側または RAM 側で調整がトリガーされる可能性があります。したがって、このような問題を回避するには、次の調整パラメーターを設定します:

command.maxConcurrentKmsSecretPulls:1 秒以内に同期できる KMS シークレットの最大数。デフォルト値は 10 です。KMS エンドポイントアドレスを指定するには、kmsEndpoint パラメーターを構成します。

command.kmsEndpoint:KMS の共有ゲートウェイと専用ゲートウェイ。このパラメーターはグローバル構成であり、現在、シークレットレベルの構成もサポートしています。
コンポーネントをインストールすると、ack-secret-manager ページにリダイレクトされます。コンポーネントがインストールされているかどうかを確認できます。次の図に示すリソースが作成されている場合、コンポーネントはインストールされています。

ステップ 2:ack-secret-manager に KMS シークレットへのアクセスを承認する
KMS シークレットにアクセスするために ack-secret-manager を承認するには、SecretStore を作成する必要があります。そうしないと、ack-secret-manager は KMS から ACK クラスタにシークレットをインポートまたは同期できません。以下の方法を使用して、ack-secret-manager に KMS シークレットへのアクセスを承認できます。
RRSA を使用して権限を付与する:この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスター および Serverless Kubernetes クラスター に適用されます。
クラスターのワーカー RAM ロールに権限を付与する:この方法は、ACK マネージドクラスター、ACK 専用クラスター、および 登録済みクラスター に適用されます。
RAM ロールを偽装するために使用する AccessKey ペアを指定する:この方法は、すべてのタイプの ACK クラスタに適用されます。
RRSA を使用して権限を付与する
この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスターと Serverless Kubernetes クラスター に適用されます。RRSA 機能を使用して、ポッドレベルの権限制御を実装できます。また、この方法では AccessKey ペアが不要なため、RRSA はシークレットの漏洩を防ぐこともできます。
ACK コンソール で、ACK クラスタの RRSA 機能を有効にします。これにより、クラスターの ID プロバイダー (IdP) を作成できます。詳細については、RRSA を有効にするをご参照ください。
ack-secret-manager の信頼できるエンティティが ID プロバイダーである RAM ロールを作成します。
[プリンシパルタイプ] を [ID プロバイダー] に設定します。次の表に、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:ack-secret-managerが指定されています。説明ack-secret-manager を
kube-system以外の名前空間にインストールする場合は、実際の名前空間を指定します。
カスタム RAM ポリシーを作成し、そのポリシーを RAM ロールにアタッチします。
ack-secret-manager が KMS シークレットをインポートすることを承認するカスタム RAM ポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }ポリシーを RAM ロールにアタッチします。詳細については、RAM ロールに権限を付与するをご参照ください。
認証方式を指定するために SecretStore を作成します。
次の説明に基づいて、次のコードブロックを変更します。次に、変更したコードブロックに基づいて secretstore-rrsa.yaml という名前のファイルを作成します。
{accountID}:値を、KMS シークレットの同期に使用する Alibaba Cloud アカウントの ID に置き換えます。{clusterID}:値をクラスターの ID に置き換えます。{roleName}:値を、ステップ 2 で作成した RAM ロールの名前に置き換えます。apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-rrsa spec: KMS: KMSAuth: oidcProviderARN: "acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{accountID}:role/{roleName}"
次のコマンドを実行して、SecretStore を作成します。
kubectl apply -f secretstore-rrsa.yaml
クラスターのワーカー RAM ロールに権限を付与する
この方法は、ACK マネージドクラスター、ACK 専用クラスター、および 登録済みクラスター に適用されます。ACK Serverless クラスターにはワーカー RAM ロールが割り当てられていないため、この方法は ACK Serverless クラスター には適用されません。
次のコードブロックに基づいてカスタム RAM ポリシーを作成します。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }カスタムポリシーをクラスターのワーカー RAM ロールにアタッチします。詳細については、ワーカー RAM ロールに権限を付与するをご参照ください。
RAM ロールを偽装するために使用する AccessKey ペアを指定する
この方法は、すべてのタイプの ACK クラスタに適用されます。
ack-secret-manager の信頼できるエンティティが Alibaba Cloud アカウントである RAM ロールを作成します。詳細については、信頼できる Alibaba Cloud アカウントの RAM ロールを作成するをご参照ください。
説明信頼できる Alibaba Cloud アカウントを指定する場合は、[現在のアカウント] を選択します。
カスタム RAM ポリシーを作成し、前のステップで作成した RAM ロールにポリシーをアタッチします。
KMS シークレットにアクセスするための権限を提供するカスタム RAM ポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }前のステップで作成した RAM ロールにポリシーをアタッチします。詳細については、RAM ロールに権限を付与するをご参照ください。
作成した 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 ユーザーに権限を付与するをご参照ください。
使用する RAM ユーザーの AccessKey ペアを保存するために Secret を作成します。
次のコードブロックの AccessKey ペアを、Base64 でエンコードされた実際の AccessKey ペアに置き換えます。次に、変更したコードブロックに基づいて ramuser.yaml という名前のファイルを作成します。
apiVersion: v1 data: accessKey: {AccessKey ID encoded in Base64} accessKeySecret: {AccessKey secret encoded in Base64} kind: Secret metadata: name: ramuser namespace: kube-system type: Opaque次のコマンドを実行して、ramuser Secret を作成します。
kubectl apply -f ramuser.yaml
認証方式を指定するために SecretStore を作成します。
次の説明に基づいて、次のコードブロックを変更します。次に、変更したコードブロックに基づいて secretstore-ramrole.yaml という名前のファイルを作成します。
{accountID}:値を、KMS シークレットの同期に使用する Alibaba Cloud アカウントの ID に置き換えます。{roleName}:値を、ステップ 1 で作成した RAM ロールの名前に置き換えます。{secretName}:値を、AccessKey ペアを保存する Secret の名前に置き換えます。{secretNamespace}:値を、AccessKey ペアを保存する Secret の名前空間に置き換えます。{secretKey}:値を、AccessKey ペアを保存する Secret のキーに置き換えます。{roleSessionName}:値をロールセッションの名前に置き換えます。カスタム文字列を指定できます。apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-ramrole spec: KMS: KMSAuth: accessKey: name: {secretName} namespace: {secretNamespace} key: {secretKey} accessKeySecret: name: {secretName} namespace: {secretNamespace} key: {secretKey} ramRoleARN: "acs:ram::{accountID}:role/{roleName}" ramRoleSessionName: {roleSessionName}
次のコマンドを実行して、SecretStore を作成します。
kubectl apply -f secretstore-ramrole.yaml
ステップ 3:同期の詳細を指定する
ack-secret-manager に KMS シークレットへのアクセスを承認した後、アクセスする KMS シークレットの詳細を指定するために ExternalSecret を作成する必要があります。これにより、KMS からクラスター内の Kubernetes Secret にシークレットをインポートできます。
Kubernetes Secret の名前空間と名前は、ExternalSecret の名前空間と名前と同じである必要があります。
ExternalSecret を作成します。
次の説明に基づいて次のコードブロックを変更します。次に、変更したコードブロックに基づいて external.yaml という名前のファイルを作成します。
パラメーター
説明
{KMS シークレット名}必須。値を、アクセスする KMS シークレットの名前に置き換えます。
{Kubernetes シークレットキー}必須。これはキーと値のペアの集合です。KMS シークレットのデータは、Kubernetes Secret にキーと値のペアとして保存されます。
{Kubernetes シークレットキー}を対応するキーと値のペアのキーに置き換える必要があります。{KMS シークレットバージョンステージ}オプション。値を、KMS シークレットのバージョン番号ではなく、KMS シークレットのステージラベルに置き換えます。例:ACSCurrent。
RDS シークレット、PolarDB シークレット、Redis/Tair シークレット、RAM シークレット、および ECS シークレットは、ACSPrevious パラメーターと ACSCurrent パラメーターに対応するシークレットバージョンのみを取得できます。
同期のために KMS シークレットのバージョン番号を指定するには、次のテンプレートの
versionStageフィールドをversionIdに置き換え、KMS シークレットのバージョン番号を入力します。RDS シークレット、PolarDB シークレット、Redis/Tair シークレット、RAM シークレット、および ECS シークレットは、VersionId パラメーターの指定をサポートしていません。このパラメーターの設定は無視されます。
シークレットバージョンとバージョンステータスの詳細については、シークレット要素 のシークレットバージョンをご参照ください。
{KMS サービス エンドポイントアドレス}オプション。KMS リクエスト エンドポイントを指定する場合は、このパラメーターを対応するエンドポイントアドレスに置き換えます。
KMS の共有ゲートウェイと専用ゲートウェイがサポートされており、ビジネス要件に基づいて構成できます。
このパラメーターはシークレットレベルの構成であり、KMS シークレット専用のエンドポイントアドレスを構成できます。グローバル構成もサポートされています。構成の説明の詳細については、KMS エンドポイントアドレスを構成するをご参照ください。
このパラメーターを設定すると、グローバル構成とデフォルト構成がオーバーライドされ、シークレットリクエストのエンドポイントアドレスはこのパラメーターの値になります。
{シークレットストア名}オプション。値を、作成した
SecretStoreの名前に置き換えます。SecretStoreは、ack-secret-manager が KMS シークレットにアクセスすることを承認するために使用されます。説明コンポーネントがワーカー RAM ロールによって承認されている場合、このパラメーターは空のままにすることができます。
{シークレットストアの名前空間}オプション。値を、作成した
SecretStoreの名前空間に置き換えます。説明コンポーネントがワーカー RAM ロールによって承認されている場合、このパラメーターは空のままにすることができます。
apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: esdemo spec: provider: kms # デフォルトでは、同期される Alibaba Cloud サービスのタイプは KMS です。KMS シークレットを同期する場合、このフィールドは空のままにするか、値 kms を割り当てることができます。 data: # データソースに追加の構成は必要ありません。 - key: {KMS シークレット名} name: {Kubernetes シークレットキー} versionStage: {KMS シークレットバージョンステージ} secretStoreRef: # コンポーネントがワーカー RAM ロールを介して承認されている場合、このパラメーターは不要です。 name: {シークレットストア名} namespace: {シークレットストアの名前空間} - key: {KMS シークレット名} name: {Kubernetes シークレットキー} versionStage: {KMS シークレットバージョンステージ} kmsEndpoint: {KMS サービス エンドポイントアドレス}次のコマンドを実行して、ExternalSecret を作成します。
kubectl apply -f external.yaml
次のコマンドを実行して、Kubernetes Secret が存在するかどうかを確認します。
kubectl get secret esdemoKubernetes Secret が存在する場合、KMS シークレットは KMS からクラスターに同期されます。
高度な ack-secret-manager 構成
Alibaba Cloud アカウント間で KMS シークレットを同期する
アクセスする KMS インスタンスが Alibaba Cloud アカウント A に属し、使用する ACK クラスタが Alibaba Cloud アカウント B に属している場合、ack-secret-manager コンポーネントを使用して、Alibaba Cloud アカウント間で KMS シークレットをクラスターに同期する必要があります。このセクションでは、RRSA 機能を使用して、ack-secret-manager が Alibaba Cloud アカウント B のクラスターから Alibaba Cloud アカウント A の KMS インスタンスにアクセスできるようにする方法について説明します。コンポーネントは、OIDC プロバイダーを使用して、Alibaba Cloud アカウント A に属する RAM ロールを偽装できます。これにより、コンポーネントは Alibaba Cloud アカウント A の KMS インスタンスにアクセスし、Alibaba Cloud アカウント A から Alibaba Cloud アカウント B のクラスターに KMS インスタンスをインポートできます。
Alibaba Cloud アカウント A の権限を構成する
Alibaba Cloud アカウント A を使用して、信頼できるエンティティが Alibaba Cloud アカウント B である RAM ロールを作成します。詳細については、信頼できる Alibaba Cloud アカウントの RAM ロールを作成するをご参照ください。
重要信頼できる Alibaba Cloud アカウントを選択する場合は、[その他のアカウント] を選択し、Alibaba Cloud アカウント B の ID を入力します。
KMS シークレットにアクセスするための権限を提供するカスタム RAM ポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }ポリシーを RAM ロールにアタッチします。詳細については、RAM ロールに権限を付与するをご参照ください。
Alibaba Cloud アカウント B の権限を構成する
ACK コンソール で、ACK クラスタの RRSA 機能を有効にします。これにより、クラスターの IdP を作成できます。詳細については、RRSA を有効にするをご参照ください。
説明ack-secret-manager をインストールする場合は、rrsa.enable パラメーターを [true] に設定して RRSA を有効にします。
ack-secret-manager の信頼できるエンティティが ID プロバイダーである RAM ロールを作成します。
[プリンシパルタイプ] を [ID プロバイダー] に設定します。次の表に、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:ack-secret-managerが指定されています。説明ack-secret-manager を
kube-system以外の名前空間にインストールする場合は、実際の名前空間を指定します。
カスタム RAM ポリシーを作成し、前のステップで Alibaba Cloud アカウント B を使用して作成した RAM ロールにポリシーをアタッチします。
ack-secret-manager が KMS シークレットをインポートすることを承認するカスタム RAM ポリシーを作成します。次のコードブロックは、ポリシーの内容を示しています。詳細については、カスタムポリシーを作成するをご参照ください。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram:*:<account-id>:role/<role-name>" # Alibaba Cloud アカウント A を使用して作成した RAM ロールの ARN。 } ], "Version": "1" }上記のコードブロックの
Resourceフィールドは、RAM ロールの ARN を指定します。<account-id>を Alibaba Cloud アカウント A の ID に置き換え、<role-name>を Alibaba Cloud アカウント A を使用して作成した RAM ロールに置き換えます。RAM ロールの ARN の取得方法の詳細については、RAM ロールの ARN を表示するにはどうすればよいですか。 をご参照ください。カスタム RAM ポリシーを作成し、前のステップで Alibaba Cloud アカウント B を使用して作成した RAM ロールにポリシーをアタッチします。
SecretStore を作成します。
次の説明に基づいて次のコードブロックを変更します。次に、変更したコードブロックに基づいて secretstore-ramrole.yaml という名前のファイルを作成します。
{ACK-accountID}:値を Alibaba Cloud アカウント B の ID に置き換えます。{clusterID}:値をクラスターの ID に置き換えます。{ACK-roleName}:値を、Alibaba Cloud アカウント B を使用して作成した RAM ロールの名前に置き換えます。{KMS-accountID}:値を Alibaba Cloud アカウント A の ID に置き換えます。{KMS-roleName}:値を Alibaba Cloud アカウント B の ID に置き換えます。{roleSessionName}:値をロールセッションの名前に置き換えます。カスタム文字列を指定できます。
apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-cross-account spec: KMS: KMSAuth: oidcProviderARN: "acs:ram::{ACK-accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{ACK-accountID}:role/{ACK-roleName}" remoteRamRoleARN: "acs:ram::{KMS-accountID}:role/{KMS-roleName}" remoteRamRoleSessionName: {roleSessionName}
同期の詳細を指定します。詳細については、ステップ 3:同期の詳細を指定するをご参照ください。
KMS シークレットの解析とキーの置き換え
次のセクションでは、JSON/YAML シークレットで指定されたキーを解析する方法について説明します。
JSON 形式の暗号化パラメーターを解析する
JSON で指定されたキーを解析する
JSON 形式の KMS シークレットを解析し、KMS シークレットから Kubernetes Secret に指定されたキーと値のペアを同期する場合は、jmesPath パラメーターを構成できます。たとえば、次の JSON シークレットが KMS Secrets Manager に保存されています。
{"name":"tom","friends":[{"name":"lily"},{"name":"mark"}]}次のサンプルコードに基づいて ExternalSecret を作成します。jmesPath パラメーターには次のフィールドを指定する必要があります。
path:JMESPath 仕様に基づいて、指定された JSON フィールドを解析します。このパラメーターは必須です。objectAlias:解析されたフィールドに基づいて同期される Kubernetes Secret 内のキーと値のペアのキーを指定します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: es-json-demo
spec:
provider: kms
data:
- key: {KMS シークレット名}
versionStage: {KMS シークレットバージョンステージ}
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
jmesPath: # 一部の json フィールドを解析する
- path: "name"
objectAlias: "myname"
- path: "friends[0].name"
objectAlias: "friendname"JSON シークレットの自動解析
JSON シークレットのデータ構造が不明な場合でも、シークレットを解析して解析済みデータを Kubernetes Secret に保存する必要がある場合は、dataProcess.extract パラメーターを構成して JSON シークレットの自動解析を有効にできます。さらに、dataProcess.replaceRule パラメーターを構成して、解析済みデータのキーを置き換えるルールを指定できます。これにより、不規則な Secret データキーによって Kubernetes Secret の作成が失敗することを防ぎます。
たとえば、次の JSON シークレットが KMS Secrets Manager に保存されています。
{"/name-invalid":"lily","name-invalid/":[{"name":"mark"}]}次のサンプルコードに基づいて ExternalSecret を作成します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: extract-secret
spec:
provider: kms
dataProcess:
- extract:
key: {KMS シークレット名}
versionStage: ACSCurrent # KMS シークレットのバージョン。
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
replaceRule: # キーを置き換えるルール。
- source: "^/.*d$" # スラッシュ (/) で始まり小文字の d で終わるキーを tom に置き換えます。
target: "tom"
- source: "^n.*/$" # 小文字の n で始まりスラッシュ (/) で終わるキーを mark に置き換えます。
target: "mark"YAML 形式の暗号化パラメーターを解析する
YAML で指定されたキーを解析する
YAML 形式の KMS シークレットを解析し、KMS シークレットから Kubernetes Secret に指定されたキーと値のペアを同期する場合は、jmesPath パラメーターを構成できます。たとえば、次の YAML シークレットが KMS Secrets Manager に保存されています。
name: tom
friends:
- name: lily
- name: mark次のサンプルコードに基づいて ExternalSecret を作成します。jmesPath パラメーターには次のフィールドを指定する必要があります。
path:JMESPath 仕様に基づいて、指定された YAML フィールドを解析します。このパラメーターは必須です。objectAlias:解析されたフィールドに基づいて同期される Kubernetes Secret 内のキーと値のペアのキーを指定します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: es-json-demo
spec:
provider: kms
data:
- key: {KMS シークレット名}
versionStage: {KMS シークレットバージョンステージ}
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
jmesPath: # yaml 文字列内の一部のフィールドを解析する
- path: "name"
objectAlias: "myname"
- path: "friends[0].name"
objectAlias: "friendname"YAML シークレットの自動解析
YAML シークレットのデータ構造が不明な場合でも、シークレットを解析して解析済みデータを Kubernetes Secret に保存する必要がある場合は、dataProcess.extract パラメーターを構成して YAML シークレットの自動解析を有効にできます。さらに、dataProcess.replaceRule パラメーターを構成して、解析済みデータのキーを置き換えるルールを指定できます。これにより、不規則な Secret データキーによって Kubernetes Secret の作成が失敗することを防ぎます。
たとえば、次の YAML シークレットが KMS Secrets Manager に保存されています。
/name-invalid: lily
name-invalid/:
- name: mark次のサンプルコードに基づいて ExternalSecret を作成します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: extract-secret
spec:
provider: kms
dataProcess:
- extract:
key: {KMS シークレット名}
versionStage: ACSCurrent # KMS シークレットのバージョン。
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
replaceRule: # キーを置き換えるルール。
- source: "^/.*d$" # スラッシュ (/) で始まり小文字の d で終わるキーを tom に置き換えます。
target: "tom"
- source: "^n.*/$" # 小文字の n で始まりスラッシュ (/) で終わるキーを mark に置き換えます。
target: "mark"KMS エンドポイントアドレスを構成する
専用ゲートウェイまたは共有ゲートウェイを介して KMS にアクセスしてシークレットを取得できます。次の表に、エンドポイント構成の要件を示します。KMS にアクセスするための専用ゲートウェイと共有ゲートウェイの違いの詳細については、KMS にアクセスするための共有ゲートウェイと専用ゲートウェイの違いをご参照ください。
KMS エンドポイントの優先順位ルール
タイプ | フィールド | 目的 | 優先順位 | 説明 |
シークレットレベルの構成 |
| インポートする必要がある各 KMS シークレットのエンドポイントアドレスを指定します。 | 最高 | この構成は個々のシークレットに対して優先され、グローバル構成とデフォルト構成をオーバーライドします。 |
グローバル構成 |
| すべての KMS リクエストに使用されます。 | 中 | この構成は、シークレットレベルの構成以外の他の KMS シークレットによって使用されるエンドポイントアドレスを提供します。 |
デフォルト構成 | なし | エンドポイントアドレスが構成されていない場合に使用されます。 | 最低 | デフォルトの KMS エンドポイントアドレスは |
apiVersion: "alibabacloud.com/v1alpha1"
kind: ExternalSecret
metadata:
name: esdemo
spec:
provider: kms
data:
- key: test-hangzhou # 実際のエンドポイントアドレス:グローバル構成が存在する場合はそれを使用します。それ以外の場合は、デフォルト構成:kms-vpc.{region}.aliyuncs.com を使用します
name: hangzhou-vpc
versionId: v1
- key: test-hangzhou # 実際のエンドポイントアドレス:kmsEndpoint フィールドで指定されたエンドポイントは kms.cn-hangzhou.aliyuncs.com です
name: hangzhou-public
versionId: v1
kmsEndpoint: kms.cn-hangzhou.aliyuncs.comKMS エンドポイント構成の説明
ゲートウェイタイプ | ドメインタイプ | エンドポイント | 説明 |
専用ゲートウェイ | KMS プライベートドメイン | {kms-instance-id}.cryptoservice.kms.aliyuncs.com |
|
共有ゲートウェイ | VPC ドメイン | kms-vpc.{region}.aliyuncs.com |
|
共有ゲートウェイ | パブリックドメイン | kms.{region}.aliyuncs.com |
|
参考資料
KMS シークレットから同期され ACK クラスタにキャッシュされた Kubernetes Secrets を保護するには、Secret 暗号化機能を有効にすることをお勧めします。詳細については、KMS を使用して Kubernetes Secrets を暗号化するをご参照ください。