收集 Snowflake 記錄
本文件說明如何使用 AWS S3 將 Snowflake 記錄匯入 Google Security Operations。剖析器會使用一系列 Grok 和 KV 模式比對規則,從記錄訊息中擷取欄位,這些規則專門用於處理 Snowflake 記錄格式。接著,系統會將擷取的欄位對應至統一資料模型 (UDM),為資料增添額外脈絡,並將表示方式標準化,以利進一步分析。
事前準備
請確認您已具備下列必要條件:
- Google SecOps 執行個體
- AWS 特權存取權
- 對 Snowflake 的特殊存取權 (ACCOUNTADMIN)
設定 Amazon S3 值區
- 按照這份使用者手冊的說明建立 Amazon S3 值區:建立值區
- 請記下值區的「名稱」和「地區」,以供日後參考。
設定 Snowflake AWS 身分與存取權管理政策
- 登入 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 身分與存取權管理角色
- 在 AWS Identity and Access Management (IAM) 中,選取「Roles」。
- 按一下「建立角色」。
- 選取「AWS 帳戶」做為信任實體類型。
- 選取「其他 AWS 帳戶」。
- 在「帳戶 ID」欄位中,暫時輸入自己的 AWS 帳戶 ID。稍後,您將修改信任關係並授予 Snowflake 存取權。
- 選取「Require external ID」選項。
- 輸入預留位置 ID,例如 0000。在後續步驟中,您將修改 IAM 角色的信任關係,並指定儲存空間整合作業的外部 ID。
- 點選「下一步」。
- 選取先前建立的 IAM 政策。
- 點選「下一步」。
- 輸入角色的名稱和說明。
- 按一下「建立角色」。
- 在角色摘要頁面上,複製並儲存「Role ARN」值。
設定 Snowflake S3 整合
- 連線至 Snowflake 資料庫。
請替換下列欄位並執行指令:
<integration_name>
是新整合項目的名稱 (例如 s3_integration)。<iam_role>
是您先前建立的角色的 Amazon Resource Name (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 管理主控台。
- 依序選取「身分與存取權管理」>「角色」。
- 選取先前建立的角色。
- 選取「信任關係」分頁標籤。
- 按一下「編輯信任政策」。
請使用 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 匯出資料
執行卸載指令,將資料從資料表匯出至階段,再匯出至 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 使用者中的使用者手冊建立使用者。
- 選取已建立的「使用者」。
- 選取「安全性憑證」分頁標籤。
- 在「Access Keys」部分,按一下「Create Access Key」。
- 將「用途」選項設為「第三方服務」。
- 點選「下一步」。
- 選用:新增說明標記。
- 按一下「建立存取金鑰」。
- 按一下「下載 CSV 檔案」,即可儲存「存取金鑰」和「密式存取金鑰」,供日後參考。
- 按一下 [完成]。
- 選取「權限」分頁標籤。
- 在「權限政策」部分中,按一下「新增權限」。
- 選取「新增權限」。
- 選取「直接附加政策」。
- 搜尋並選取「AmazonS3FullAccess」AmazonS3FullAccess政策。
- 點選「下一步」。
- 按一下「新增權限」。
設定動態饋給
在 Google SecOps 平台中,有兩個不同的入口可用來設定動態消息:
- SIEM 設定 > 動態饋給
- 內容中心 > 內容包
依序前往「SIEM 設定」>「動態饋給」,設定動態饋給
如要設定動態饋給,請按照下列步驟操作:
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一頁中,按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如「Snowflake Logs」)。
- 選取「Amazon S3」做為「來源類型」。
- 選取「Snowflake」做為「記錄類型」。
- 點選「下一步」。
指定下列輸入參數的值:
- 區域:Amazon S3 值區所在的區域。
- S3 URI:值區 URI (格式應為:
s3://your-log-bucket-name/
)。 請替換下列項目:your-log-bucket-name
:值區名稱。
- URI 是:選取「目錄」或「包含子目錄的目錄」。
- 來源刪除選項:根據偏好選取刪除選項。
- 存取金鑰 ID:可存取 S3 值區的使用者存取金鑰。
- 私密存取金鑰:具有 S3 值區存取權的使用者私密金鑰。
點選「下一步」。
在「完成」畫面中查看新的動態饋給設定,然後按一下「提交」。
透過內容中心設定動態饋給
指定下列欄位的值:
區域:Amazon S3 值區所在的區域。
- S3 URI:值區 URI (格式應為:
s3://your-log-bucket-name/
)。 請替換下列項目:your-log-bucket-name
:值區名稱。
- URI 是:選取「目錄」或「包含子目錄的目錄」。
- 來源刪除選項:根據偏好選取刪除選項。
- 存取金鑰 ID:可存取 S3 值區的使用者存取金鑰。
- 私密存取金鑰:具有 S3 值區存取權的使用者私密金鑰。
- S3 URI:值區 URI (格式應為:
進階選項
- 動態饋給名稱:預先填入的值,用於識別動態饋給。
- 來源類型:用於收集記錄並匯入 Google SecOps 的方法。
- 素材資源命名空間:與動態饋給相關聯的命名空間。
- 攝入標籤:套用至這個動態饋給中所有事件的標籤。
還有其他問題嗎?向社群成員和 Google SecOps 專家尋求解答。