本页面介绍了如何使用日志检查 Google Kubernetes Engine (GKE) 集群控制平面以证书和服务账号令牌的形式发放和使用 Kubernetes 身份。此验证完全是可选的,没有此验证也可保护控制平面。
本指南适用于安全性管理员和平台所有者,他们对凭据签发的控制有特定的组织合规性或政策要求。您应该已经使用 GKE control plane authority 设置了自行管理的密钥和 CA。
您应该已经熟悉以下概念:
本页面介绍了 GKE 中一组可选控制平面功能的一部分,这些功能可让您执行各种任务,例如验证控制平面的安全状况,或使用您管理的密钥在控制平面中配置加密和凭据签名。如需了解详情,请参阅关于 GKE control plane authority。
默认情况下, Google Cloud 会对托管式控制平面应用各种安全措施。本页面介绍了一些可选功能,让您更好地了解或控制 GKE 控制平面。
关于身份发放日志
GKE 身份发放日志是控制平面审核日志,用于记录控制平面发放凭据的时间以及在集群中使用这些凭据的时间。通过将身份发放日志与 Cloud KMS、Certificate Authority Service 和 Kubernetes API 日志相关联,您可以使用这些日志来跟踪凭据的生命周期(包括发放和使用)。使用 GKE control plane authority 时会启用 GKE 身份发放日志。这些日志会跟踪以下类型凭据的发放和使用:
- X.509 证书
- 集群 JSON Web 令牌 (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 身份发放日志:使用
protoPayload.metadata.credentialId
查询可根据 Kubernetes API 服务器日志中的凭据 ID 查找特定 GKE 身份发放日志。然后,使用 GKE 身份发放日志中的protoPayload.metadata.certificateFingerprint
字段将身份发放日志与 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 令牌 (JWT)
在验证对 Kubernetes API 的请求的身份时,已签名的 JWT(JSON Web 令牌)会用作集群中实体(例如 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 身份发放日志:使用 Kubernetes API 服务器日志中的 JWT ID 可查找特定的 JWT 发放条目。每个条目还包含
toBeSignedDigest
字段,其值可以与 Cloud KMS 日志匹配。 - Cloud KMS 签名日志:使用 GKE 身份发放日志中的
toBeSignedDigest
字段的值可确认预期的 Cloud KMS 密钥是否已对 JWT 签名。
价格
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
启用以下 Cloud Audit Logging Service API:
所需的角色
如需获得访问身份发放日志所需的权限,请让管理员向您授予项目的以下 IAM 角色:
-
在 Logging 中执行所有操作:
Logging Admin (
roles/logging.admin
)。 -
查看日志:
Private Logs Viewer (
roles/logging.privateLogViewer
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
要求和限制
需要遵循以下要求和限制:
- 您必须使用 GKE 1.31.1-gke.1846000 或更高版本。
- 身份发放日志作为 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 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 中的日志的标识符。CREDENTIAL_ID
的格式为 "X509SHA256=CERTIFICATE_HASH"
。
使用 GKE 日志验证证书发放情况
如需查找证书颁发事件的 GKE 日志条目,请完成以下步骤:
在 Google Cloud 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 签名日志验证证书发放情况
如需在 Cloud KMS 签名事件中查找 CA Service 证书发放事件,请完成以下步骤:
在 Google Cloud 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 令牌 (JWT) 是否已成功发放。
启动令牌发放事件回溯通常从监控 Kubernetes API 日志中的服务账号活动开始。确定需要进一步调查的活动日志后,您可以使用以下日志来确认有关凭据发放和使用情况的信息:
JWT 日志 |
|
---|---|
有关 JWT 使用情况的 Kubernetes API 日志 |
每当使用 JWT 访问 Kubernetes API 时,都会记录 JWT 签名详细信息。 |
有关 JWT 发放操作的 GKE 日志 |
将所有令牌发放操作记录为系统事件审核日志。在使用 GKE control plane authority 用户管理的密钥或 CA 的任何集群上,这些日志默认处于启用状态。 |
Cloud KMS 审核日志 |
每当签发令牌时,都会记录相应条目。 |
使用 Kubernetes API 服务器日志验证令牌使用情况
如需查找令牌使用事件的日志条目,请完成以下步骤:
在 Google Cloud 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 中的日志。
使用 GKE 日志验证令牌发放
如需查找令牌发放事件的日志条目,请完成以下步骤:
在 Google Cloud 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 控制台中,前往 Logs Explorer 页面:
将以下表达式粘贴到查询编辑器字段中:
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 配置 Logging 和 Monitoring。
- 了解如何配置对日志的字段级访问权限。
- 了解 Logging 用量限额。