このページでは、ログを使用して、Google Kubernetes Engine(GKE)クラスタ コントロール プレーンによる Kubernetes ID(証明書とサービス アカウント トークンの形式)の発行と使用を確認する方法について説明します。この検証は完全に任意であり、コントロール プレーンの保護に必要ではありません。
このガイドは、認証情報の発行と署名を制御するために組織のコンプライアンス要件またはポリシー要件があるセキュリティ管理者とプラットフォーム オーナーを対象としています。GKE control plane authority でセルフマネージド鍵と CA を設定している必要があります。
次のコンセプトに精通している必要があります。
このページでは、GKE におけるオプションのコントロール プレーン機能について説明します。これらの機能を使用すると、コントロール プレーンのセキュリティ ポスチャーを確認する、ユーザーが管理する鍵を使用してコントロール プレーンでの暗号化と認証情報の署名を構成するといったタスクを行えます。詳細については、control plane authority についてをご覧ください。
デフォルトでは、Google Cloud はマネージド コントロール プレーンにさまざまなセキュリティ対策を適用します。このページでは、コントロール プレーンの可視性と制御性をさらに高めるオプション機能について説明します。
ID 発行ログについて
GKE ID 発行ログは、コントロール プレーンが認証情報を発行したときと、それらの認証情報がクラスタで使用されたときを記録するコントロール プレーンの監査ログです。これらのログを使用して、ID 発行ログを Cloud KMS、Certificate Authority Service、Kubernetes API ログと関連付けることで、認証情報の有効期間(発行と使用を含む)を追跡できます。GKE control plane authority を使用すると、GKE ID 発行ログが有効になります。これらのログは、次のタイプの認証情報の発行と使用を追跡します。
- X.509 証明書
- クラスタ JSON Web Token(JWT)
X.509 証明書
Kubernetes は、クライアント証明書認証に X.509 証明書を使用します。証明書を発行するために、Kubernetes コントロール プレーンは、承認済みの CertificateSigningRequest を CA Service の認証局(CA)に送信します。CA は、Cloud KMS 内の対応する鍵を使用して証明書を発行し、証明書ダイジェストに署名します。
Kubernetes API サーバーログには、証明書で認証された Kubernetes API 呼び出しの証明書署名の詳細が含まれています。ログの認証情報 ID エントリの形式は次のとおりです。
"authentication.k8s.io/credential-id": "X509SHA256=CERTIFICATE_HASH"
CERTIFICATE_HASH
値は証明書の SHA256 ハッシュです。証明書のライフサイクルをトレースするために使用できます。
Kubernetes API サーバー証明書ログを使用して、次のサービスのログを関連付けることで、証明書のライフサイクルをトレースできます。
- GKE ID 発行ログ:
protoPayload.metadata.credentialId
クエリを使用して、Kubernetes API サーバーログの認証情報 ID に基づいて特定の GKE ID 発行ログを見つけます。次に、GKE ID 発行ログのprotoPayload.metadata.certificateFingerprint
フィールドを使用して、ID 発行ログと CA Service ログを関連付けます。 - CA Service ログ: 証明書発行ログエントリを見つけます。このエントリには次の ID が含まれています。
cert_fingerprint.sha256_hash
: 署名付き証明書の SHA256 ハッシュ。この ID を使用して、ログを GKE と Kubernetes API イベントと照合します。tbs_certificate_digest
: Cloud KMS 鍵で署名するために送信された証明書の内容のハッシュ。この ID を使用して、ログを Cloud KMS ログと照合します。
- Cloud KMS 署名ログ: CA Service ログの
tbs_certificate_digest
値を使用して、想定される Cloud KMS 鍵が証明書に署名したことを確認します。
JSON Web Token(JWT)
署名付き JWT(JSON Web Token)は、Kubernetes API へのリクエストの認証時に、Kubernetes サービス アカウントなどのクラスタ内のエンティティの署名なしトークンとして使用されます。特定のサービス アカウントを使用する Pod が作成されると、Kubernetes は JWT を作成し、Pod にマウントします。GKE control plane authority を使用して独自の鍵と CA を実行する場合、この JWT は署名され、後で Cloud KMS のサービス アカウント署名鍵を使用して検証されます。
Kubernetes API サーバーログには、JWT で認証された Kubernetes API 呼び出しのトークン署名の詳細が含まれています。ログ内のトークン署名エントリの形式は次のとおりです。
"authentication.kubernetes.io/credential-id":"JTI=JWT_ID"
JWT_ID
値は、Kubernetes API 呼び出しで使用された JWT を識別する文字列です。
Kubernetes API サーバーログの JWT ID を使用して、次のログを関連付けることで、JWT のライフサイクルをトレースできます。
- GKE ID 発行ログ: Kubernetes API サーバーログの JWT ID を使用して、特定の JWT 発行エントリを見つけます。各エントリには
toBeSignedDigest
フィールドも含まれ、その値は Cloud KMS ログと一致する場合があります。 - Cloud KMS 署名ログ: GKE ID 発行ログの
toBeSignedDigest
フィールドの値を使用して、想定される Cloud KMS 鍵が JWT に署名したことを確認します。
料金
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
次の Cloud Audit Logging Service API を有効にします。
必要なロール
ID 発行ログにアクセスするために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Logging のすべての操作を行う: Logging 管理者(
roles/logging.admin
)。 -
ログを表示する: プライベート ログ閲覧者(
roles/logging.privateLogViewer
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
要件と制限事項
次の要件と制限事項が適用されます。
- GKE バージョン 1.31.1-gke.1846000 以降を使用する必要があります。
- ID 発行ログは Cloud Audit Logs ログとして記録され、保持期間は 400 日間に設定されています。保持期間は構成できませんが、システム イベント監査ログを他の宛先に転送して、保持期間を長くできます。
証明書を確認する
GKE control plane authority の認証情報発行ログを使用して、証明書が正常に発行または使用されたことを確認できます。証明書の発行と使用に関する情報を確認するには、次のいずれかのログ、またはログの組み合わせを使用します。
証明書ログ |
|
---|---|
証明書の使用に関する Kubernetes API ログ |
Kubernetes API に対して証明書が使用されるたびに、証明書署名の詳細がログに記録されます。 |
証明書発行オペレーションの GKE ログ |
すべての証明書発行オペレーションをシステム イベント監査ログとしてログに記録します。これらのログは、GKE control plane authority のユーザーが管理する鍵または CA を使用するクラスタでデフォルトで有効になっています。 |
CA Service の監査ログ |
証明書が発行されるたびにエントリを記録します。 |
Cloud KMS 監査ログ |
CA Service からの署名リクエストに応答して、ダイジェストが署名されるたびにエントリをログに記録します。 |
Kubernetes API ログで証明書の使用状況を確認する
証明書を使用して認証された API 呼び出しのログエントリを検索する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
log_id("cloudaudit.googleapis.com/activity") resource.type="k8s_cluster" labels."authentication.kubernetes.io/credential-id":"X509SHA256="
[クエリを実行] をクリックします。
このクエリは、関連する X.509 証明書を持つすべての Kubernetes API サーバーログを返します。セキュリティ ツールを使用するか、ログを手動で確認して、調査する特定のログエントリを見つけます。
これらのログを他のログタイプと関連付けるには、次のフィールドを見つけます。
"authentication.k8s.io/credential-id":"CREDENTIAL_ID"
CREDENTIAL_ID
値は、GKE、CA Service、Cloud KMS のログを関連付けるために使用できる ID です。CREDENTIAL_ID
の形式は "X509SHA256=CERTIFICATE_HASH"
です。
GKE ログで証明書の発行を確認する
証明書発行イベントの GKE ログエントリを確認する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event" resource.type="gke_cluster" protoPayload.serviceName="container.googleapis.com" protoPayload.metadata.credentialId="CREDENTIAL_ID"
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。CREDENTIAL_ID
: Kubernetes API ログで証明書の使用状況を確認するセクションのCREDENTIAL_ID
。
[クエリを実行] をクリックします。
CA Service ログで証明書の発行を確認する
GKE 証明書発行イベントに一致する CA Service ログを検索する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
resource.type="audited_resource" protoPayload.serviceName="privateca.googleapis.com" protoPayload.methodName="google.cloud.security.privateca.v1.CertificateAuthorityService.CreateCertificate" protoPayload.response.certificate_description.cert_fingerprint.sha256_hash="CERTIFICATE_HASH"
CERTIFICATE_HASH
は、Kubernetes API ログで証明書の使用状況を確認するセクションのCERTIFICATE_HASH
に置き換えます。ハッシュからX509SHA256=
接頭辞を省略してください。[クエリを実行] をクリックします。
このクエリは、証明書の説明レスポンス セクションに
tbs_certificate_digest: DIGEST_VALUE
フィールドを含むログを返します。
DIGEST_VALUE
を使用すると、証明書の Cloud KMS 署名ログを照合できます。
Cloud KMS 署名ログで証明書の発行を確認する
CA Service 証明書発行イベントの Cloud KMS 署名イベントを確認する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
protoPayload.request.digest.sha256="DIGEST_VALUE" protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" protoPayload.methodName="AsymmetricSign" protoPayload.serviceName="cloudkms.googleapis.com"
DIGEST_VALUE
は、CA Service ログで証明書の発行を確認するセクションのダイジェスト値に置き換えます。[クエリを実行] をクリックします。
このクエリは、証明書発行イベントのログを返します。Cloud KMS ログでは証明書と JWT が区別されないため、両方のログエントリは同じになります。
トークンを検証する
GKE control plane authority の認証情報発行ログと Cloud KMS 署名ログを使用して、JSON Web Token(JWT)が正常に発行されたことを確認できます。
トークン発行イベントのトレースを開始するには、通常、サービス アカウント アクティビティの Kubernetes API ログをモニタリングします。詳細な調査が必要なアクティビティ ログを特定したら、次のログを使用して認証情報の発行と使用に関する情報を確認できます。
JWT ログ |
|
---|---|
JWT 使用の Kubernetes API ログ |
Kubernetes API に対して JWT が使用されるたびに、JWT 署名の詳細をログに記録します。 |
JWT 発行オペレーションの GKE ログ |
すべてのトークン発行オペレーションをシステム イベント監査ログとしてログに記録します。これらのログは、GKE control plane authority のユーザー管理鍵または CA を使用するクラスタでデフォルトで有効になっています。 |
Cloud KMS 監査ログ |
トークンが署名されて発行されるたびにエントリをログに記録します。 |
Kubernetes API サーバーログでトークンの使用状況を確認する
トークン使用イベントのログエントリを検索する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
log_id("cloudaudit.googleapis.com/activity") resource.type="k8s_cluster" labels."authentication.kubernetes.io/credential-id":"JTI="
[クエリを実行] をクリックします。
このクエリは、JWT が関連付けられているすべての Kubernetes API サーバーログを返します。セキュリティ ツールを使用するか、ログを手動で確認して、調査する特定のログエントリを見つけます。
これらのログを他のログタイプと関連付けるには、次のフィールドを見つけます。
"authentication.k8s.io/credential-id": "JTI=JWT_ID"
JWT_ID
は、GKE と Cloud KMS のログを関連付けるために使用できるトークン ID です。
GKE ログでトークンの発行を確認する
トークン発行イベントのログエントリを検索する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
resource.type="gke_cluster" logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event" protoPayload.methodName="google.cloud.gkeauth.v1.Auth.SignServiceAccountJWT" protoPayload.metadata.credentialId="JTI=JWT_ID"
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。JWT_ID
: Kubernetes API サーバーログでトークンの使用状況を確認するセクションの JWT ID。
[クエリを実行] をクリックします。
このクエリは、
toBeSignedDigest
フィールドを含むログを返します。
toBeSignedDigest
値を使用して、Cloud KMS 署名イベントを見つけることができます。
Cloud KMS 署名ログを使用してトークンの発行を確認する
署名付きダイジェストのログエントリを検索する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
クエリエディタのフィールドに次の式を貼り付けます。
protoPayload.request.digest.sha256="DIGEST_VALUE" protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" protoPayload.methodName="AsymmetricSign" protoPayload.serviceName="cloudkms.googleapis.com"
DIGEST_VALUE
は、GKE ログでトークン発行を確認するセクションのtoBeSignedDigest
フィールドの値に置き換えます。[クエリを実行] をクリックします。
このクエリは、証明書発行イベントのログを返します。Cloud KMS ログでは証明書と JWT が区別されないため、両方のログエントリは同じになります。
次のステップ
- コントロール プレーンのセキュリティについて学習する。
- Google の担当者の管理者権限について学習する。
- GKE のロギングとモニタリングを構成する方法を確認する。
- ログへのフィールド レベルのアクセスを構成する方法を学習する。
- ロギングの使用制限について学習する。