日志存储功能使您能够集中且安全地收集环境日志并将其存储在防篡改存储器中。这将使您能够评估、监控、提醒和审计对云资源和对象执行的访问和操作。

架构图

下载架构图 PDF 

实施资源

安全团队应根据您的治理需求实施此功能。

通过使用单独的日志存储,您可以构建一个安全区域,在该区域中,日志可以作为环境中发生的安全和操作相关活动及事件的事实来源。示例包括账户访问权限和基础设施变更。

日志存储必须防篡改并进行加密,并且只能根据角色的最低权限访问,通过受控和受监控的机制进行访问。需要围绕日志存储实施控制措施,以保护日志及其管理流程的完整性和可用性。有关深入的技术信息,请参阅《在 AWS 上建立云基础》白皮书。

    • 场景
    • 构建安全且有弹性的日志存储

      • 安全访问日志存储
      • 在日志存储中配置默认加密
      • 创建用于存储日志的位置
    • 概览
    • 您可以通过单独的日志存储空间来创建一个安全区域,使日志成为环境中发生的安全和运营相关操作及事件的事实来源。例如,对不同账户的访问权限或基础设施更新。

    • 实施
    • 建议您在日志存档账户中建立日志存储,该账户会存储来自整个环境中不同工作负载的日志,其中包含安全日志。该账户中的日志用作事实来源,可分析、评估和监控 AWS 环境中的活动,并可用于向审计人员展示合规性和政策要求。

      安全访问日志存储

      在此账户中,您应该拥有一个在身份管理和访问控制(IMAC)功能中定义的 LogArchive-Administrator 角色,您将使用该角色来设置日志存储功能的必要组件。日志存储建立完毕后,该角色将很少使用,系统会将其保留下来,以供在无法通过任何其他方式访问日志存储时的紧急情况下使用。

      在日志存储中配置默认加密

      首先,您需要在日志存档账户中创建 AWS KMS 加密密钥,该密钥也由安全团队管理。创建此密钥后,需要将其与日志存档账户共享,以便 Amazon S3 使用它来加密日志存储桶。以下示例可用于通过在密钥政策中添加日志账户作为主体,开始与管理账户共享密钥

      {
          "Sid": "Allow an external account to use this CMK",
          "Effect": "Allow",
          "Principal": {
              "Service": [
                  "cloudtrail.amazonaws.com",
              ]
          },
          "Action": [
              "kms:Encrypt",
              "kms:Decrypt",
              "kms:ReEncrypt*",
              "kms:GenerateDataKey*",
              "kms:DescribeKey"
          ],
          "Resource": "*"
      }

      注意:对于 AWS Control Tower 用户:组织的 AWS CloudTrail 和日志存档 Amazon Simple Storage(Amazon S3)存储桶将由 AWS Control Tower 为您创建。

      创建用于存储日志的位置

      现在,您已在日志存档账户中创建加密密钥,接下来请在您的主区域中创建一个 S3 存储桶。主区域是您定义的用来集中管理资源的区域。它通常离您的客户和您所在的地理位置最近。您希望所存储的日志中包含组织的日志。有关更多信息,请参阅治理功能。使用您之前在安全工具账户中创建的密钥,启用对存储在 S3 存储桶中的对象的加密

      使用日志存档账户的加密密钥在您的主区域中创建一个 S3 存储桶。您的主区域是被您指定用来集中运营资源的区域。有关更多详细信息,请参阅治理功能。使用您之前在安全工具账户中生成的加密密钥来加密存储在 S3 存储桶中的对象

      建议按照此命名空间命名您的存储桶,以避免与其他实施发生冲突:

      aws-[prefix]-log-storage-[account ID]-[Region]

      创建 S3 存储桶后,请确保在日志存档账户中针对存储桶启用阻止公共访问。接下来,添加一个存储桶策略,允许 AWS CloudTrail 和 AWS Config 对存储桶进行适当的访问。

      以下是一个示例,展示了为 AWS CloudTrail 和 AWS Config 配置的此策略是什么样子:

      {
          "Version": "2012-10-17",
          "Statement": [{
                  "Sid": "AWSCloudTrailAclCheck20150319",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": [
                          "cloudtrail.amazonaws.com",
                          "config.amazonaws.com"
                      ]
                  },
                  "Action": "s3:GetBucketAcl",
                  "Resource": "arn:aws:s3:::aws-[prefix]-log-storage-[account ID]-[Region]"
              },
              {
                  "Sid": "AWSCloudTrailWriteFullControl",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": [
                          "cloudtrail.amazonaws.com",
                          "config.amazonaws.com"
                      ]
                  },
                  "Action": "s3:PutObject",
                  "Resource": "arn:aws:s3:::aws-[prefix]-log-storage-[account ID]-[Region]/[optional prefix]/AWSLogs/myAccountID/*",
                  "Condition": 
                  {
                      "StringEquals": {
                          "s3:x-amz-acl": "bucket-owner-full-control"
                      }
                  }
              },
              {
                  "Sid": "DenyUnencryptedObjectUploadsAndTLS",
                  "Effect": "Deny",
                  "Principal": "*",
                  "Action": "s3:PutObject",
                  "Resource": "arn:aws:s3:::aws-[prefix]-log-storage-[account ID]-[Region]/[optional prefix]/AWSLogs/myAccountID/*",
                  "Condition": {
                      "Null": {
                      "s3:x-amz-server-side-encryption": "true"
                      },
                      "NumericLessThan": {
                          "s3:TlsVersion": 1.2
                      }
                  
                  }
              }
          ]   
      }

      此存储桶策略允许 AWS CloudTrail 和 AWS Config 将日志发送到您的 S3 存储桶,并授予存储桶对对象的完全控制权。要允许以后从不同的账户进行读取访问,存储桶所有者和对象所有者必须相同。为确保这一点,请在 S3 存储桶上启用首选存储桶所有者强制存储桶所有者设置。如果其他服务、主体或角色需要将日志发送到此存储桶,则可以将它们添加到存储桶策略中,然后日志将直接被发送到存储桶。但是,我们建议您仅使用此存储桶来存储与 AWS 安全相关的日志,并使用账户中的其他存储桶存储其他类型的日志。如果您需要额外的存储空间来存储额外的工作负载或操作日志,我们建议您创建额外的存储桶,并限制这些工作负载的特定权限。

    • 场景
    • 集中存储日志

      • 在中心位置捕获审计跟踪日志
      • 在中心位置捕获资源配置更改
      • 以组织定义的频率生成日志
    • 概览
    • 随着环境不断扩展以满足您的业务需求,集中整个环境中的所有日志可以简化日志分析和监控。这样做还可以轻松检索环境记录以及监管可以使用这些记录的人员。这使您能够构造日志记录所需的自定义控制面板和工具。 

      为您的日志创建集中位置

      应当收集日志并将其存储在集中位置,以便长期存储和进行分析。 这样做不仅使您可以集中监控周围环境并简化操作, 还可为您的资源、安全和操作日志建立单一事实来源。 此外,它可消除日志丢失的可能性,并确保对您的环境进行持续跟踪。

      为集中的日志提供保护

      当您的环境日志保存在一个集中位置时,实施全面的控制措施来保护环境会更加容易。建议您实施一个监控系统,每当日志存储被以写入或管理权限访问时,该系统都会生成警报。

    • 实施
    • 启用 AWS CloudTrail

      现在您已创建并配置 S3 存储桶和 AWS KMS 密钥,可以创建组织跟踪了。在 CloudTrail 上创建 AWS Organizations 跟踪时,您需要提供 S3 存储桶的名称,以及您为 CloudTrail 日志存储创建的 KMS 密钥的别名。

      启用日志访问权限

      在安全工具账户中,创建一个只读角色,例如 LogsRead-OnlyFrequencyRole,该角色具有在特定时间段内从日志存档账户检索所需项目的正确权限。在日志存档账户中,您还需要添加一条声明,说明此角色必须具有存储桶策略的访问权限才能提取日志和创建报告。

      以下是您的日志存档账户中某个 S3 存储桶的示例策略:

      {
          "Sid": "AllowReadOnlyAccessToASpecifcPath",
          "Effect": "Allow",
          "Principal": {
              "AWS": [ "arn:aws:iam::[account ID]:role/*Logs**ReadOnlyFrequencyRole*"
      
              ]
          },
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::aws-[prefix]-log-storage-[account ID]-[Region]/*"
      }
    • 场景
    • 确保日志存储中日志的完整性

      • 设置预防性控制措施以防止日志遭到未经授权的访问和修改
      • 生成访问日志并将其存储到您的日志存储中
    • 概览
    • 您的所有日志都应存储在由集中控制保护的同一隔离环境中。应当对控制措施进行配置,以使用预防性和检测性控制措施来保护您的日志存储环境。

      • 预防性控制措施允许您阻止环境操作。根据角色、操作类型、服务或地区的不同,如果使用预防性控制措施,对日志存储的访问权限和活动可能会受到限制。
      • 实施检测性控制措施是为了主动监控环境。这样做允许您针对环境中采取的有害或意外操作来创建警报。或者,可以自动调用补救措施来降低日志存储环境中的风险。
    • 实施
    • 设置预防性控制措施以防止日志遭到未经授权的访问和修改

      您需要使用服务控制策略(SCP)在组织级别应用策略来限制访问,从而保护刚刚创建的日志存储。以下示例策略拒绝对日志存档账户中的资源进行操作,应用 SCP 以拒绝对这些存储桶执行 AWS Config、AWS CloudTrail 和 Amazon S3 操作,除非您使用指定的角色进行这些更改:

      {
          "Condition": {
              "ArnNotLike": {
                  "aws:PrincipalARN": "arn:aws:iam::*:role/<Org_admin_role>"
              }
          },
          "Action": [
              "cloudtrail:DeleteTrail",
              "cloudtrail:PutEventSelectors",
              "cloudtrail:StopLogging",
              "cloudtrail:UpdateTrail"
          ],
          "Resource": [
              "arn:aws:cloudtrail:*:*:trail/<Organizations-trail>"
          ],
          "Effect": "Deny",
          "Sid": "CLOUDTRAILENABLED"
      },
      {
          "Condition": {
              "ArnNotLike": {
                  "aws:PrincipalARN": "arn:aws:iam::*:role/<Log_Storage_Role>"
              }
          },
          "Action": [
              "config:DeleteConfigurationRecorder",
              "config:DeleteDeliveryChannel",
              "config:DeleteRetentionConfiguration",
              "config:PutConfigurationRecorder",
              "config:PutDeliveryChannel",
              "config:PutRetentionConfiguration",
              "config:StopConfigurationRecorder",
              "config:PutConfigRule",
              "config:DeleteConfigRule",
              "config:DeleteEvaluationResults",
              "config:DeleteConfigurationAggregator",
              "config:PutConfigurationAggregator"
          ],
          "Resource": [
              "*"
          ],
          "Effect": "Deny",
          "Sid": "CONFIGENABLED"
      },
      {
          "Condition": {
              "ArnNotLike": {
                  "aws:PrincipalARN": "arn:aws:iam::*:role/<Log_Storage_Role>"
              }
          },
          "Action": [
              "s3:PutBucketPolicy",
              "s3:PutLifecycleConfiguration",
              "s3:PutBucketLogging",
              "s3:DeleteBucket*"
          ],
          "Resource": [
              "*"
          ],
          "Effect": "Deny",
          "Sid": "BUCKETCHANGESFORBIDDEN"
      }
    • 场景
    • 管理日志存储中的日志

      • 创建策略文档,指定日志必须保留的时间长度
      • 自动轮换日志并将其存档到适当的存储层(经常访问存档)
      • 定义保留日志定期访问权限或轮换到存档的时间段
      • 建立流程例外机制,在可能需要删除或存档日志时应用
    • 概览
    • 收集的每种类型的日志可能需要不同的日志存储方法。该策略将根据所需的日志类型、频率、保留时间、大小、数量、合规性和访问权限而有所不同。网络日志、访问日志、财务日志、DNS 日志、库存记录和变更管理记录是典型日志类型的示例。日志的典型生命周期模式包括使用常规存储、冷存储、存档存储等方式存储日志,并最终将它们删除。

      审计日志

      建议您采用广泛的预防性控制措施来保护您的组织,以帮助您约束不合规的变更。但是,考虑到现代企业通常需要大量的自助服务和高度敏捷性,您需要确保至少在环境、工作负载和数据的生产方面进行的更改完全透明,以便部署检测性和纠正性控制措施。

      安全、集中的日志存储库应该是唯一的事实来源,并且可以防篡改,因为集中处理审计日志可以让您清楚地了解环境中发生了什么以及在何时发生。例如,在取证调查期间,这能够简化对审计日志数据的访问。

      审计员对审计日志的使用

      如果您在受监管的行业工作,您将需要聘请外部审计公司,定期验证您是否遵守了适用的要求。审计员可能拥有自己的账户,属于其自身公司。在审计过程中,他们需要检查您的日志数据,以确定您自上次检查以来是否一直保持合规。对您和审计员而言,一个有利的做法是为他们提供一个只读账户,以便他们可以在其组织内仅以只读权限访问您的日志存档存储桶。这将允许您的审计员在执行其他审计任务(例如检查文书和访谈运营人员)之前,在其环境中检查和分析您的日志。

      在审计过程中,您的内部安全团队可能需要发挥安全保障作用。这些工作包括对外部审计进行内部模拟运行,以减少外部审计无法成功进行的可能性。此规程可以由您的安全团队执行;但是,他们可能更愿意将特定于安全保障的任务拆分到一个单独的账户中执行,以便将其与常规安全操作分离开来。如果您的安全保障团队独立于安全团队,则应将他们的工作拆分至不同的账户,以确保职责分离。

      配置日志

      配置日志包含有关基础设施或应用程序更改的详细信息。配置日志还提供基础设施或应用程序配置的当前和历史视图。在每个生命周期阶段保留配置日志的时长很大程度上将取决于需求、业务策略和适用的法规。

      网络日志

      网络日志可让您大致了解网络上正在发生的情况。它们可以帮助您监控环境中的流量并诊断与网络相关的问题。由于网络日志的生成量和生成频率较高,与其他日志相比,将其保存在可访问存储中的时间通常要短得多。最佳做法是根据技术要求、成本考虑因素和基础设施的关键性,定义生命周期策略以保留网络日志。

    • 实施
    • 自动将日志轮换和存档到相应的存储层

      根据您的合规性和监管需求,您可以配置 S3 存储桶以将项目移至较低存储类型,例如 Amazon S3 Glacier,或者如果不再需要维护这些记录,则在一段时间后将其删除。S3 存储生命周期配置允许为迁移和过期项目建立策略。

    • 场景
    • 向日志存储中添加新日志

      • 定义向日志存储中添加新日志的过程
      • 构建将新日志存储到日志存储的机制
      • 自动向日志存储中添加新日志
    • 概览
    • 随着环境的发展,您可能需要存储前一节中所描述的不同类型日志。这些日志需要分别添加和保护,以提供抗故障能力,以及控制有权访问各种类型日志的人员的能力。

      您需要为环境中的不同工作流或隔离工作负载的所有者提供一种方法,以便他们请求将日志添加到集中日志存储以供使用。 请求新日志时,这些日志的所有者将向您提供存储、存档和访问这些日志所需的所有要件。这将允许您自定义不同的安全策略并精细设置控件,以及将来自生产和非生产环境的日志分开。

    • 实施
    • 定义向日志存储中添加新日志的过程

      新的日志流可能需要自己的日志存档账户下的存储空间。为了保持日志的独特性,我们建议为每组隔离的资源创建一个新的 S3 存储桶,以及精细设置控制措施,确保可以从生产工作负载的日志中读取数据(因为它们可能包含敏感信息)。

      如果您需要集中存储来自开发和暂存环境的日志,我们建议您创建两个新的 S3 存储桶,一个用于开发,一个用于暂存,您可以在其中建立子文件夹,用来存储相应的工作负载日志。

      构建将新日志存储到日志存储的机制

      客户(团队或工作负载的所有者)将向安全团队提交请求,要求创建一个存储工作负载日志的特定位置,其中包括所有必需的规范,例如治理和保留政策。该请求还应指明日志是否包含个人身份信息(PII)(由您的政策定义),或者它们是否受特定法规的约束,以及工作负载将日志传送到存储时要使用的角色或服务。您将根据参数在日志存档账户中创建 S3 存储桶,并向客户端提供 S3 URI,以便他们开始向该存储桶发送日志。

    • 场景
    • 授予日志访问权限

      • 使用最低权限原则(PoLP)向角色/用户授予只读访问权限
      • 提供对日志的读取权限,以便进行分析或审计(内部/外部)
      • 按所有者或使用案例自动对日志存储中的特定日志进行临时只读访问
         
    • 概览
    • 尽管其他日志保存在日志存储中,但您可能需要创建工具来分析数据,并将数据显示在人类能够理解的控制面板中,从而提供有关环境的见解。此外,想要查看历史数据和访问日志存储的工作负载所有者可以申请日志检查权限。

      一旦存储,您的日志就是“一次写入,多次读取”的类型。这意味着您应该授予某些利益相关者只读访问权限,以便他们可以访问所需的日志。遵循责任共担模式,日志存储的管理员必须允许特定用户访问他们寻求的数据,这些用户又负责创建和维护权限,并提供给每个用户,供他们负责任地访问数据。

    • 实施
    • 提供对日志的读取权限,以便进行分析或审计(内部/外部)

      授予对日志的外部只读访问权限时,请确保活动仅限于读取客户打算查看的 S3 存储桶中的项目。为此,请在您的 S3 存储桶策略中添加一行或多行,允许所需角色访问他们需要读取的数据,同时将 S3:GetObject 权限限制在保存这些日志的确切位置。

      以下语句示例需要添加到您的存储桶策略中,以允许来自特定账户的特定角色从请求的路径读取日志。

      {
          "Sid": "AllowReadOnlyAccessToASpecifcPath",
          "Effect": "Allow",
          "Principal": {
              "AWS": [ "arn:aws:iam::<account where the role lives>:role/<role_requesting_access>"
      
              ]
          },
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::aws-[prefix]-log-storage-[account ID]-[Region]/path/to/requested/logs/*"
      }

      用于访问日志的角色需要具备足够的 IAM 权限,才能在日志存档账户的 S3 存储桶中执行 GetObjects 操作。您可以使用此示例授予对 S3 存储桶的跨账户访问权限。

      此外,由于存储桶上的日志受 KMS 密钥加密,因此您需要修改 KMS 密钥政策,允许需要访问日志的角色解密日志。

免责声明

示例代码;软件库;命令行工具;概念验证;模板;或其他相关技术(包括由我方人员提供的任何前述项)作为 AWS 内容按照《AWS 客户协议》或您与 AWS 之间的相关书面协议(以适用者为准)向您提供。您不应将这些 AWS 内容用在您的生产账户中,或用于生产或其他关键数据。您负责根据特定质量控制规程和标准测试、保护和优化 AWS 内容,例如示例代码,以使其适合生产级应用。部署 AWS 内容可能会因创建或使用 AWS 可收费资源(例如,运行 Amazon EC2 实例或使用 Amazon S3 存储)而产生 AWS 费用。

此页内容对您是否有帮助?