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

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

从 Security Lake 中的自定义来源收集数据

Amazon Security Lake 可以从自定义的第三方源收集安全日志和事件。Security Lake 自定义源是一种第三方服务,用于向 Amazon Security Lake 发送安全日志和事件。在发送数据之前,自定义源必须将日志和事件转换为开放网络安全架构框架 (OCSF),并满足 Security Lake 的源要求,包括分区、parquet 文件格式以及对象大小和速率要求。

对于每个自定义源,Security Lake 会进行以下处理:

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

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

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

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

注意

一个账户中最多可以添加 50 个自定义日志源。

要向 Security Lake 添加自定义源,它必须满足以下要求。不满足这些要求可能会影响性能,并可能影响查询等分析用例。

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

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

  • 架构-应将相同OCSF的事件类应用于 Parquet 格式的对象中的每条记录。Security Lake 支持 Parquet 版本 1.x 和 2.x。数据页大小应限制为 1MB(未压缩)。行组大小不应超过 256MB(已压缩)。要在 Parquet 对象内进行压缩,首选 zstandard。

  • 分区-必须按区域、 AWS 账户对对象进行分区。eventDay对象前缀应为。source location/region=region/accountId=accountID/eventDay=yyyyMMdd/

  • 对象大小和速率 — 发送到 Security Lake 的文件应在 5 分钟到 1 个活动日之间按增量发送。如果文件大小超过 256MB,则客户发送文件的频率可能超过 5 分钟。对象和大小要求是针对查询性能优化 Security Lake。不遵守自定义源代码要求可能会影响您的 Security Lake 性能。

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

注意

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

在 Security Lake 中提取自定义源的分区要求

为了便于高效的数据处理和查询,在向 Security Lake 添加自定义源时,我们需要满足分区、对象和大小要求:

分区

应按源位置、 AWS 区域 AWS 账户、和日期对对象进行分区。

  • 分区数据路径的格式为

    /ext/custom-source-name/region=region/accountId=accountID/eventDay=YYYYMMDD.

    带有示例存储桶名称的示例分区是aws-security-data-lake-us-west-2-lake-uid/ext/custom-source-name/region=us-west-2/accountId=123456789012/eventDay=20230428/

以下列表描述了 S3 路径分区中使用的参数:

  • Security Lake 用于存储您的自定义源数据的 Amazon S3 存储桶的名称。

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

  • region— AWS 区域 将数据上传到其中。例如,您必须使用将数据上传US East (N. Virginia)到位于美国东部(弗吉尼亚北部)地区的 Security Lake 存储桶。

  • accountId— 源分区中记录所属的 AWS 账户 ID。对于与之外的账户相关的记录 AWS,我们建议使用诸如external或之类的字符串external_externalAccountId。通过采用这种命名对流,您可以避免在命名外部帐户时出现歧义,IDs这样它们就不会与其他身份管理系统IDs维护的 AWS 帐户IDs或外部帐户发生冲突。

  • eventDay— 记录UTC的时间戳,截断为小时,格式为八个字符的字符串 ()。YYYYMMDD如果记录在事件时间戳中指定了不同的时区,则必须将该分UTC区键的时间戳转换为。

在 Security Lake 中添加自定义源的先决条件

添加自定义源时,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 中添加自定义来源。Security Lake 控制台提供了简化的入门流程,可以代表您创建所有必需的IAM角色或使用现有角色。

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

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

如果您正在使用 Securit API y Lake 或 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}}" ] }