设置不记名令牌身份验证 - Amazon CloudWatch 日志

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

设置不记名令牌身份验证

在使用持有者令牌身份验证向任何 HTTP 摄取端点发送日志之前,您需要:

  • 创建具有 CloudWatch 日志权限的 IAM 用户

  • 生成特定于服务的凭证(持有者令牌)

  • 创建日志组和日志流

  • 在日志组上启用不记名令牌身份验证

重要

我们建议在可能的情况下对所有工作负载使用带有短期凭证的 Sigv4 身份验证。SigV4 提供了最强的安全态势。将 API 密钥(不记名令牌)的使用限制在基于凭证的短期身份验证不可行的场景中。当您准备好将 CloudWatch 日志整合到具有更高安全要求的应用程序中时,应切换到短期凭证。有关更多信息,请参阅 IAM 用户指南中的长期访问密钥替代方案

选项 1:使用 AWS 控制台快速入门

AWS 管理控制台简化了生成用于 HTTP 端点访问的 API 密钥的工作流程。

使用控制台设置 HTTP 端点访问权限
  1. 登录到 AWS 管理控制台。

  2. 导航至 CloudWatch> 设置 > 日志

  3. 在 API 密钥部分中,选择生成 API 密钥

  4. 对于 API 密钥过期时间,请执行以下操作之一:

    • 将 API 密钥的过期时间选择为 153090365 天。

    • 选择自定义持续时间以指定自定义 API 密钥到期日期。

    • 选择永不过期(不推荐)。

  5. 选择生成 API 密钥

    控制台自动:

    • 创建具有适当权限的新 IAM 用户

    • 附加CloudWatchLogsAPIKey访问管理策略(包括logs:PutLogEventslogs:CallWithBearerToken权限)

    • 生成特定于服务的凭证(API 密钥)

  6. 复制并安全保存显示的凭据:

    • API 密钥 ID(特定于服务的凭证 ID)

    • API 密钥密钥(持有者令牌)

    重要

    立即保存 API 密钥密钥。之后无法检索。如果您丢失了密钥,则需要生成一个新的 API 密钥。

  7. 创建用于存储日志的日志组和日志流:

    # Create the log group aws logs create-log-group \ --log-group-name /aws/hlc-logs/my-application \ --region us-east-1 # Create the log stream aws logs create-log-stream \ --log-group-name /aws/hlc-logs/my-application \ --log-stream-name application-stream-001 \ --region us-east-1
  8. 在日志组上启用不记名令牌身份验证:

    aws logs put-bearer-token-authentication \ --log-group-identifier /aws/hlc-logs/my-application \ --bearer-token-authentication-enabled \ --region us-east-1

    验证配置:

    aws logs describe-log-groups \ --log-group-name-prefix /aws/hlc-logs/my-application \ --region us-east-1

包含的权限:自动创建的 IAM 用户将拥有以下权限:

  • logs:PutLogEvents— 将日志事件发送到 CloudWatch 日志

  • logs:CallWithBearerToken— 使用不记名令牌进行身份验证

  • kms:Describe*,kms:GenerateDataKey*, kms:Decrypt — 访问 KMS 加密的日志组(条件仅限于日志服务)

选项 2:手动设置

如果您希望更好地控制 IAM 配置或需要自定义权限,则可以手动设置 HTTP 终端节点访问权限。

步骤 1:创建 IAM 用户

创建将用于日志提取的 IAM 用户:

  1. 登录 AWS 管理控制台并导航到 IAM。

  2. 在左侧导航窗格中,选择 用户

  3. 选择创建用户

  4. 输入用户名(例如,cloudwatch-logs-hlc-user)。

  5. 选择下一步

  6. 附上以下 IAM 策略之一:

    选项 A:使用托管策略(推荐)

    附加CloudWatchLogsAPIKey访问管理策略。

    选项 B:创建自定义策略

    创建并附加以下 IAM 策略:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "LogsAPIs", "Effect": "Allow", "Action": [ "logs:CallWithBearerToken", "logs:PutLogEvents" ], "Resource": "*" }, { "Sid": "KMSAPIs", "Effect": "Allow", "Action": [ "kms:Describe*", "kms:GenerateDataKey*", "kms:Decrypt" ], "Condition": { "StringEquals": { "kms:ViaService": [ "logs.*.amazonaws.com" ] } }, "Resource": "arn:aws:kms:*:*:key/*" } ] }
  7. 选择 “下一步”,然后选择 “创建用户”

注意

如果您计划向 KMS 加密的日志组发送日志,则需要 KMS 权限。该条件限制 KMS 只能访问通过 CloudWatch 日志服务使用的密钥。

步骤 2:生成特定于服务的凭证(API 密钥)

使用 API 生成 CloudWatch 日志 AP CreateServiceSpecificCredentialI 密钥。您也可以使用 create-service-specific-credentialCLI 命令。对于凭证期限,您可以指定一个介于 1-36600 天之间的值。如果未指定凭证期限,则 API 密钥将不会过期。

