Snowflake 로그 수집
이 문서에서는 AWS S3를 사용하여 Snowflake 로그를 Google Security Operations에 수집하는 방법을 설명합니다. 파서는 Snowflake 로그 형식을 처리하도록 특별히 설계된 일련의 Grok 및 KV 패턴 일치 규칙을 사용하여 로그 메시지에서 필드를 추출합니다. 그런 다음 추출된 필드를 통합 데이터 모델 (UDM)에 매핑하여 추가 컨텍스트로 데이터를 보강하고 추가 분석을 위해 표현을 표준화합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- AWS에 대한 액세스 권한
- Snowflake에 대한 액세스 권한 관리 (ACCOUNTADMIN)
Amazon S3 버킷 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다.
Snowflake AWS IAM 정책 구성
- AWS 관리 콘솔에 로그인합니다.
- IAM을 검색하여 선택합니다.
- 계정 설정을 선택합니다.
- 엔드포인트 목록의 보안 토큰 서비스 (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)에서 역할을 선택합니다.
- 역할 만들기를 클릭합니다.
- 신뢰할 수 있는 항목 유형으로 AWS 계정을 선택합니다.
- 다른 AWS 계정을 선택합니다.
- '계정 ID' 필드에 자신의 AWS 계정 ID를 일시적으로 입력합니다. 나중에 트러스트 관계를 수정하고 Snowflake에 액세스 권한을 부여합니다.
- 외부 ID 필요 옵션을 선택합니다.
- 0000과 같은 자리표시자 ID를 입력합니다. 나중에 IAM 역할의 신뢰 관계를 수정하고 스토리지 통합의 외부 ID를 지정합니다.
- 다음을 클릭합니다.
- 앞에서 만든 IAM 정책을 선택합니다.
- 다음을 클릭합니다.
- 역할의 이름과 설명을 입력합니다.
- 역할 만들기를 클릭합니다.
- 역할 요약 페이지에서 역할 ARN 값을 복사하여 저장합니다.
Snowflake S3 통합 구성
- Snowflake db에 연결합니다.
다음 필드를 바꾸고 명령어를 실행합니다.
<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 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드
- 콘텐츠 허브 > 콘텐츠 팩
SIEM 설정 > 피드에서 피드 설정
피드를 구성하려면 다음 단계를 따르세요.
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: Snowflake 로그).
- 소스 유형으로 Amazon S3를 선택합니다.
- 로그 유형으로 Snowflake를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI (형식은
s3://your-log-bucket-name/
이어야 함). 다음을 대체합니다.your-log-bucket-name
: 버킷의 이름입니다.
- URI is a: Directory 또는 Directory which includes subdirectories를 선택합니다.
- 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 액세스 키 ID: S3 버킷에 액세스할 수 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
콘텐츠 허브에서 피드 설정하기
다음 필드의 값을 지정합니다.
리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI (형식은
s3://your-log-bucket-name/
이어야 함). 다음을 대체합니다.your-log-bucket-name
: 버킷의 이름입니다.
- URI is a: Directory 또는 Directory which includes subdirectories를 선택합니다.
- 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 액세스 키 ID: S3 버킷에 액세스할 수 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- S3 URI: 버킷 URI (형식은
고급 옵션
- 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
- 소스 유형: Google SecOps로 로그를 수집하는 데 사용되는 방법입니다.
- 애셋 네임스페이스: 피드와 연결된 네임스페이스입니다.
- 수집 라벨: 이 피드의 모든 이벤트에 적용되는 라벨입니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.