收集 Snowflake 日志
本文档介绍了如何使用 AWS S3 将 Snowflake 日志注入到 Google Security Operations。解析器使用一系列 Grok 和 KV 模式匹配规则从日志消息中提取字段,这些规则专门用于处理 Snowflake 日志格式。然后,它会将提取的字段映射到统一数据模型 (UDM),通过添加更多上下文来丰富数据,并标准化表示形式以供进一步分析。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 对 AWS 的特权访问权限
- 对 Snowflake 的特权访问权限 (ACCOUNTADMIN)
配置 Amazon S3 存储分区
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶
- 保存相应存储桶的名称和区域,以供日后参考。
配置 Snowflake AWS IAM 政策
- 登录 AWS 管理控制台。
- 搜索并选择 IAM。
- 选择账号设置。
- 在端点列表中的 Security Token Service (STS) 下,找到您的账号所在的 Snowflake 区域。
- 如果 STS 状态为非活跃,请将切换开关移至活跃。
- 选择政策。
- 选择创建政策。
- 在政策编辑器中,选择 JSON。
复制并粘贴以下政策(采用 JSON 格式),以向 Snowflake 提供使用单个存储桶和文件夹路径加载或卸载数据所需的权限。您还可以使用 PURGE 复制选项清除数据文件。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] }
点击下一步。
输入政策名称(例如 snowflake_access)和可选的说明。
点击创建政策。
配置 Snowflake AWS IAM 角色
- 在 AWS Identity and Access Management (IAM) 中,选择 Roles。
- 点击 Create role。
- 选择 AWS account 作为可信实体类型。
- 选择其他 AWS 账号。
- 在“账号 ID”字段中,暂时输入您自己的 AWS 账号 ID。之后,您修改信任关系并向 Snowflake 授予访问权限。
- 选择需要外部 ID 选项。
- 输入占位 ID,例如 0000。在后续步骤中,您将修改 IAM 角色的信任关系,并为存储集成指定外部 ID。
- 点击下一步。
- 选择您之前创建的 IAM 政策。
- 点击下一步。
- 输入角色的名称和说明。
- 点击 Create role。
- 在角色摘要页面上,复制并保存角色 ARN 值。
配置 Snowflake S3 集成
- 连接到 Snowflake 数据库。
替换以下字段,然后运行该命令:
<integration_name>
是新集成的名称(例如,s3_integration)。<iam_role>
是您之前创建的角色的 Amazon 资源名称 (ARN)。<aws_s3_bucket_path>
是您之前创建的存储桶的路径(例如s3://your-log-bucket-name/
)。
CREATE OR REPLACE STORAGE INTEGRATION <integration_name> TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' ENABLED = TRUE STORAGE_AWS_ROLE_ARN = '<iam_role>' STORAGE_ALLOWED_LOCATIONS = ('<aws_s3_bucket_path>')
配置 AWS IAM 用户权限以访问存储分区
- 检索为您的 Snowflake 账号自动创建的 IAM 用户的 ARN,将
<integration_name>
替换为您之前创建的集成功能的实际名称:none DESC INTEGRATION <integration_name>;
- 例如:
none DESC INTEGRATION s3_integration; +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/ | [] | | STORAGE_AWS_IAM_USER_ARN | String | arn:aws:iam::123456789001:user/abc1-b-self1234 | | | STORAGE_AWS_ROLE_ARN | String | arn:aws:iam::001234567890:role/myrole | | | STORAGE_AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
- 复制并保存以下属性的值:
- STORAGE_AWS_IAM_USER_ARN
- STORAGE_AWS_EXTERNAL_ID
- 前往 AWS 管理控制台。
- 依次选择 IAM > 角色。
- 选择您之前创建的角色。
- 选择信任关系标签页。
- 点击修改信任政策。
使用 DESC INTEGRATION 输出值更新政策文档:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<snowflake_external_id>" } } } ] }
您需要进行如下替换:
snowflake_user_arn
是您记录的STORAGE_AWS_IAM_USER_ARN
值。snowflake_external_id
是您记录的STORAGE_AWS_EXTERNAL_ID
值。
点击更新政策。
在 Snowflake 中配置 JSON 文件格式
在 Snowflake 中,输入以下命令:
CREATE OR REPLACE FILE FORMAT my_json_format type = json COMPRESSION = 'gzip' null_if = ('NULL', 'null');
在 Snowflake 中创建 S3 阶段
在 Snowflake 中,替换以下字段并输入命令:
<DB_NAME>
<DB_SCHEMA_NAME>
<AWS_S3_BUCKET_PATH>
use database '<DB_NAME>'; use schema '<DB_SCHEMA_NAME>'; CREATE OR REPLACE STAGE my_s3_stage storage_integration = s3_integration url = '<AWS_S3_BUCKET_PATH>' file_format = my_json_format;
配置 Snowflake 以导出数据
运行 UNLOAD 命令,将数据从表导出到暂存区,然后再导出到 AWS S3:
use database '<DB_NAME>'; use WAREHOUSE '<WAREHOUSE_NAME>'; copy into @my_s3_stage/login_history from (SELECT OBJECT_CONSTRUCT('application', 'snowflake' ,'environment', '<PUT_HERE_ENV_NAME>', 'log_type', 'login_history', 'EVENT_TIMESTAMP', EVENT_TIMESTAMP, 'EVENT_TYPE', EVENT_TYPE, 'USER_NAME', USER_NAME, 'CLIENT_IP', CLIENT_IP, 'REPORTED_CLIENT_TYPE', REPORTED_CLIENT_TYPE, 'FIRST_AUTHENTICATION_FACTOR',FIRST_AUTHENTICATION_FACTOR, 'IS_SUCCESS', IS_SUCCESS, 'ERROR_CODE', ERROR_CODE, 'ERROR_MESSAGE', ERROR_MESSAGE) from snowflake.account_usage.Login_history) FILE_FORMAT = (TYPE = JSON) ; copy into @my_s3_stage/access_history from (SELECT OBJECT_CONSTRUCT('application', 'snowflake' ,'environment', '<PUT_HERE_DB_NAME>', 'log_type', 'access_history', 'QUERY_START_TIME',QUERY_START_TIME, 'USER_NAME', USER_NAME, 'DIRECT_OBJECTS_ACCESSED',DIRECT_OBJECTS_ACCESSED, 'BASE_OBJECTS_ACCESSED', BASE_OBJECTS_ACCESSED, 'OBJECTS_MODIFIED', OBJECTS_MODIFIED) from snowflake.account_usage.Access_History ) FILE_FORMAT = (TYPE = JSON);
针对以下所有用于存储日志和审核相关数据的 Snowflake 表重复执行导出流程:
Databases ; WAREHOUSE_EVENTS_HISTORY ; WAREHOUSE_LOAD_HISTORY ; WAREHOUSE_METERING_HISTORY ; DATABASE_STORAGE_USAGE_HISTORY ; DATA_TRANSFER_HISTORY ; GRANTS_TO_ROLES ; GRANTS_TO_USERS ; METERING_DAILY_HISTORY ; PIPE_USAGE_HISTORY ; REPLICATION_USAGE_HISTORY ; STAGE_STORAGE_USAGE_HISTORY ; STORAGE_USAGE ; TASK_HISTORY ; COPY_HISTORY ;
为 Google SecOps 配置 AWS IAM
- 登录 AWS 管理控制台。
- 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和密钥以供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索并选择 AmazonS3FullAccess 政策。
- 点击下一步。
- 点击添加权限。
设置 Feed
您可以通过两种不同的入口点在 Google SecOps 平台中设置 Feed:
- SIEM 设置 > Feed
- 内容中心 > 内容包
通过“SIEM 设置”>“Feed”设置 Feed
如需配置 Feed,请按以下步骤操作:
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在Feed name 字段中,输入 Feed 的名称(例如 Snowflake Logs)。
- 选择 Amazon S3 作为来源类型。
- 选择 Snowflake 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
- 区域:Amazon S3 存储桶所在的区域。
- S3 URI:存储桶 URI(格式应为:
s3://your-log-bucket-name/
)。 请替换以下内容:your-log-bucket-name
:相应存储桶的名称。
- URI is a(URI 是):选择目录或目录(包括子目录)。
- 来源删除选项:根据您的偏好设置选择删除选项。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- 私有访问密钥:有权访问 S3 存储桶的用户的私有密钥。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
设置来自内容中心的 Feed
为以下字段指定值:
区域:Amazon S3 存储桶所在的区域。
- S3 URI:存储桶 URI(格式应为:
s3://your-log-bucket-name/
)。 请替换以下内容:your-log-bucket-name
:相应存储桶的名称。
- URI is a(URI 是):选择目录或目录(包括子目录)。
- 来源删除选项:根据您的偏好设置选择删除选项。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- 私有访问密钥:有权访问 S3 存储桶的用户的私有密钥。
- S3 URI:存储桶 URI(格式应为:
高级选项
- Feed 名称:用于标识 Feed 的预填充值。
- 来源类型:用于将日志收集到 Google SecOps 中的方法。
- 资源命名空间:与 Feed 关联的命名空间。
- 提取标签:应用于相应 Feed 中所有事件的标签。
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。