验证身份证件签发和使用情况


本页介绍了如何使用日志检查 Google Kubernetes Engine (GKE) 集群控制平面发放和使用 Kubernetes 身份(以证书和服务账号令牌的形式)的情况。此验证完全是可选的,对控制平面的安全性而言并非必需。

本指南适用于有以下要求的安全管理员和平台所有者:需要遵守特定的组织合规性或政策要求,以控制凭据签发和签名。您应该已经使用 GKE 控制平面授权设置了自行管理的密钥和 CA

您应该已经熟悉以下概念:

本页介绍了 GKE 中一组可选控制平面功能的一部分,可让您执行各种任务,例如验证控制平面安全状况,或使用您管理的密钥在控制平面中配置加密和凭据签名。 如需了解详情,请参阅 GKE 控制平面授权简介

默认情况下, Google Cloud 会对托管式控制平面应用各种安全措施。 本页介绍了一些可选功能,可让您更好地了解 GKE 控制平面或对其进行控制。

身份证件签发日志简介

GKE 身份证件发放日志是控制平面审核日志,用于记录控制平面何时发放凭据以及这些凭据何时在集群中使用。您可以使用这些日志来跟踪凭据的生命周期(包括签发和使用情况),方法是将身份签发日志与 Cloud KMS、Certificate Authority Service 和 Kubernetes API 日志相关联。使用 GKE 控制平面授权时,系统会启用 GKE 身份证书签发日志。这些日志会跟踪以下类型凭据的签发和使用情况:

  • X.509 证书
  • 集群 JSON Web 令牌 (JWT)

X.509 证书

Kubernetes 使用 X.509 证书进行客户端证书身份验证。如需颁发证书,Kubernetes 控制平面会向 CA Service 中的证书授权机构 (CA) 发送已获批准的 CertificateSigningRequest。然后,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 服务日志:找到包含以下 ID 的证书颁发日志条目:
    • cert_fingerprint.sha256_hash:已签名证书的 SHA256 哈希。使用此 ID 将日志与 GKE 和 Kubernetes API 事件进行匹配。
    • tbs_certificate_digest:发送以供 Cloud KMS 密钥签名的证书内容的哈希。使用此 ID 将日志与 Cloud KMS 日志进行匹配。
  • Cloud KMS 签名日志:使用 CA 服务日志中的 tbs_certificate_digest 值确认预期的 Cloud KMS 密钥是否对证书进行了签名。

JSON Web 令牌 (JWT)

在对 Kubernetes API 的请求进行身份验证时,已签名的 JWT(JSON Web 令牌)会用作集群中实体的不记名令牌,例如 Kubernetes 服务账号。创建使用特定服务账号的 Pod 时,Kubernetes 会创建 JWT 并将其挂载到 Pod 中。当您使用 GKE 控制平面授权运行自己的密钥和 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 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 使用自有 CA 或密钥配置 GKE 集群控制平面

  2. 启用以下 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 控制平面授权身份颁发日志来确认证书是否已成功颁发或使用。您可以使用以下任一日志或日志组合来确认有关证书签发和使用的信息:

证书日志

用于记录证书使用情况的 Kubernetes API 日志

每当对 Kubernetes API 使用证书时,都会记录证书签名详细信息。

用于记录证书颁发操作的 GKE 日志

将所有证书颁发操作记录为系统事件审核日志。默认情况下,在使用 GKE 控制平面授权用户管理的密钥或 CA 的任何集群上,系统都会启用这些日志。

CA Service 审核日志

每当颁发证书时记录条目。

Cloud KMS 审核日志

每当有摘要被签名时,都会记录一条条目,以响应来自 CA Service 的签名请求。

使用 Kubernetes API 日志验证证书使用情况

