收集 Snowflake 日志

支持的语言:

本文档介绍了如何使用 AWS S3 将 Snowflake 日志注入到 Google Security Operations。解析器使用一系列 Grok 和 KV 模式匹配规则从日志消息中提取字段,这些规则专门用于处理 Snowflake 日志格式。然后,它会将提取的字段映射到统一数据模型 (UDM),通过添加更多上下文来丰富数据,并标准化表示形式以供进一步分析。

准备工作

请确保满足以下前提条件:

  • Google SecOps 实例
  • 对 AWS 的特权访问权限
  • 对 Snowflake 的特权访问权限 (ACCOUNTADMIN)

配置 Amazon S3 存储分区

  1. 按照以下用户指南创建 Amazon S3 存储桶创建存储桶
  2. 保存相应存储桶的名称区域,以供日后参考。

配置 Snowflake AWS IAM 政策

  1. 登录 AWS 管理控制台。
  2. 搜索并选择 IAM
  3. 选择账号设置
  4. 端点列表中的 Security Token Service (STS) 下,找到您的账号所在的 Snowflake 区域
  5. 如果 STS 状态为非活跃,请将切换开关移至活跃
  6. 选择政策
  7. 选择创建政策
  8. 政策编辑器中,选择 JSON
  9. 复制并粘贴以下政策(采用 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>/*"
                        ]
                    }
                }
            }
        ]
    }
    
  10. 点击下一步

  11. 输入政策名称(例如 snowflake_access)和可选的说明

  12. 点击创建政策

配置 Snowflake AWS IAM 角色

  1. 在 AWS Identity and Access Management (IAM) 中,选择 Roles
  2. 点击 Create role
  3. 选择 AWS account 作为可信实体类型。
  4. 选择其他 AWS 账号
  5. 在“账号 ID”字段中,暂时输入您自己的 AWS 账号 ID。之后,您修改信任关系并向 Snowflake 授予访问权限。
  6. 选择需要外部 ID 选项。
  7. 输入占位 ID,例如 0000。在后续步骤中,您将修改 IAM 角色的信任关系,并为存储集成指定外部 ID。
  8. 点击下一步
  9. 选择您之前创建的 IAM 政策
  10. 点击下一步
  11. 输入角色的名称说明
  12. 点击 Create role
  13. 在角色摘要页面上,复制并保存角色 ARN 值

配置 Snowflake S3 集成

  1. 连接到 Snowflake 数据库。
  2. 替换以下字段,然后运行该命令:

    • <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 用户权限以访问存储分区

  1. 检索为您的 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= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
  1. 复制并保存以下属性的值:
    • STORAGE_AWS_IAM_USER_ARN
    • STORAGE_AWS_EXTERNAL_ID
  2. 前往 AWS 管理控制台
  3. 依次选择 IAM > 角色
  4. 选择您之前创建的角色
  5. 选择信任关系标签页。
  6. 点击修改信任政策
  7. 使用 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>"
            }
          }
        }
      ]
    }
    
  8. 您需要进行如下替换:

    • snowflake_user_arn 是您记录的 STORAGE_AWS_IAM_USER_ARN 值。
    • snowflake_external_id 是您记录的 STORAGE_AWS_EXTERNAL_ID 值。
  9. 点击更新政策

在 Snowflake 中配置 JSON 文件格式

  1. 在 Snowflake 中,输入以下命令:

    CREATE OR REPLACE FILE FORMAT my_json_format
      type = json
      COMPRESSION = 'gzip'
      null_if = ('NULL', 'null');
    

在 Snowflake 中创建 S3 阶段

  1. 在 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 以导出数据

  1. 运行 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);
    
  2. 针对以下所有用于存储日志和审核相关数据的 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

  1. 登录 AWS 管理控制台。
  2. 按照以下用户指南创建用户创建 IAM 用户
  3. 选择创建的用户
  4. 选择安全凭据标签页。
  5. 访问密钥部分中,点击创建访问密钥
  6. 选择第三方服务作为使用情形
  7. 点击下一步
  8. 可选:添加说明标记。
  9. 点击创建访问密钥
  10. 点击下载 CSV 文件,保存访问密钥密钥以供日后参考。
  11. 点击完成
  12. 选择权限标签页。
  13. 权限政策部分中,点击添加权限
  14. 选择添加权限
  15. 选择直接附加政策
  16. 搜索并选择 AmazonS3FullAccess 政策。
  17. 点击下一步
  18. 点击添加权限

设置 Feed

您可以通过两种不同的入口点在 Google SecOps 平台中设置 Feed:

  • SIEM 设置 > Feed
  • 内容中心 > 内容包

通过“SIEM 设置”>“Feed”设置 Feed

如需配置 Feed,请按以下步骤操作:

  1. 依次前往 SIEM 设置> Feed
  2. 点击添加新 Feed
  3. 在下一页上,点击配置单个 Feed
  4. Feed name 字段中,输入 Feed 的名称(例如 Snowflake Logs)。
  5. 选择 Amazon S3 作为来源类型
  6. 选择 Snowflake 作为日志类型
  7. 点击下一步
  8. 为以下输入参数指定值:

    • 区域:Amazon S3 存储桶所在的区域。
    • S3 URI:存储桶 URI(格式应为:s3://your-log-bucket-name/)。 请替换以下内容:
      • your-log-bucket-name:相应存储桶的名称。
    • URI is a(URI 是):选择目录目录(包括子目录)
    • 来源删除选项:根据您的偏好设置选择删除选项。
    • 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
    • 私有访问密钥:有权访问 S3 存储桶的用户的私有密钥。
  9. 点击下一步

  10. 最终确定界面中查看新的 Feed 配置,然后点击提交

设置来自内容中心的 Feed

为以下字段指定值:

  • 区域:Amazon S3 存储桶所在的区域。

    • S3 URI:存储桶 URI(格式应为:s3://your-log-bucket-name/)。 请替换以下内容:
      • your-log-bucket-name:相应存储桶的名称。
    • URI is a(URI 是):选择目录目录(包括子目录)
    • 来源删除选项:根据您的偏好设置选择删除选项。
    • 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
    • 私有访问密钥:有权访问 S3 存储桶的用户的私有密钥。

高级选项

  • Feed 名称:用于标识 Feed 的预填充值。
  • 来源类型:用于将日志收集到 Google SecOps 中的方法。
  • 资源命名空间:与 Feed 关联的命名空间。
  • 提取标签:应用于相应 Feed 中所有事件的标签。

需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。