本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
从 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 添加自定义源,必须满足以下要求:
-
目标 – 自定义源必须能够将数据作为一组 S3 对象写入 Security Lake,这些对象位于分配给该源的前缀之下。对于包含多个类别数据的源,您应将每个唯一的开放网络安全架构框架 (OCSF) 事件类
作为单独的源提供。Security Lake 创建了一个IAM角色,允许自定义源写入您的 S3 存储桶中的指定位置。 注意
使用OCSF验证工具
验证自定义源是否与兼容 OCSF Schema 1.1
。 格式 – 从自定义源收集的每个 S3 对象都应格式化为 Apache Parquet 文件。
架构-应将相同OCSF的事件类应用于 Parquet 格式的对象中的每条记录。
在 Security Lake 中提取自定义源代码的最佳实践
为提高数据处理和查询效率,建议在向 Security Lake 添加自定义源时遵循以下最佳实践:
- 分区
-
应按源位置、 AWS 区域 AWS 账户、和日期对对象进行分区。
-
分区数据路径的格式为
.bucket-name
/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
/ -
如果您向自定义源添加了源版本,则分区数据路径的格式为
bucket-name
/ext/custom-source-name
/custom-source-version
/region=us-west-2
/accountId=123456789012
/eventDay=20230428
/包含源版本的示例分区是
aws-security-data-lake-
。us-west-2-lake-uid
/ext/custom-source-name
/2.0
/region=us-west-2
/accountId=123456789012
/eventDay=20230428
/
以下列表描述了分区中使用的参数。
-
bucket-name
– Security Lake 用来存储自定义源数据的 Amazon S3 存储桶的名称。 -
source-location
– S3 存储桶中自定义源的前缀。Security Lake 将给定源的所有 S3 对象存储在该前缀下,并且该前缀对于给定源是唯一的。 -
source-version
— 自定义源代码的源版本。 -
region
— AWS 区域 向其中写入数据。 -
accountId
— 源分区中记录所属的 AWS 账户 ID。 -
eventDay
– 事件发生的日期,格式为八个字符的字符串 (YYYYMMDD
)。
-
- 对象大小和速率
-
发送到 Security Lake 的文件应在 5 分钟到 1 个活动日之间按增量发送。如果文件大小超过 256MB,则客户发送文件的频率可能超过 5 分钟。对象和大小要求是针对查询性能优化 Security Lake。不遵守自定义源代码要求可能会影响您的 Security Lake 性能。
- Parquet 设置
-
Security Lake 支持 Parquet 版本 1.x 和 2.x。数据页大小应限制为 1MB(未压缩)。行组大小不应超过 256MB(已压缩)。要在 Parquet 对象内进行压缩,首选 zstandard。
- 排序
-
在每个 Parquet 格式的对象中,记录应按时间排序,以降低查询数据的成本。
在 Security Lake 中添加自定义源的先决条件
添加自定义源时,Security Lake 会创建一个IAM角色,允许源将数据写入数据湖中的正确位置。角色的名称遵循格式AmazonSecurityLake-Provider-{name of the custom source}-{region}
,其中region
是 AWS 区域 您添加自定义源的格式。Security Lake 将向该角色附加允许访问数据湖的策略。如果您使用客户管理的 AWS KMS 密钥对数据湖进行了加密,Security Lake 还会为该角色附加策略kms:Decrypt
和kms: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:CreateGrant
kms: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}}" ] }