Snowflake ログを収集する
このドキュメントでは、AWS S3 を使用して Snowflake ログを Google Security Operations に取り込む方法について説明します。パーサーは、Snowflake ログ形式を処理するために特別に設計された一連の Grok パターンと KV パターン マッチング ルールを使用して、ログ メッセージからフィールドを抽出します。次に、抽出されたフィールドを統合データモデル(UDM)にマッピングし、追加のコンテキストでデータを拡充して、さらなる分析のために表現を標準化します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- AWS への特権アクセス
- Snowflake への特権アクセス(ACCOUNTADMIN)
Amazon S3 バケットを構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- バケットの名前とリージョンを後で参照できるように保存します。
Snowflake AWS IAM ポリシーを構成する
- AWS Management Console にログインします。
- [IAM] を検索して選択します。
- [Account settings] を選択します。
- [エンドポイント] リストの [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)で、[ロール] を選択します。
- [Create role] をクリックします。
- 信頼できるエンティティ タイプとして [AWS account] を選択します。
- [Another AWS account] を選択します。
- [アカウント ID] フィールドに、ご自身の AWS アカウント ID を一時的に入力します。後で、信頼関係を変更して Snowflake へのアクセス権を付与します。
- [外部 ID の要求] オプションを選択します。
- プレースホルダ ID(0000 など)を入力します。後のステップで、IAM ロールの信頼関係を変更し、ストレージ統合の外部 ID を指定します。
- [次へ] をクリックします。
- 以前に作成した IAM ポリシーを選択します。
- [次へ] をクリックします。
- 役割の名前と説明を入力します。
- [Create role] をクリックします。
- ロールの概要ページで、[Role ARN value] をコピーして保存します。
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 Management Console に移動します。
- [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 を構成する
アンロード コマンドを実行して、テーブルからステージングにデータをエクスポートし、さらに 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 Management Console にログインします。
- IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成した [ユーザー] を選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックして、[アクセスキー] と [シークレット アクセスキー] を保存し、今後の参照に備えます。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションの [権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索して選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
フィードを設定する
Google SecOps プラットフォームでフィードを設定するには、次の 2 つのエントリ ポイントがあります。
- [SIEM 設定] > [フィード]
- [Content Hub] > [Content Packs]
[SIEM 設定] > [フィード] でフィードを設定する
フィードを構成する手順は次のとおりです。
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Snowflake Logs)。
- [ソースタイプ] として [Amazon S3] を選択します。
- [ログタイプ] として [Snowflake] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- リージョン: Amazon S3 バケットが配置されているリージョン。
- S3 URI: バケット URI(形式は
s3://your-log-bucket-name/
にする必要があります)。次の内容を置き換えます。your-log-bucket-name
: バケットの名前。
- URI is a: [ディレクトリ] または [サブディレクトリを含むディレクトリ] を選択します。
- Source deletion options: 必要に応じて削除オプションを選択します。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
コンテンツ ハブからフィードを設定する
次のフィールドに値を指定します。
リージョン: Amazon S3 バケットが配置されているリージョン。
- S3 URI: バケット URI(形式は
s3://your-log-bucket-name/
にする必要があります)。次の内容を置き換えます。your-log-bucket-name
: バケットの名前。
- URI is a: [ディレクトリ] または [サブディレクトリを含むディレクトリ] を選択します。
- Source deletion options: 必要に応じて削除オプションを選択します。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
- S3 URI: バケット URI(形式は
詳細オプション
- フィード名: フィードを識別する事前入力された値。
- ソースタイプ: Google SecOps にログを収集するために使用される方法。
- アセットの名前空間: フィードに関連付けられた名前空間。
- Ingestion Labels: このフィードのすべてのイベントに適用されるラベル。
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。