要生成有效期为 30 天的 API 密钥,请执行以下操作:

aws iam create-service-specific-credential \ --user-name cloudwatch-logs-hlc-user \ --service-name logs.amazonaws.com \ --credential-age-days 30

响应是一个ServiceSpecificCredential对象。ServiceCredentialSecret值是您的 CloudWatch 日志 API 密钥(不记名令牌)。

重要

安全地存储 ServiceCredentialSecret 值,因为您以后无法检索它。如果您丢失了密钥,则需要生成一个新的 API 密钥。

步骤 3:创建日志组和日志流

创建用于存储日志的日志组和日志流:

# Create the log group aws logs create-log-group \ --log-group-name /aws/hlc-logs/my-application \ --region us-east-1 # Create the log stream aws logs create-log-stream \ --log-group-name /aws/hlc-logs/my-application \ --log-stream-name application-stream-001 \ --region us-east-1

步骤 4:启用不记名令牌身份验证

在日志组上启用不记名令牌身份验证:

aws logs put-bearer-token-authentication \ --log-group-identifier /aws/hlc-logs/my-application \ --bearer-token-authentication-enabled \ --region us-east-1

验证配置:

aws logs describe-log-groups \ --log-group-name-prefix /aws/hlc-logs/my-application \ --region us-east-1

控制生成和使用 CloudWatch 日志 API 密钥的权限

CloudWatch 日志 API 密钥的生成和使用由 CloudWatch 日志和 IAM 服务中的操作和条件密钥控制。

控制日 CloudWatch 志 API 密钥的生成

i am: CreateServiceSpecificCredential 操作控制特定于服务的密钥(例如 CloudWatch 日志 API 密钥)的生成。您可以将此操作作为一种资源,将操作范围限定为 IAM 用户,以便限制可以为其生成密钥的用户。

您可以使用以下条件密钥对 iam:CreateServiceSpecificCredential 操作的权限施加条件:

  • iam: ServiceSpecificCredentialAgeDays — 允许您在条件中指定密钥的到期时间(以天为单位)。例如,您可以使用此条件密钥仅允许创建将在 90 天内过期的 API 密钥。

  • iam: ServiceSpecificCredentialServiceName — 允许您在条件中指定服务的名称。例如,您可以使用此条件密钥仅允许为 CloudWatch 日志创建 API 密钥,而不允许为其他服务创建 API 密钥。

控制日 CloudWatch 志 API 密钥的使用

logs:CallWithBearerToken操作控制 CloudWatch 日志 API 密钥的使用。要防止身份使用 L CloudWatch ogs API 密钥,请向与该密钥关联的 IAM 用户附加拒绝该logs:CallWithBearerToken操作的策略。

策略示例

阻止身份生成和使用 CloudWatch 日志 API 密钥

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCWLAPIKeys", "Effect": "Deny", "Action": [ "iam:CreateServiceSpecificCredential", "logs:CallWithBearerToken" ], "Resource": "*" } ] }
警告

此策略将禁止为所有支持创建特定 AWS 服务凭证的服务创建凭证。有关更多信息,请参阅 IAM 用户的服务特定凭证

阻止身份使用日 CloudWatch 志 API 密钥

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "logs:CallWithBearerToken", "Resource": "*" } ] }

仅当 CloudWatch 日志密钥在 90 天内过期时,才允许创建这些密钥

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:CreateServiceSpecificCredential", "Resource": "arn:aws:iam::123456789012:user/username", "Condition": { "StringEquals": { "iam:ServiceSpecificCredentialServiceName": "logs.amazonaws.com" }, "NumericLessThanEquals": { "iam:ServiceSpecificCredentialAgeDays": "90" } } } ] }

轮换 API 密钥

定期轮换 API 密钥可降低未经授权访问的风险。我们建议制定与贵组织安全政策相一致的轮换时间表。

轮换过程

要在不中断日志传输的情况下轮换 API 密钥,请按照以下步骤操作:

  1. 为 IAM 用户创建新(辅助)凭证:

    aws iam create-service-specific-credential \ --user-name cloudwatch-logs-hlc-user \ --service-name logs.amazonaws.com \ --credential-age-days 90
  2. (可选)存储新凭证, AWS Secrets Manager 以便安全检索和自动轮换。

  3. 将新证书导入供应商门户或更新您的应用程序配置以使用新的 API 密钥。

  4. 将原始凭证设置为非活动状态:

    aws iam update-service-specific-credential \ --user-name cloudwatch-logs-hlc-user \ --service-specific-credential-id ACCA1234EXAMPLE1234 \ --status Inactive
  5. 监控中日志组的IncomingBytes指标,确认日志传输不会受到影响 CloudWatch。有关更多信息,请参阅使用 CloudWatch 指标进行监控

  6. 使用新密钥确认成功交付后,删除之前的凭证:

    aws iam delete-service-specific-credential \ --service-specific-credential-id ACCA1234EXAMPLE1234