如需查找使用证书进行身份验证的 API 调用的日志条目,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    前往 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    log_id("cloudaudit.googleapis.com/activity")
    resource.type="k8s_cluster"
    labels."authentication.kubernetes.io/credential-id":"X509SHA256="
    
  3. 点击运行查询

    此查询会返回具有关联 X.509 证书的所有 Kubernetes API 服务器日志。使用安全工具或手动检查日志,查找要调查的特定日志条目。

如需将这些日志与其他日志类型相关联,请找到以下字段:

"authentication.k8s.io/credential-id":"CREDENTIAL_ID"

CREDENTIAL_ID 值是您可以用来关联 GKE、CA 服务和 Cloud KMS 中的日志的标识符。CREDENTIAL_ID 的格式为 "X509SHA256=CERTIFICATE_HASH"

使用 GKE 日志验证证书颁发

如需查找证书颁发事件的 GKE 日志条目,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event"
    resource.type="gke_cluster"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.metadata.credentialId="CREDENTIAL_ID"
    

    替换以下内容:

  3. 点击运行查询

使用 CA Service 日志验证证书颁发

如需查找与 GKE 证书颁发事件匹配的 CA 服务日志,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    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= 前缀。

  3. 点击运行查询

    此查询会返回一个日志,其中证书说明响应部分包含 tbs_certificate_digest: DIGEST_VALUE 字段。

您可以使用 DIGEST_VALUE 匹配证书的 Cloud KMS 签名日志

使用 Cloud KMS 签名日志验证证书签发

如需查找 CA 服务证书颁发事件的 Cloud KMS 签名事件,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    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 日志验证证书颁发部分中的摘要值。

  3. 点击运行查询

    此查询会返回证书颁发事件的日志。Cloud KMS 日志不会区分证书和 JWT,因此这两者的日志条目是相同的。

验证令牌

您可以使用 GKE 控制平面授权身份颁发日志和 Cloud KMS 签名日志来确认 JSON Web 令牌 (JWT) 是否已成功颁发。

发起令牌发放事件的轨迹跟踪通常从监控 Kubernetes API 日志中的服务账号活动开始。确定需要进一步调查的活动日志后,您可以使用以下日志来确认凭据签发和使用情况的相关信息:

JWT 日志

用于 JWT 使用的 Kubernetes API 日志

每当针对 Kubernetes API 使用 JWT 时,都会记录 JWT 签名详细信息。

JWT 签发操作的 GKE 日志

将所有令牌发放操作记录为系统事件审核日志。默认情况下,使用 GKE 控制平面授权用户管理的密钥或 CA 的任何集群都会启用这些日志。

Cloud KMS 审核日志

每当签发令牌时,都会记录一条条目。

使用 Kubernetes API 服务器日志验证令牌用量

如需查找令牌使用事件的日志条目,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    log_id("cloudaudit.googleapis.com/activity")
    resource.type="k8s_cluster"
    labels."authentication.kubernetes.io/credential-id":"JTI="
    
  3. 点击运行查询

    此查询会返回具有关联 JWT 的所有 Kubernetes API 服务器日志。 使用安全工具或手动检查日志,查找要调查的特定日志条目。

如需将这些日志与其他日志类型相关联,请找到以下字段:

"authentication.k8s.io/credential-id": "JTI=JWT_ID"

JWT_ID 是令牌标识符,可用于关联 GKE 和 Cloud KMS 的日志。

使用 GKE 日志验证令牌发放

如需查找令牌发放事件的日志条目,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    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"
    

    替换以下内容:

  3. 点击运行查询

    此查询会返回包含 toBeSignedDigest 字段的日志。

您可以使用 toBeSignedDigest 值查找 Cloud KMS 签名事件。

使用 Cloud KMS 签名日志验证令牌签发

如需查找已签名摘要的日志条目,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    前往 Logs Explorer

  2. 将以下表达式粘贴到查询编辑器字段中:

    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 字段中的值。

  3. 点击运行查询

    此查询会返回证书颁发事件的日志。Cloud KMS 日志不会区分证书和 JWT,因此这两者的日志条目是相同的。

后续步骤