从自定义源收集数据 - Amazon Security Lake

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

从自定义源收集数据

Amazon Security Lake 可以从自定义的第三方源收集安全日志和事件。对于每个自定义源,Security Lake 会进行以下处理:

  • 为 Amazon S3 存储桶中的源提供一个唯一前缀。

  • 在 AWS Identity and Access Management (IAM) 中创建允许自定义源向数据湖写入数据的角色。此角色的权限边界由名为的 AWS 托管策略设置AmazonSecurityLakePermissionsBoundary

  • 创建一个 AWS Lake Formation 表来整理源写入 Security Lake 的对象。

  • 设置 AWS Glue 搜寻器来对源数据进行分区。爬虫 AWS Glue Data Catalog 用表格填充。它还会自动发现新的源数据并提取架构定义。

要向 Security Lake 添加自定义源,必须满足以下要求:

  1. 目标 – 自定义源必须能够将数据作为一组 S3 对象写入 Security Lake,这些对象位于分配给该源的前缀之下。对于包含多个类别数据的源,您应将每个唯一的开放网络安全架构框架(OCSF)事件类作为单独的源提供。Security Lake 会创建一个 IAM 角色,该角色允许自定义源向您的 S3 存储桶中的指定位置进行写入。

    注意

    使用 OCSF 验证工具验证自定义源是否与OCSF Schema 1.1兼容。

  2. 格式 – 从自定义源收集的每个 S3 对象都应格式化为 Apache Parquet 文件。

  3. 架构 – 相同的 OCSF 事件类应该应用于 Parquet 格式的对象中的每条记录。

摄取自定义源的最佳实践

为提高数据处理和查询效率,建议在向 Security Lake 添加自定义源时遵循以下最佳实践:

分区

应按源位置、 AWS 区域 AWS 账户、和日期对对象进行分区。分区数据路径的格式为 bucket-name/source-location/region=region/accountId=accountID/eventDay=YYYYMMDD

一个分区示例是 aws-security-data-lake-us-west-2-lake-uid/source-location/region=us-west-2/accountId=123456789012/eventDay=20230428/

  • bucket-name – Security Lake 用来存储自定义源数据的 Amazon S3 存储桶的名称。

  • source-location – S3 存储桶中自定义源的前缀。Security Lake 将给定源的所有 S3 对象存储在该前缀下,并且该前缀对于给定源是唯一的。

  • region— AWS 区域 向其中写入数据。

  • accountId— 源分区中记录所属的 AWS 账户 ID。

  • eventDay – 事件发生的日期,格式为八个字符的字符串 (YYYYMMDD)。

对象大小和速率

写入到 Security Lake 的对象应将记录缓冲 5 分钟。如果缓冲期内的数据过多,导致无法有效查询,则自定义源可以在 5 分钟时限内写入多条记录,前提是这些文件的平均大小保持在 256MB 以下。吞吐量较低的自定义源可以每 5 分钟写入一次较小的对象,以保持 5 分钟的摄取延迟,并可以将记录缓冲更长时间。

Parquet 设置

Security Lake 支持 Parquet 版本 1.x 和 2.x。数据页大小应限制为 1MB(未压缩)。行组大小不应超过 256MB(已压缩)。要在 Parquet 对象内进行压缩,首选 zstandard。

排序

在每个 Parquet 格式的对象中,记录应按时间排序,以降低查询数据的成本。

添加自定义源的先决条件

添加自定义源时,Security Lake 会创建一个 IAM 角色,该角色允许该源将数据写入到数据湖中的正确位置。角色的名称遵循格式AmazonSecurityLake-Provider-{name of the custom source}-{region},其中region是 AWS 区域 您添加自定义源的格式。Security Lake 将向该角色附加允许访问数据湖的策略。如果您使用客户管理的 AWS KMS 密钥对数据湖进行了加密,Security Lake 还会为该角色附加策略kms:Decryptkms:GenerateDataKey权限。此角色的权限边界由名为的 AWS 托管策略设置AmazonSecurityLakePermissionsBoundary