监控密钥过期

要检查现有 API 密钥的创建日期和状态,请使用以下list-service-specific-credentials命令:

aws iam list-service-specific-credentials \ --user-name cloudwatch-logs-hlc-user \ --service-name logs.amazonaws.com

每个凭据Status的响应都包括CreateDate和。使用此信息来识别即将到期或有效时间超过轮换策略允许时间的密钥。

对泄露的 API 密钥作出响应

如果您怀疑 API 密钥已被泄露,请立即采取以下步骤:

  1. 立即停用密钥以防止进一步未经授权的使用:

    aws iam update-service-specific-credential \ --user-name cloudwatch-logs-hlc-user \ --service-specific-credential-id ACCA1234EXAMPLE1234 \ --status Inactive
  2. 查看 CloudTrail 日志以确定未经授权访问的范围。使用记录 API 密钥的使用情况 CloudTrail有关如何启用 API 密钥使用情况审计,请参阅。

  3. 按照中所述@@ 的轮换过程创建替换密钥轮换过程

  4. 替换完毕后,请删除泄露的密钥

    aws iam delete-service-specific-credential \ --service-specific-credential-id ACCA1234EXAMPLE1234
  5. 如果您@@ 在调查时需要立即阻止 IAM 用户的所有持有者令牌访问权限,请附上拒绝策略

    { "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "logs:CallWithBearerToken", "Resource": "*" } }
注意

要通过 API 执行这些操作,您必须使用 AWS 凭据进行身份验证,而不是使用 CloudWatch 日志 API 密钥进行身份验证。

您还可以使用以下 IAM API 操作来管理泄露的密钥:

API 密钥的安全最佳实践

请遵循以下最佳做法来保护您的 CloudWatch 日志 API 密钥:

  • 切勿在源代码中嵌入 API 密钥。请勿在应用程序代码中对 API 密钥进行硬编码,也不要将其提交到版本控制系统。如果密钥意外被提交到公共存储库,则 AWS 自动扫描可能会对其进行标记,因此您应立即轮换密钥。

  • 使用密钥管理器。将 API 密钥存储在AWS Secrets Manager或等效的机密管理解决方案中。这可以实现集中访问控制、审核日志和自动轮换。

  • 为所有密钥设置过期时间。创建 API 密钥时,请务必指定一个--credential-age-days值。要在整个组织中强制使用最长密钥生命周期,请使用 iam:ServiceSpecificCredentialAgeDays IAM 条件密钥。有关示例,请参阅仅当 CloudWatch 日志密钥在 90 天内过期时,才允许创建这些密钥

  • 应用最低权限权限。将 IAM 用户的权限范围仅限于所需的日志组和操作。使用托管CloudWatchLogsAPIKey访问策略作为起点,并根据需要进一步限制。

  • 启用 CloudTrail 日志记录。通过为启用 CloudTrail 数据事件来审计 API 密钥使用情况AWS::Logs::LogGroupAuthorization。请参阅使用记录 API 密钥的使用情况 CloudTrail

  • 使用 IAM 访问分析器进行监控。使用 IAM Access Analyzer 来识别与您的 API 密钥 IAM 用户关联的未使用证书和过于宽松的策略。

  • 定期轮换密钥。制定轮换时间表并按照中所述的流程进行操作轮换 API 密钥

使用记录 API 密钥的使用情况 CloudTrail

您可以使用 AWS CloudTrail 记录日 CloudWatch 志 API 密钥使用情况的数据事件。 CloudWatch 日志会发出CallWithBearerToken呼叫AWS::Logs::LogGroupAuthorization的数据事件,使您能够审计 API 密钥何时以及如何用于发送日志。

要启用 CloudTrail 日志记录 API 密钥使用情况,请执行以下操作: CloudWatch

注意

您为跟踪指定的 S3 存储桶必须具有允许 CloudTrail 向其写入日志文件的存储桶策略。有关更多信息,请参阅 Amazon S3 存储桶政策 CloudTrail

  1. 创建跟踪:

    aws cloudtrail create-trail \ --name cloudwatch-logs-api-key-audit \ --s3-bucket-name my-cloudtrail-bucket \ --region us-east-1
  2. 配置高级事件选择器以捕获 CloudWatch 日志日志组授权事件:

    aws cloudtrail put-event-selectors \ --region us-east-1 \ --trail-name cloudwatch-logs-api-key-audit \ --advanced-event-selectors '[{ "Name": "CloudWatch Logs API key authorization events", "FieldSelectors": [ { "Field": "eventCategory", "Equals": ["Data"] }, { "Field": "resources.type", "Equals": ["AWS::Logs::LogGroupAuthorization"] } ] }]'
  3. 开始跟踪记录:

    aws cloudtrail start-logging \ --name cloudwatch-logs-api-key-audit \ --region us-east-1