アプリケーション レイヤでの Secret の暗号化のトラブルシューティング

アプリケーション レイヤで Secret を暗号化すると、Google Kubernetes Engine(GKE)の機密データ(認証情報や鍵など)に対して構成可能な保護レイヤが追加されます。この構成に問題があると、この追加のセキュリティ レイヤが正しく機能しないおそれがあります。

このドキュメントでは、GKE API クラスタ オブジェクトで使用可能なデバッグ フィールドを調べて、アプリケーション レイヤでの Secret の暗号化のトラブルシューティングを行う方法について説明します。これらのフィールドは、更新の失敗や Cloud KMS 鍵に関する問題などの一般的なエラーの根本原因を診断するのに役立ちます。

この情報は、GKE クラスタに保存されている機密情報の保護を担当するプラットフォーム管理者、オペレーター、セキュリティ エンジニアにとって重要です。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。

更新の失敗

アプリケーション レイヤの Secret の暗号化の暗号化構成を更新するときに、GKE は Kubernetes クラスタ内のすべての Secret オブジェクトを書き換える必要があります。GKE は、すべての Secret が新しい Cloud KMS 鍵で暗号化されるようにします。あるいは、暗号化されていない状態で書き込まれるように構成します。

この更新オペレーションは、次のいずれかの条件が原因で失敗する可能性があります。

  • 更新の進行中は、Kubernetes コントロール プレーンが一時的に使用できなくなります。
  • ユーザー定義の AdmissionWebhook により、GKE が Secret オブジェクトを更新できなくなります。
  • 更新オペレーションが完了する前に、更新された Cloud KMS 鍵または以前の Cloud KMS 鍵が無効になります。

更新オペレーションが成功するまで、更新された Cloud KMS 鍵または以前の Cloud KMS 鍵を使用しないでください。

デバッグ用のフィールド

バージョン 1.29 以降を実行している新しい GKE クラスタには、Cluster.DatabaseEncryption の更新を追跡し、障害からの復旧に役立つ追加フィールドが含まれています。

次の手順は、DatabaseEncryption.CurrentState フィールドが空でないクラスタにのみ適用されます。CurrentState フィールドが空の場合、このクラスタ バージョンでこの機能はまだ有効になっていません。

これらのフィールドには、次の上限が適用されます。

  • 出力専用です。クラスタの作成リクエストまたは更新リクエストに設定することはできません。

CurrentState フィールド

DatabaseEncryption 更新オペレーションの現在のステータスは、Cluster.DatabaseEncryptionCurrentState フィールドで確認できます。

CurrentState の値 説明

CURRENT_STATE_ENCRYPTED

CURRENT_STATE_DECRYPTED

最後の更新オペレーションは成功しました。特に対応は必要ありません。以前に使用されていた鍵は破棄できます。

CURRENT_STATE_ENCRYPTION_PENDING

CURRENT_STATE_DECRYPTION_PENDING

更新の進行中です。

CURRENT_STATE_ENCRYPTION_ERROR

CURRENT_STATE_DECRYPTION_ERROR

最後の更新でエラーが発生しました。以前に使用した Cloud KMS 鍵を無効化または破棄しないでください。GKE でまだ使用されている可能性があります。

詳細については、LastOperationErrors フィールドを参照してください。

LastOperationErrors フィールド

更新オペレーションが失敗すると、GKE コントロール プレーンのエラーが gcloud container clusters update の出力に表示されます。

失敗した 2 つの更新オペレーションのエラー メッセージも Cluster.DatabaseEncryption.LastOperationErrors で確認できます。

DecryptionKeys フィールド

新しい暗号化オペレーションに使用される Cloud KMS 鍵が DatabaseEncryption.KeyName に表示されます。通常、これはクラスタで使用される唯一の鍵です。

ただし、DatabaseEncryption.DecryptionKeys には、更新の進行中または障害発生後にクラスタによって使用される追加の鍵も含まれています。

更新が失敗した場合の復元

更新に失敗した場合は、次の手順で復元します。

  1. エラー メッセージを確認して、示されている問題に対処します。
  2. 失敗したコマンド(gcloud container clusters update ... --database-encryption-key など)を実行して、更新リクエストを再試行します。最初に送信した更新リクエストを再試行するか、クラスタを以前の状態に戻して更新することをおすすめします。GKE が 1 つ以上の Secret を読み取れない場合、別の鍵または暗号化状態に移行できないことがあります。

以降のセクションでは、エラーの一般的な原因について説明します。

Cloud KMS 鍵のエラー

エラー メッセージに 1 つ以上の Cloud KMS 鍵への参照が含まれている場合は、Cloud KMS 鍵の構成を調べて、関連する鍵のバージョンが使用可能であることを確認します。

Cloud KMS 鍵が無効化または破棄されたことを示すエラーが発生した場合は、鍵または鍵バージョンを再度有効にします。

エラー: アプリケーション レベルの暗号化用に構成された CloudKMS 鍵を使用できない

次のエラー メッセージは、GKE のデフォルトのサービス アカウントが Cloud KMS 鍵にアクセスできない場合に発生します。

Cluster problem detected (Kubernetes Engine Service Agent account unable to use CloudKMS key configured for Application Level encryption).

この問題を解決するには、無効にした鍵を再度有効にします

Secret を更新できない

Kubernetes API がアドミッション Webhook により更新リクエストを拒否した場合、次のエラーが発生することがあります。

error admission webhook WEBHOOK_NAME denied the request

このエラーを解決するには、Webhook を削除するか、鍵の更新時に GKE がすべての Namespace の Secret を更新できるように変更します。

エラー: Namespace が管理されている

Autopilot クラスタで、kube-system などの GKE マネージド Namespace にある Secret を再暗号化しようとすると、次のエラーが発生します。次のようなエラー メッセージが表示されます。

Error from server (Forbidden): secrets "alertmanager" is
forbidden: User cannot patch resource "secrets" in API group "" in the namespace "gke-gmp-system":
GKE Warden authz [denied by managed-namespaces-limitation]: the namespace "gke-gmp-system"
is managed and the request's verb "patch" is denied'

GKE Autopilot クラスタでは、マネージド Namespace 内の Secret などの Kubernetes リソースを変更できません。

このエラーの解決方法は次のとおりです。

  • kubectl コマンドを使用して Secret を再暗号化する場合は、--namespace フラグを使用して、管理する Namespace にコマンドのスコープを設定します。
  • CronJob を使用して Secret を再暗号化する場合は、管理している Namespace にのみデプロイします。

次のステップ

  • このドキュメントで問題を解決できない場合は、サポートを受けるで、次のトピックに関するアドバイスなど、詳細なヘルプをご覧ください。