

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

# 从 Security Lake 中的自定义来源收集数据
<a name="custom-sources"></a>

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

对于每个自定义源，Security Lake 会进行以下处理：
+ 为 Amazon S3 存储桶中的源提供一个唯一前缀。
+ 在 AWS Identity and Access Management (IAM) 中创建允许自定义源向数据湖写入数据的角色。此角色的权限边界由名为的 AWS 托管策略设置[`AmazonSecurityLakePermissionsBoundary`](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonSecurityLakePermissionsBoundary)。
+ 创建一个 AWS Lake Formation 表来整理源写入 Security Lake 的对象。
+ 设置 AWS Glue 搜寻器来对源数据进行分区。爬虫 AWS Glue Data Catalog 用表格填充。它还会自动发现新的源数据并提取架构定义。

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

要向 Security Lake 添加自定义源，它必须满足以下要求。不满足这些要求可能会影响性能，并可能影响查询等分析用例。
+ **目标** – 自定义源必须能够将数据作为一组 S3 对象写入 Security Lake，这些对象位于分配给该源的前缀之下。对于包含多个类别数据的源，您应将每个唯一的[开放网络安全架构框架（OCSF）事件类](https://schema.ocsf.io/classes?extensions=)作为单独的源提供。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 验证工具](https://github.com/aws-samples/amazon-security-lake-ocsf-validation)验证自定义源是否与兼容。`OCSF Schema`对于自定义来源，Security Lake 支持 OCSF 1.3 及更早版本。

## 在 Security Lake 中提取自定义源的分区要求
<a name="custom-sources-best-practices"></a>

为了便于高效的数据处理和查询，在向 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 路径分区中使用的参数：
+ 安全湖存储您的自定义源数据的 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 中添加自定义源的先决条件
<a name="iam-roles-custom-sources"></a>

添加自定义源时，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`](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonSecurityLakePermissionsBoundary)。

**Topics**
+ [验证权限](#add-custom-sources-permissions)
+ [创建 IAM 角色以允许对 Security Lake 存储桶位置进行写入访问（ AWS CLI仅限 API 和步骤）](#iam-roles-glue-crawler)

### 验证权限
<a name="add-custom-sources-permissions"></a>

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

要验证您的权限，请使用 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 中添加自定义来源](adding-custom-sources.md)。Security Lake 控制台提供了简化的入门流程，可以为您创建所有必要的 IAM 角色或使用现有角色。  
如果您计划使用 Security Lake API 或 AWS CLI 添加自定义来源，请继续执行下一步创建 IAM 角色以允许对 Security Lake 存储桶位置进行写入访问。

### 创建 IAM 角色以允许对 Security Lake 存储桶位置进行写入访问（ AWS CLI仅限 API 和步骤）
<a name="iam-roles-glue-crawler"></a>

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

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

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

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

------
#### [ JSON ]

****  

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

------

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

------
#### [ JSON ]

****  

```
{
    "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}}"
    ]
}
```