验证权限

在添加自定义源之前,请验证您是否具有执行以下操作的权限。

要验证您的权限,请使用 IAM 查看附加到 IAM 身份的 IAM 策略。然后,将这些策略中的信息与以下操作列表(您必须被允许执行这些操作才能添加自定义源)进行比较。

  • glue:CreateCrawler

  • glue:CreateDatabase

  • glue:CreateTable

  • glue:StopCrawlerSchedule

  • iam:GetRole

  • iam:PutRolePolicy

  • iam:DeleteRolePolicy

  • iam:PassRole

  • lakeformation:RegisterResource

  • lakeformation:GrantPermissions

  • s3:ListBucket

  • s3:PutObject

这些操作允许您从自定义来源收集日志和事件,将其发送到正确的 AWS Glue 数据库和表,并将其存储在 Amazon S3 中。

如果您使用 AWS KMS 密钥对数据湖进行服务器端加密,则还需要获得kms:CreateGrantkms:DescribeKey、和kms:GenerateDataKey的权限。

重要

如果您计划使用 Security Lake 控制台添加自定义源,则可以跳过下一步继续操作添加自定义源。Security Lake 控制台提供了简化的入门流程,可以为您创建所有必要的 IAM 角色或使用现有角色。

如果您计划使用 Security Lake API 或 AWS CLI 添加自定义来源,请继续执行下一步创建 IAM 角色以允许对 Security Lake 存储桶位置进行写入访问。

创建 IAM 角色以允许对 Security Lake 存储桶位置进行写入访问( AWS CLI仅限 API 和步骤)

如果您正在使用 Security Lake API 或 AWS CLI 添加自定义源,请添加此 IAM 角色以授予对您的自定义源数据进行爬网和识别数据分区的 AWS Glue 权限。这些分区是整理数据以及在 Data Catalog 中创建和更新表所必需的。

创建此 IAM 角色后,您需要该角色的 Amazon 资源名称(ARN)才能添加自定义源。

您必须附加arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole AWS 托管策略。

要授予必要的权限,您还必须在角色中创建并嵌入以下内联策略, AWS Glue 爬网程序 以允许从自定义源读取数据文件并在 AWS Glue 数据目录中创建/更新表。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3WriteRead", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{{bucketName}}/*" ] } ] }

附上以下信任策略 AWS 账户 以允许使用该策略根据外部 ID 代入角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "glue.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

如果您要添加自定义源的区域中的 S3 存储桶是使用客户管理的加密的 AWS KMS key,则还必须将以下策略附加到该角色和您的 KMS 密钥策略:

{ "Effect": "Allow", "Action": [ "kms:GenerateDataKey" "kms:Decrypt" ], "Condition": { "StringLike": { "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::{{name of S3 bucket created by Security Lake}" ] } }, "Resource": [ "{{ARN of customer managed key}}" ] }

添加自定义源

创建用于调用 AWS Glue 爬虫的 IAM 角色后,请按照以下步骤在 Security Lake 中添加自定义源。

Console
  1. 打开 Security Lake 控制台:https://console.aws.amazon.com/securitylake/

  2. 使用页面右上角的 AWS 区域 选择器,选择要在其中创建自定义源的区域。

  3. 在导航窗格中选择自定义来源,然后选择创建自定义来源

  4. 自定义来源详细信息部分,为自定义源输入一个全局唯一名称。然后,选择一个 OCSF 事件类,它描述了自定义源将发送到 Security Lake 的数据类型。

  5. 对于拥有写入数据权限的AWS 账户 ,输入将把日志和事件写入到数据湖的自定义源的 AWS 账户 ID外部 ID

  6. 对于服务访问权限,创建并使用新的服务角色,或使用向 Security Lake 授予调用 AWS Glue的权限的现有服务角色。

  7. 选择创建

