ack-secret-manager を使用すると、CloudOps Orchestration Service (OOS) から Container Service for Kubernetes (ACK) クラスターに暗号化パラメータを Kubernetes Secrets としてインポートまたは同期できます。Kubernetes Secrets は、クラスター内の機密情報を保存するために使用されます。このコンポーネントを使用すると、OOS から ACK クラスターへの暗号化パラメータの同期を自動化できます。このようにして、クラスター内のアプリケーションは、ファイルシステムを使用して指定された Secrets をマウントし、最新の OOS 暗号化パラメータを使用できます。これは、アプリケーションと OOS 暗号化パラメータ間の互換性の向上に役立ちます。
セキュリティに関する注意事項
ほとんどの場合、アプリケーションはファイルシステムから直接シークレットを読み取ります。アプリケーションと OOS 暗号化パラメータの間には互換性の問題が存在する可能性があります。ack-secret-manager コンポーネントは、互換性の問題を解決できます。また、このコンポーネントを使用して、OOS から ACK クラスターの Kubernetes Secrets に暗号化パラメータを同期することもできます。その後、Kubernetes Secrets を環境変数としてマウントして使用できます。このコンポーネントを使用する前に、以下のセキュリティリスクを評価してください。
クラスター内のシークレットがファイルシステムを介してアクセス可能な場合、攻撃者はアプリケーションの Common Vulnerabilities and Exposures (CVE) 脆弱性を悪用して、クラスター内のディレクトリを走査する可能性があります。その結果、シークレットが漏洩する可能性があります。
デバッグのブレークポイントまたはログ権限の誤設定により、認証情報の漏洩につながる可能性があるため、環境変数を参照してシークレットを使用することは安全ではなく、推奨されません。
シークレットの同期を有効にする場合は、最小権限の原則に厳密に従ってアクセス権限を制限してください。
アプリケーションでシークレットを永続化する必要がない場合は、RRSA を使用して異なるポッドに異なるクラウドサービスへのアクセスを承認するを参照して、ポッドに最小限のアクセス権限を付与することをお勧めします。次に、GetSecretParameter を参照して、アプリケーションが API 操作を呼び出して暗号化パラメータを直接取得するように構成します。これにより、ポッドファイルシステムまたは Kubernetes Secrets で暗号化パラメータが公開される可能性が低くなります。
前提条件
使用する OOS サービスと同じリージョンに ACK クラスターが作成されていること。ACK マネージドクラスター、ACK 専用クラスター、登録済みクラスター、または ACK Serverless クラスター を作成できます。詳細については、ACK マネージドクラスターを作成する、ACK One 登録済みクラスターを作成する、および ACK Serverless クラスターを作成する を参照してください。
OOS 暗号化パラメータが作成されていること。詳細については、暗号化パラメータを作成する および CreateSecretParameter を参照してください。
クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続していること。詳細については、クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する を参照してください。
ステップ 1: ack-secret-manager をインストールする
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。クラスター詳細ページの左側のペインで、 を選択します。
[Helm] ページで、[デプロイ] をクリックします。[デプロイ] パネルの [Chart] セクションで、[ack-secret-manager] を見つけて選択し、その他のパラメーターにはデフォルト値を使用し、[次へ] をクリックします。
確認メッセージに表示される情報は、コンポーネントがデフォルトで kube-system 名前空間にインストールされ、デフォルトのアプリケーション名がコンポーネント名として使用されることを示しています。 [はい] をクリックします。カスタムアプリケーションとカスタム名前空間を使用する場合は、[基本情報] ステップで [アプリケーション名] パラメーターと [名前空間] パラメーターを設定します。
[パラメーター] ステップで、最新のチャートバージョンを選択し、その他のパラメーターを設定して、[OK] をクリックします。
サービスアカウントの RAM ロール (RRSA) を認証に使用する場合、[true] に rrsa.enable パラメーターを設定します。
暗号化パラメーターのスケジュールされた同期を有効にする場合は、次の図に示すパラメーターを構成します。
command.disablePolling: 暗号化パラメーターの自動回転機能を有効にするかどうかを指定します。暗号化パラメーターの自動回転機能を有効にするには、値を [false] に設定します。command.pollingInterval: 暗号化パラメーターを同期する頻度を指定します。この例では、このパラメーターは [120] 秒に設定されており、暗号化パラメーターが 2 分ごとに同期されることを指定しています。必要に応じて値を調整できます。
調整パラメーターの構成: クラスタに多数の ExternalSecrets (同期される OOS 暗号化パラメーター) がある場合、不適切な構成によって OOS または RAM で調整が発生する可能性があります。そのため、調整を回避するには、次の調整パラメーターを構成する必要があります。
command.maxConcurrentOosSecretPulls: 1 秒あたりに同期できる OOS 暗号化パラメーターの最大数を指定します。デフォルト値: 10。
コンポーネントをインストールすると、[ack-secret-manager] ページにリダイレクトされます。コンポーネントがインストールされているかどうかを確認できます。次の図に示すリソースが作成されている場合、コンポーネントはインストールされています。
ステップ 2: ack-secret-manager に OOS 暗号化パラメータへのアクセスを承認する
ack-secret-manager が OOS 暗号化パラメータにアクセスできるようにするには、SecretStore を作成する必要があります。そうしないと、ack-secret-manager は OOS から ACK クラスターに暗号化パラメータをインポートまたは同期できません。次の方法を使用して、ack-secret-manager に OOS 暗号化パラメータへのアクセスを承認できます。
RRSA を使用して権限を付与する: この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスター および ACK Serverless クラスター に適用されます。
クラスターのワーカー RAM ロールに権限を付与する: この方法は、ACK マネージドクラスター、ACK 専用クラスター、および 登録済みクラスター に適用されます。
RAM ロールを偽装するために使用する AccessKey ペアを指定する: この方法は、すべてのタイプの ACK クラスターに適用されます。
RRSA を使用して権限を付与する
この方法は、Kubernetes 1.22 以降を実行する ACK マネージドクラスター および ACK Serverless クラスター に適用されます。他の承認方法と比較して、RRSA はポッドの権限を分離し、AccessKey ID と AccessKey シークレットの使用によって引き起こされるシークレット漏洩のリスクを回避できます。
ACK コンソール で ACK クラスターの RRSA 機能を有効にします。詳細については、RRSA を有効にする を参照してください。
説明ack-secret-manager をインストールするときに、rrsa.enable パラメータを [true] に設定して RRSA を有効にします。
信頼できるエンティティが ack-secret-manager の ID プロバイダー (IdP) である RAM ロールを作成します。次の表に主要なパラメータを示します。詳細については、OIDC IdP の RAM ロールを作成する を参照してください。
パラメータ
説明
ID プロバイダータイプ
[OIDC] を選択します。
ID プロバイダー
ack-rrsa-<cluster_id> 形式で名前が付けられた ID プロバイダーを選択します。<cluster_id> はクラスターの ID を示します。
条件
oidc:iss: デフォルト値を使用します。
oidc:aud: デフォルト値を使用します。
oidc:sub: 1 つ以上の条件を手動で追加します。
キー: [oidc:sub] を選択します。
演算子: [StringEquals] を選択します。
値: system:serviceaccount:<namespace>:<serviceAccountName> と入力します。
<namespace>: アプリケーションの名前空間を指定します。説明ack-secret-manager を別の名前空間にインストールした場合は、
kube-systemを実際の名前空間に置き換えます。<serviceAccountName>: サービスアカウントの名前を指定します。この例では、system:serviceaccount:rrsa-demo:demo-sa と入力します。
カスタム RAM ポリシーを作成し、RAM ロールにポリシーをアタッチします。
ack-secret-manager を使用して OOS 暗号化パラメーターをインポートする際に必要なポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。詳細については、「カスタムポリシーを作成する」をご参照ください。
{ "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }RAM ロールにポリシーをアタッチします。 詳細については、「RAM ロールに権限を付与する」をご参照ください。
SecretStore を作成して、認証方式を指定します。
以下の説明に基づいて、次のコードブロックを修正します。次に、修正したコードブロックに基づいて、secretstore-rrsa.yaml という名前のファイルを作成します。
{accountID}: この値を、OOS 暗号化パラメータの同期に使用する Alibaba Cloud アカウントの ID に置き換えます。{clusterID}: この値をクラスターの ID に置き換えます。{roleName}: この値を手順 2で作成した RAM ロールの名前に置き換えます。
次のコマンドを実行して、SecretStore を作成します。
apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-rrsa spec: OOS: OOSAuth: oidcProviderARN: "acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{accountID}:role/{roleName}"kubectl apply -f secretstore-rrsa.yaml
クラスターのワーカー RAM ロールに権限を付与する
この方法は、ACK マネージドクラスター、ACK 専用クラスター、および 登録済みクラスター に適用されます。ACK Serverless クラスターにはワーカー RAM ロールが割り当てられていないため、この方法は ACK Serverless クラスター には適用されません。
次のコードブロックに基づいてカスタム RAM ポリシーを作成します。詳細については、カスタムポリシーを作成する を参照してください。
カスタムポリシーをクラスターのワーカー RAM ロールにアタッチします。詳細については、「[製品の変更] ACK マネージドクラスターのワーカー RAM ロールの権限が取り消されました」トピックの ステップ 2: カスタムポリシーをワーカー RAM ロールにアタッチする セクションを参照してください。
{
"Action": [
"oos:GetSecretParameter", // OOS からシークレットパラメータを取得するアクション
"kms:GetSecretValue" // KMS からシークレット値を取得するアクション
],
"Resource": [
"*" // すべてのリソース
],
"Effect": "Allow" // 許可
}
RAM ロールを偽装するために使用する AccessKey ペアを指定する
この方法は、すべてのタイプの ACK クラスターに適用されます。
信頼できるエンティティが ack-secret-manager の Alibaba Cloud アカウントである RAM ロールを作成します。RAM ロールの作成方法については、信頼できる Alibaba Cloud アカウントの RAM ロールを作成する を参照してください。
カスタム RAM ポリシーを作成し、前のステップで作成した RAM ロールにポリシーをアタッチします。
OOS 暗号化パラメーターにアクセスするために必要なポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。 詳細については、「カスタムポリシーを作成する」をご参照ください。
前のステップで作成した RAM ロールにポリシーをアタッチします。 詳細については、「RAM ロールに権限を付与する」をご参照ください。
{ "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 ロールの Amazon リソースネーム (ARN)。 } ], "Version": "1" }使用する RAM ユーザーの AccessKey ペアを保存する Secret を作成します。
次のコードブロックの AccessKey ペアを、Base64 でエンコードされた実際の AccessKey ペアに置き換えます。 その後、変更したコードブロックに基づいて ramuser.yaml という名前のファイルを作成します。
apiVersion: v1 data: accessKey: {AccessKey ID encoded in Base64} # Base64 でエンコードされた AccessKey ID accessKeySecret: {AccessKey secret encoded in Base64} # Base64 でエンコードされた AccessKey シークレット kind: Secret metadata: name: ramuser namespace: kube-system type: Opaque次のコマンドを実行して、ramuser シークレットを作成します。
kubectl apply -f ramuser.yaml
SecretStore を作成して認証方式を指定します。
次の説明に基づいて、次のコードブロックを変更します。次に、変更したコードブロックに基づいて、secretstore-ramrole.yaml という名前のファイルを作成します。
{accountID}: 値を、OOS 暗号化パラメータの同期に使用する Alibaba Cloud アカウントの ID に置き換えます。{roleName}: 値を、手順 1 で作成した RAM ロールの名前に置き換えます。{secretName}: 値を、AccessKey ペアを格納するシークレットの名前に置き換えます。{secretNamespace}: 値を、AccessKey ペアを格納するシークレットの名前空間に置き換えます。{secretKey}: 値を、AccessKey ペアを格納するシークレットのキーに置き換えます。{roleSessionName}: 値をロールセッションの名前に置き換えます。カスタム文字列を指定できます。
次のコマンドを実行して、SecretStore を作成します。
apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-ramrole spec: OOS: OOSAuth: accessKey: name: {secretName} namespace: {secretNamespace} key: {secretKey} accessKeySecret: name: {secretName} namespace: {secretNamespace} key: {secretKey} ramRoleARN: "acs:ram::{accountID}:role/{roleName}" ramRoleSessionName: {roleSessionName}kubectl apply -f secretstore-ramrole.yaml
ステップ 3: 同期詳細を指定する
認証情報が構成された後、ExternalSecret を使用してアクセスされる OOS 暗号化パラメーターを構成する必要があります。 これにより、OOS 暗号化パラメーターを Kubernetes Secret にインポートできます。
OOS 暗号化パラメーターによってインポートされた Kubernetes Secret の名前空間と名前は、ExternalSecret の名前空間と名前と同じである必要があります。
ExternalSecret を作成します。
次の説明に基づいて、次のコードブロックを変更します。 次に、変更したコードブロックに基づいて external.yaml という名前のファイルを作成します。
パラメーター
説明
{OOS パラメーター名}必須。 値を目的の OOS 暗号化パラメーターの名前に置き換えます。
{Kubernetes シークレットキー}必須。 キーと値のペアのコレクション。 単一の OOS 暗号化パラメーターは、Kubernetes Secret 内の特定のキーと値のペアに格納されます。
{Kubernetes シークレットキー}を目的のキーと値のペアのキーに置き換える必要があります。{シークレットストア名}オプション。 作成した
SecretStoreの名前に値を置き換えます。 SecretStore は、ack-secret-manager が OOS 暗号化パラメーターにアクセスすることを承認するために使用されます。説明コンポーネントがワーカー RAM ロールによって承認されている場合は、このパラメーターを空のままにすることができます。
{シークレットストアの名前空間}オプション。 作成した
SecretStoreの名前空間に値を置き換えます。説明コンポーネントがワーカー RAM ロールによって承認されている場合は、このパラメーターを空のままにすることができます。
apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: esdemo spec: provider: oos # 同期する Alibaba Cloud サービスの種類。 デフォルト値は kms です。 OOS 暗号化パラメーターを同期する場合は、値を oos に設定する必要があります。 data: # データソースに追加の構成は必要ありません。 - key: {OOS パラメーター名} name: {Kubernetes シークレットキー} secretStoreRef: # コンポーネントがワーカー RAM ロールによって承認されている場合は、このパラメーターを空のままにすることができます。 name: {シークレットストア名} namespace: {シークレットストアの名前空間}次のコマンドを実行して、ExternalSecret を作成します。
kubectl apply -f external.yaml
次のコマンドを実行して、Kubernetes Secret が作成されたかどうかを確認します。
kubectl get secret esdemoKubernetes Secret が作成されると、暗号化パラメーターは OOS からクラスターに同期されます。
高度な ack-secret-manager 構成
クロスアカウント暗号化パラメーター同期
OOS インスタンスとクラスターが同じ Alibaba Cloud アカウントに属していない場合は、アカウント間で OOS 暗号化パラメーターをクラスターに同期する必要があります。ack-secret-manager はクロスアカウント暗号化パラメーター同期をサポートしています。次の例は、RRSA 機能を使用して、Alibaba Cloud アカウント A から Alibaba Cloud アカウント B に属する ACK クラスターに OOS 暗号化パラメーターをインポートする方法を示しています。
Alibaba Cloud アカウント A の構成
Alibaba Cloud アカウント A を使用して、信頼できるエンティティが Alibaba Cloud アカウント B である RAM ロールを作成します。詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
重要信頼できる Alibaba Cloud アカウントを選択するときは、[その他の Alibaba Cloud アカウント] を選択し、Alibaba Cloud アカウント B の ID を入力します。
OOS 暗号化パラメーターにアクセスするために必要なポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。詳細については、「カスタムポリシーを作成する」をご参照ください。
{ "Action": [ "oos:GetSecretParameter", "kms:GetSecretValue" ], "Resource": [ "*" ], "Effect": "Allow" }ポリシーを RAM ロールにアタッチします。詳細については、「RAM ロールに権限を付与する」をご参照ください。
Alibaba Cloud アカウント B の構成
ACK コンソール で ACK クラスターの RRSA 機能を有効にします。詳細については、「RRSA を有効にする」をご参照ください。
説明ack-secret-manager をインストールするときは、rrsa.enable パラメーターを [true] に設定して RRSA を有効にします。
ack-secret-manager の ID プロバイダー (IdP) を信頼できるエンティティとする RAM ロールを作成します。次の表は、主要なパラメーターについて説明しています。詳細については、「OIDC IdP の RAM ロールを作成する」をご参照ください。
パラメーター
説明
ID プロバイダータイプ
[OIDC] を選択します。
ID プロバイダー
ack-rrsa-<cluster_id> 形式の名前の ID プロバイダーを選択します。<cluster_id> はクラスターの ID を示します。
条件
oidc:iss: デフォルト値を使用します。
oidc:aud: デフォルト値を使用します。
oidc:sub: 1 つ以上の条件を手動で追加します。
[キー]: [oidc:sub] を選択します。
[演算子]: [StringEquals] を選択します。
[値]: system:serviceaccount:<namespace>:<serviceAccountName> と入力します。
<namespace>: アプリケーションの名前空間を指定します。説明ack-secret-manager を別の名前空間にインストールした場合は、
kube-systemを実際の名前空間に置き換えます。<serviceAccountName>: サービスアカウントの名前を指定します。この例では、system:serviceaccount:rrsa-demo:demo-sa と入力します。
カスタム RAM ポリシーを作成し、前の手順で Alibaba Cloud アカウント B を使用して作成した RAM ロールにアタッチします。
ack-secret-manager を使用して OOS 暗号化パラメーターをインポートするときに必要なポリシーを作成します。
次のコードブロックは、ポリシーの内容を示しています。
Resourceを、Alibaba Cloud アカウント A を使用して作成した RAM ロールの ARN に設定します。詳細については、「カスタムポリシーを作成する」をご参照ください。{ "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>: Key Management Service (KMS) インスタンスが配置されているアカウント A の ID。<role-name>: アカウント A で作成された RAM ロールの名前。
RAM ロールの ARN を表示するには、「RAM ロールの ARN を表示する方法」をご参照ください。
前のステップでAlibaba Cloudアカウント Bを使用して作成したRAM ロールにポリシーをアタッチします。 詳細については、「RAM ロールに権限を付与する」をご参照ください。
SecretStore を作成します。
次の説明に基づいて、次のコードブロックを変更します。次に、変更したコードブロックに基づいて secretstore-ramrole.yaml という名前のファイルを作成します。
{ACK-accountID}: 値を Alibaba Cloud アカウント B の ID に置き換えます。{clusterID}: 値をクラスターの ID に置き換えます。{ACK-roleName}: 値を Alibaba Cloud アカウント B を使用して作成した RAM ロールの名前に置き換えます。{OOS-accountID}: 値を Alibaba Cloud アカウント A の ID に置き換えます。{OOS-roleName}: 値を Alibaba Cloud アカウント A を使用して作成した RAM ロールの名前に置き換えます。{roleSessionName}: 値をロールセッションの名前に置き換えます。カスタム文字列を指定できます。
apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-cross-account spec: OOS: OOSAuth: oidcProviderARN: "acs:ram::{ACK-accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{ACK-accountID}:role/{ACK-roleName}" remoteRamRoleARN: "acs:ram::{OOS-accountID}:role/{OOS-roleName}" remoteRamRoleSessionName: {roleSessionName}同期の詳細を指定します。詳細については、「手順 3: 同期の詳細を指定する」をご参照ください。
暗号化パラメーターの解析とキーの置き換え
次のセクションでは、JSON/YAML シークレットで指定されたキーを解析する方法について説明します。
JSON 形式の暗号化パラメーターを解析する
JSON シークレットで指定されたキーを解析する
JSON 形式の OOS シークレットを解析し、OOS シークレットから Kubernetes シークレットに指定されたキーと値のペアを同期するには、jmesPath パラメーターを構成します。たとえば、次の JSON シークレットが OOS 暗号化パラメーターに保存されているとします。
{"name":"tom","friends":[{"name":"lily"},{"name":"mark"}]}次のサンプルコードに基づいて ExternalSecret を作成します。jmesPath パラメーターで次のフィールドを指定する必要があります。
path: JMESPath 仕様に基づいて、指定された JSON フィールドを解析します。このパラメーターは必須です。objectAlias: 解析されたフィールドに基づいて同期される Kubernetes シークレットのキーと値のペアのキーを指定します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: es-json-demo
spec:
provider: oos
data:
- key: {OOS パラメーター名}
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
jmesPath: # json 文字列の一部のフィールドを解析する
- path: "name"
objectAlias: "myname"
- path: "friends[0].name"
objectAlias: "friendname"JSON シークレットの自動解析
JSON 暗号化パラメーターのデータ構造が不明な場合でも、暗号化パラメーターを解析して解析済みデータを Kubernetes シークレットに保存する必要がある場合は、dataProcess.extract パラメーターを構成して JSON の自動解析を有効にできます。さらに、dataProcess.replaceRule パラメーターを構成して、解析済みデータのキーを置き換えるルールを指定できます。これにより、不規則なシークレットデータキーによって Kubernetes シークレットの作成が失敗することを防ぎます。
たとえば、次の JSON シークレットが OOS 暗号化パラメーターに保存されているとします。
{"/name-invalid":"lily","name-invalid/":[{"name":"mark"}]}次のサンプルコードに基づいて ExternalSecret を作成します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: extract-secret
spec:
provider: oos
dataProcess:
- extract:
key: {OOS パラメーター名}
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
replaceRule: # キーを置き換えるルール。
- source: "^/.*d$" # スラッシュ (/) で始まり小文字の d で終わるキーを tom に置き換えます。
target: "tom"
- source: "^n.*/$" # 小文字の n で始まりスラッシュ (/) で終わるキーを mark に置き換えます。
target: "mark"YAML 形式の暗号化パラメーターを解析する
YAML シークレットで指定されたキーを解析する
YAML 形式の OOS シークレットを解析し、OOS シークレットから Kubernetes シークレットに指定されたキーと値のペアを同期するには、jmesPath パラメーターを構成します。たとえば、次の YAML シークレットが OOS 暗号化パラメーターに保存されているとします。
name: tom
friends:
- name: lily
- name: mark次のサンプルコードに基づいて ExternalSecret を作成します。jmesPath パラメーターで次のフィールドを指定する必要があります。
path: JMESPath 仕様に基づいて、指定された YAML フィールドを解析します。このパラメーターは必須です。objectAlias: 解析されたフィールドに基づいて同期される Kubernetes シークレットのキーと値のペアのキーを指定します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: es-json-demo
spec:
provider: oos
data:
- key: {OOS パラメーター名}
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
jmesPath: # yaml 文字列の一部のフィールドを解析する
- path: "name"
objectAlias: "myname"
- path: "friends[0].name"
objectAlias: "friendname"YAML シークレットの自動解析
YAML 暗号化パラメーターのデータ構造が不明な場合でも、暗号化パラメーターを解析して解析済みデータを Kubernetes シークレットに保存する必要がある場合は、dataProcess.extract パラメーターを構成して YAML の自動解析を有効にできます。さらに、dataProcess.replaceRule パラメーターを構成して、解析済みデータのキーを置き換えるルールを指定できます。これにより、不規則なシークレットデータキーによって Kubernetes シークレットの作成が失敗することを防ぎます。
たとえば、次の YAML シークレットが OOS 暗号化パラメーターに保存されているとします。
/name-invalid: lily
name-invalid/:
- name: mark次のサンプルコードに基づいて ExternalSecret を作成します。
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: extract-secret
spec:
provider: oos
dataProcess:
- extract:
key: {OOS パラメーター名}
secretStoreRef:
name: {シークレットストア名}
namespace: {シークレットストアの名前空間}
replaceRule: # キーを置き換えるルール。
- source: "^/.*d$" # スラッシュ (/) で始まり小文字の d で終わるキーを tom に置き換えます。
target: "tom"
- source: "^n.*/$" # 小文字の n で始まりスラッシュ (/) で終わるキーを mark に置き換えます。
target: "mark"参考資料
OOS シークレットから同期され、ACK クラスタにキャッシュされている Kubernetes シークレットを保護するために、シークレット暗号化機能を有効にすることをお勧めします。詳細については、「KMS を使用して Kubernetes シークレットを暗号化する」をご参照ください。