使用连接日志实现可观测性 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用连接日志实现可观测性

CloudFront 连接日志提供了双向 TLS 身份验证事件的详细信息,让您可监控证书验证、跟踪连接尝试以及解决身份验证问题。

什么是连接日志?

连接日志为已启用双向 TLS 的分配捕获有关 TLS 握手和证书验证的详细信息。与记录 HTTP 请求信息的标准访问日志不同,连接日志专注于 TLS 连接建立阶段,包括:

  • 连接状态(成功/失败)

  • 客户端证书详细信息

  • TLS 协议和密码信息

  • 连接计时指标

  • 来自连接函数的自定义数据

通过查看这些日志,您可以全面了解基于证书的身份验证事件,从而更好地监控安全性、解决问题并满足合规性要求。

启用连接日志

连接日志仅适用于已启用双向 TLS 身份验证的分配。您可以将连接日志发送到多个目标,包括 CloudWatch Logs、Amazon Data Firehose 和 Amazon S3。

先决条件

在启用连接日志之前:

  • 为 CloudFront 分配配置双向 TLS

  • 为 CloudFront 分配启用连接日志

  • 确保您拥有所选日志记录目标所需的权限

  • 对于跨账户传输,请配置适当的 IAM 策略

启用连接日志(控制台)

  1. 登录 Amazon Web Services 管理控制台,并通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/v4/home

  2. 从分配列表中,选择已启用 mTLS 的分配。

  3. 选择日志记录选项卡。

  4. 选择添加

  5. 选择要接收日志的服务:

    • CloudWatch Logs

    • Firehose

    • Amazon S3

  6. 对于目标,为所选服务选择资源:

    • 对于 CloudWatch Logs,输入日志组名称

    • 对于 Firehose,输入 Firehose 传输流

    • 对于 Amazon S3,输入存储桶名称(可选择附带前缀)

  7. (可选)配置其他设置:

    • 字段选择:选择要包含的特定日志字段。

    • 输出格式:从 JSON、Plain、w3c、Raw 或 Parquet(仅 S3)中进行选择。

    • 字段分隔符:指定如何分隔日志字段。

  8. 选择保存更改

启用连接日志(Amazon CLI)

以下示例演示如何使用 CloudWatch API 启用连接日志:

# Step 1: Create a delivery source aws logs put-delivery-source \ --name "cf-mtls-connection-logs" \ --resource-arn "arn:aws:cloudfront::123456789012:distribution/E1A2B3C4D5E6F7" \ --log-type CONNECTION_LOGS # Step 2: Create a delivery destination aws logs put-delivery-destination \ --name "s3-destination" \ --delivery-destination-configuration \ "destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket1" # Step 3: Create the delivery aws logs create-delivery \ --delivery-source-name "cf-mtls-connection-logs" \ --delivery-destination-arn "arn:aws:logs:us-east-1:123456789012:delivery-destination:s3-destination"
注意

在使用 CloudWatch API 时,您必须指定美国东部(弗吉尼亚州北部)区域(us-east-1),即使在将日志传输到其他区域时也是如此。

连接日志字段

连接日志包含有关每次 TLS 连接尝试的详细信息:

字段 说明 示例
eventTimestamp 连接建立成功或失败时对应的 ISO 8601 时间戳 1731620046814
connectionId TLS 连接的唯一标识符 oLHiEKbQSn8lkvJfA3D4gFowK3_iZ0g4i5nMUjE1Akod8TuAzn5nzg==
connectionStatus

mTLS 连接尝试的状态。

SuccessFailed
clientIp 连接客户端的 IP 地址 2001:0db8:85a3:0000:0000:8a2e:0370:7334
clientPort 客户端使用的端口 12137
serverIp CloudFront 边缘服务器的 IP 地址 99.84.71.136
distributionId CloudFront 分配 ID E2DX1SLDPK0123
distributionTenantId CloudFront 分配租户 ID(如果适用) dt_2te1Ura9X3R2iCGNjW123
tlsProtocol 使用的 TLS 协议版本 TLSv1.3
tlsCipher 用于连接的 TLS 密码套件 TLS_AES_128_GCM_SHA256
tlsHandshakeDuration TLS 握手的持续时间(毫秒) 153
tlsSni 来自 TLS 握手的服务器名称指示值 d111111abcdef8.cloudfront.net
clientLeafCertSerialNumber 客户端证书的序列号 00:b1:43:ed:93:d2:d8:f3:9d
clientLeafCertSubject 客户端证书的主题字段 C=US, ST=WA, L=Seattle, O=Amazon.com, OU=CloudFront, CN=client.test.mtls.net
clientLeafCertIssuer 客户端证书的颁发者字段 C=US, ST=WA, L=Seattle, O=Amazon.com, OU=CloudFront, CN=test.mtls.net
clientLeafCertValidity 客户端证书的有效期 NotBefore=2025-06-05T23:28:21Z;NotAfter=2125-05-12T23:28:21Z
connectionLogCustomData 通过连接函数添加的自定义数据 REVOKED:00:b1:43:ed:93:d2:d8:f3:9d

连接错误代码

Failed:ClientCertMaxChainDepthExceeded Failed:ClientCertMaxSizeExceeded Failed:ClientCertUntrusted Failed:ClientCertNotYetValid Failed:ClientCertExpired Failed:ClientCertTypeUnsupported Failed:ClientCertInvalid Failed:ClientCertIntentInvalid Failed:ClientCertRejected Failed:ClientCertMissing Failed:TcpError Failed:TcpTimeout Failed:ConnectionFunctionError Failed:ConnectionFunctionDenied Failed:Internal Failed:UnmappedConnectionError

连接失败时,CloudFront 会记录具体的原因代码:

代码 说明
ClientCertMaxChainDepthExceeded 已超出最大证书链深度
ClientCertMaxSizeExceeded 已超出最大证书大小
ClientCertUntrusted 证书不可信
ClientCertNotYetValid 证书尚未生效
ClientCertExpired 证书已过期
ClientCertTypeUnsupported 证书类型不受支持
ClientCertInvalid 证书无效
ClientCertIntentInvalid 证书意图无效
ClientCertRejected 证书已被自定义验证拒绝
ClientCertMissing 证书缺失
TcpError

尝试建立连接时出错

TcpTimeout

无法在超时时间内建立连接

ConnectionFunctionError

连接函数执行过程中引发了未捕获的异常

Internal

出现内部服务错误

UnmappedConnectionError

发生了一个无法归入任何其他类别的错误