API

要以编程方式添加自定义源,请使用 Security Lake API 的CreateCustomLogSource操作。使用要创建自定义源代码的 AWS 区域 位置中的操作。如果你使用的是 AWS Command Line Interface (AWS CLI),请运行 create-custom-log- source 命令。

在您的请求中,使用受支持的参数为自定义源指定配置设置:

  • sourceName— 为源指定名称。该名称必须是区域中唯一的值。

  • eventClasses— 指定一个或多个 OCSF 事件类来描述源将发送到 Security Lake 的数据类型。有关 Security Lake 中支持作为源的 OCSF 事件类的列表,请参阅开放网络安全架构框架 (OCSF)。

  • sourceVersion—(可选)指定一个值,将日志收集限制为特定版本的自定义源数据。

  • crawlerConfiguration— 指定您为调用爬网程序而创建的 IAM 角色的 Amazon 资源名称 (ARN)。 AWS Glue 有关创建 IAM 角色的详细步骤,请参阅添加自定义源的先决条件

  • providerIdentity— 指定源将用于向数据湖写入日志和事件的 AWS 身份和外部 ID。

以下示例在指定区域的指定日志提供者账户中添加自定义源作为日志源。此示例是针对 Linux、macOS 或 Unix 进行格式化的,它使用反斜杠 (\) 行继续符来提高可读性。

$ aws securitylake create-custom-log-source \ --source-name EXAMPLE_CUSTOM_SOURCE \ --event-classes '["DNS_ACTIVITY", "NETWORK_ACTIVITY"]' \ --configuration crawlerConfiguration={"roleArn=arn:aws:iam::XXX:role/service-role/RoleName"},providerIdentity={"externalId=ExternalId,principal=principal"} \ --region=[“ap-southeast-2”]

在中更新自定义源数据 AWS Glue

在 Security Lake 中添加自定义来源后,Security Lake 会创建一个 AWS Glue 爬虫。该爬网程序将连接到您的自定义源,确定数据结构,然后用表填充 AWS Glue Data Catalog。

我们建议您手动运行该爬网程序,以确保自定义源的架构保持最新,并维护 Athena 和其他查询服务中的查询功能。具体来说,如果自定义源的输入数据集中发生以下任一变化,您就应该运行该爬网程序:

  • 数据集有一个或多个新的顶级列。

  • 数据集在具有 struct 数据类型的列中有一个或多个新字段。

有关运行爬虫的说明,请参阅《AWS Glue 开发者指南》中的安排 AWS Glue 爬网程序

Security Lake 无法删除或更新您账户中的现有爬网程序。如果您删除一个自定义源并计划在将来创建同名的自定义源,我们建议您删除关联的爬网程序。

删除自定义源

删除自定义源可以停止将数据从该源发送到 Security Lake。

Console
  1. 打开 Security Lake 控制台:https://console.aws.amazon.com/securitylake/

  2. 使用页面右上角的 AWS 区域 选择器,选择要从中移除自定义来源的区域。

  3. 在导航窗格中,选择自定义来源

  4. 选择要删除的自定义源。

  5. 选择取消注册自定义来源,然后选择删除以确认操作。

API

要以编程方式删除自定义源,请使用 Security Lake API 的DeleteCustomLogSource操作。如果你使用的是 AWS Command Line Interface (AWS CLI),请运行 delete-custom-log- source 命令。在要删除自定义源的 AWS 区域 中使用该操作。

在您的请求中,使用 sourceName 参数指定要删除的自定义源的名称。也可以指定自定义源的名称,然后使用 sourceVersion 参数将删除范围限制为自定义源中特定版本的数据。

以下示例从 Security Lake 中删除自定义日志源。

此示例是针对 Linux、macOS 或 Unix 进行格式化的,它使用反斜杠 (\) 行继续符来提高可读性。

$ aws securitylake delete-custom-log-source \ --source-name EXAMPLE_CUSTOM_SOURCE