Snowflake 로그 수집

다음에서 지원:

이 문서에서는 AWS S3를 사용하여 Snowflake 로그를 Google Security Operations로 수집하는 방법을 설명합니다. 파서는 Snowflake 로그 형식을 처리하도록 특별히 설계된 일련의 Grok 및 KV 패턴 일치 규칙을 사용하여 로그 메시지에서 필드를 추출합니다. 그런 다음 추출된 필드를 통합 데이터 모델 (UDM)에 매핑하여 추가 컨텍스트로 데이터를 보강하고 추가 분석을 위해 표현을 표준화합니다.

시작하기 전에

다음 기본 요건이 충족되었는지 확인합니다.

  • Google SecOps 인스턴스
  • AWS에 대한 액세스 권한
  • Snowflake에 대한 액세스 권한 (ACCOUNTADMIN)

Amazon S3 버킷 구성

  1. 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
  2. 나중에 참조할 수 있도록 버킷 이름리전을 저장합니다.

Snowflake AWS IAM 정책 구성

  1. AWS 관리 콘솔에 로그인합니다.
  2. IAM을 검색하여 선택합니다.
  3. 계정 설정을 선택합니다.
  4. 엔드포인트 목록의 보안 토큰 서비스 (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)에서 역할을 선택합니다.
  2. 역할 만들기를 클릭합니다.
  3. 신뢰할 수 있는 항목 유형으로 AWS 계정을 선택합니다.
  4. 다른 AWS 계정을 선택합니다.
  5. '계정 ID' 필드에 자신의 AWS 계정 ID를 일시적으로 입력합니다. 나중에 신뢰 관계를 수정하고 Snowflake에 액세스 권한을 부여합니다.
  6. 외부 ID 필요 옵션을 선택합니다.
  7. 0000과 같은 자리표시자 ID를 입력합니다. 나중에 IAM 역할의 신뢰 관계를 수정하고 스토리지 통합의 외부 ID를 지정합니다.
  8. 다음을 클릭합니다.
  9. 앞에서 만든 IAM 정책을 선택합니다.
  10. 다음을 클릭합니다.
  11. 역할의 이름설명을 입력합니다.
  12. 역할 만들기를 클릭합니다.
  13. 역할 요약 페이지에서 역할 ARN 값을 복사하여 저장합니다.

Snowflake S3 통합 구성

  1. Snowflake db에 연결합니다.
  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. 권한 추가를 클릭합니다.

피드 설정

피드를 구성하려면 다음 단계를 따르세요.

  1. SIEM 설정> 피드로 이동합니다.
  2. 새 피드 추가를 클릭합니다.
  3. 다음 페이지에서 단일 피드 구성을 클릭합니다.
  4. 피드 이름 필드에 피드 이름을 입력합니다 (예: Snowflake 로그).
  5. 소스 유형으로 Amazon S3 V2를 선택합니다.
  6. 로그 유형으로 Snowflake를 선택합니다.
  7. 다음을 클릭합니다.
  8. 다음 입력 매개변수의 값을 지정합니다.

    • S3 URI: 버킷 URI (형식은 s3://your-log-bucket-name/이어야 함). 다음을 대체하세요.
      • your-log-bucket-name: 버킷의 이름입니다.
    • 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
  9. 다음을 클릭합니다.

  10. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.

UDM 매핑 테이블

로그 필드 UDM 매핑 논리
column4_label additional.fields 병합됨
column7_label additional.fields 병합됨
first_authentication_factor_label additional.fields 병합됨
host_list additional.fields 병합됨
query_text_label additional.fields 병합됨
query_type_label additional.fields 병합됨
roleIds_list additional.fields 병합됨
roleNames_list additional.fields 병합됨
rolecount_label additional.fields 병합됨
user_count_label additional.fields 병합됨
has_principal extensions.auth.type 매핑됨: trueAUTHTYPE_UNSPECIFIED
START_TIME metadata.event_timestamp yyyy-MM-dd HH:mm:ss.SSS Z로 파싱됨
column2 metadata.event_timestamp yyyy-MM-dd HH:mm:ss.SSS Z로 파싱됨
column20 metadata.event_timestamp yyyy-MM-dd HH:mm:ss.SSS Z로 파싱됨
ts metadata.event_timestamp ISO8601로 파싱됨
event_type metadata.event_type 직접 매핑됨
has_principal metadata.event_type 매핑됨: trueNETWORK_CONNECTION, trueSTATUS_UPDATE, trueUSER_LOGIN
has_principal_user metadata.event_type 매핑됨: trueUSER_UNCATEGORIZED
column10 metadata.product_event_type 직접 매핑됨
QUERY_ID metadata.product_log_id 직접 매핑됨
column1 metadata.product_log_id 직접 매핑됨
column6 metadata.product_version 직접 매핑됨
SESSION_ID network.http.session_id 직접 매핑됨
RECEIVED_BYTES network.received_bytes 이름이 변경됨/매핑됨
BYTES_SENT_OVER_THE_NETWORK network.sent_bytes 이름이 변경됨/매핑됨
SENT_BYTES network.sent_bytes 이름이 변경됨/매핑됨
APPLICATION principal.application 직접 매핑됨
data.user_name principal.asset.hostname 직접 매핑됨
CLIENT_IP principal.asset.ip 병합됨
IP principal.asset.ip 병합됨
column5 principal.asset.ip 병합됨
SOURCE_REGION principal.cloud.availability_zone 직접 매핑됨
SOURCE_CLOUD principal.cloud.environment 매핑됨: (?i)azureMICROSOFT_AZURE, (?i)amazonAMAZON_WEB_SERVICES, (?i)google ...
data.user_name principal.hostname 직접 매핑됨
CLIENT_IP principal.ip 병합됨
IP principal.ip 병합됨
column5 principal.ip 병합됨
OS principal.platform 매핑됨: (?i)LinuxLINUX, (?i)windowsWINDOWS, (?i)mac/iosMAC
OS_VERSION principal.platform_version 직접 매핑됨
SOURCE_CLOUD_label principal.resource.attribute.labels 병합됨
roles principal.user.attribute.roles 병합됨
data.role_name principal.user.role_name 직접 매핑됨
column9 principal.user.user_display_name 직접 매핑됨
USER_NAME principal.user.userid 직접 매핑됨
column10 principal.user.userid 직접 매핑됨
column3 principal.user.userid 직접 매핑됨
EXECUTION_STATUS security_result.action 매핑됨: (?i)successaction, (?i)failsecurity_result_action_block
STATUS security_result.action 매핑됨: (?i)successaction, (?i)failaction
action security_result.action 병합됨
security_result_action_block security_result.action 병합됨
OCSP_MODE security_result.action_details 직접 매핑됨
column11 security_result.action_details 직접 매핑됨
column3 security_result.action_details 직접 매핑됨
BYTES_DELETED_label security_result.detection_fields 병합됨
BYTES_READ_FROM_RESULT_label security_result.detection_fields 병합됨
BYTES_SCANNED_label security_result.detection_fields 병합됨
BYTES_SPILLED_TO_LOCAL_STORAGE_label security_result.detection_fields 병합됨
BYTES_SPILLED_TO_REMOTE_STORAGE_label security_result.detection_fields 병합됨
BYTES_WRITTEN_TO_RESULT_label security_result.detection_fields 병합됨
BYTES_WRITTEN_label security_result.detection_fields 병합됨
CHILD_QUERIES_WAIT_TIME_label security_result.detection_fields 병합됨
CLUSTER_NUMBER_label security_result.detection_fields 병합됨
COMPILATION_TIME_label security_result.detection_fields 병합됨
CREDITS_USED_CLOUD_SERVICES_label security_result.detection_fields 병합됨
DATABASE_ID_label security_result.detection_fields 병합됨
DATABASE_NAME_label security_result.detection_fields 병합됨
END_TIME_label security_result.detection_fields 병합됨
ERROR_MESSAGE_label security_result.detection_fields 병합됨
EXECUTION_TIME_label security_result.detection_fields 병합됨
EXTERNAL_FUNCTION_TOTAL_INVOCATIONS_label security_result.detection_fields 병합됨
EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES_label security_result.detection_fields 병합됨
EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS_label security_result.detection_fields 병합됨
EXTERNAL_FUNCTION_TOTAL_SENT_BYTES_label security_result.detection_fields 병합됨
EXTERNAL_FUNCTION_TOTAL_SENT_ROWS_label security_result.detection_fields 병합됨
INBOUND_DATA_TRANSFER_BYTES_label security_result.detection_fields 병합됨
IS_CLIENT_GENERATED_STATEMENT_label security_result.detection_fields 병합됨
LIST_EXTERNAL_FILES_TIME_label security_result.detection_fields 병합됨
OUTBOUND_DATA_TRANSFER_BYTES_label security_result.detection_fields 병합됨
PARTITIONS_SCANNED_label security_result.detection_fields 병합됨
PARTITIONS_TOTAL_label security_result.detection_fields 병합됨
PERCENTAGE_SCANNED_FROM_CACHE_label security_result.detection_fields 병합됨
QUERY_ACCELERATION_BYTES_SCANNED_label security_result.detection_fields 병합됨
QUERY_ACCELERATION_PARTITIONS_SCANNED_label security_result.detection_fields 병합됨
QUERY_ACCELERATION_UPPER_LIMIT_SCALE_FACTOR_label security_result.detection_fields 병합됨
QUERY_HASH_VERSION_label security_result.detection_fields 병합됨
QUERY_HASH_label security_result.detection_fields 병합됨
QUERY_LOAD_PERCENT_label security_result.detection_fields 병합됨
QUERY_PARAMETERIZED_HASH_VERSION_label security_result.detection_fields 병합됨
QUERY_TAG_label security_result.detection_fields 병합됨
QUERY_TYPE_label security_result.detection_fields 병합됨
QUEUED_OVERLOAD_TIME_label security_result.detection_fields 병합됨
QUEUED_PROVISIONING_TIME_label security_result.detection_fields 병합됨
QUEUED_REPAIR_TIME_label security_result.detection_fields 병합됨
RELEASE_VERSION_label security_result.detection_fields 병합됨
ROLE_TYPE_label security_result.detection_fields 병합됨
ROWS_DELETED_label security_result.detection_fields 병합됨
ROWS_INSERTED_label security_result.detection_fields 병합됨
ROWS_PRODUCED_label security_result.detection_fields 병합됨
ROWS_UNLOADED_label security_result.detection_fields 병합됨
ROWS_UPDATED_label security_result.detection_fields 병합됨
ROWS_WRITTEN_TO_RESULT_label security_result.detection_fields 병합됨
SCHEMA_ID_label security_result.detection_fields 병합됨
SCHEMA_NAME_label security_result.detection_fields 병합됨
TOTAL_ELAPSED_TIME_label security_result.detection_fields 병합됨
TRANSACTION_BLOCKED_TIME_label security_result.detection_fields 병합됨
TRANSACTION_ID_label security_result.detection_fields 병합됨
WAREHOUSE_ID_label security_result.detection_fields 병합됨
WAREHOUSE_NAME_label security_result.detection_fields 병합됨
WAREHOUSE_SIZE_label security_result.detection_fields 병합됨
WAREHOUSE_TYPE_label security_result.detection_fields 병합됨
authentication_factor_label security_result.detection_fields 병합됨
column4_label security_result.detection_fields 병합됨
column6_label security_result.detection_fields 병합됨
column7_label security_result.detection_fields 병합됨
column8_label security_result.detection_fields 병합됨
event_id_label security_result.detection_fields 병합됨
event_type_label security_result.detection_fields 병합됨
is_success_label security_result.detection_fields 병합됨
python_compiler_label security_result.detection_fields 병합됨
python_runtime_label security_result.detection_fields 병합됨
python_version_label security_result.detection_fields 병합됨
reported_client_type_label security_result.detection_fields 병합됨
reported_client_version_label security_result.detection_fields 병합됨
tracing_label security_result.detection_fields 병합됨
EXECUTION_STATUS security_result.summary 직접 매핑됨
STATUS security_result.summary 직접 매핑됨
column17 security_result.summary 직접 매핑됨
TARGET_REGION target.cloud.availability_zone 직접 매핑됨
TARGET_CLOUD target.cloud.environment 매핑됨: (?i)azureMICROSOFT_AZURE, (?i)amazonAMAZON_WEB_SERVICES, (?i)google ...
TARGET_CLOUD_label target.resource.attribute.labels 병합됨
column2_label target.resource.attribute.labels 병합됨
column7_label target.resource.attribute.labels 병합됨
USER_NAME target.user.userid 직접 매핑됨
column4 target.user.userid 직접 매핑됨
해당 사항 없음 extensions.auth.type 상수: AUTHTYPE_UNSPECIFIED
해당 사항 없음 metadata.event_type 상수: NETWORK_CONNECTION
해당 사항 없음 metadata.product_name 상수: SNOWFLAKE
해당 사항 없음 metadata.vendor_name 상수: SNOWFLAKE
해당 사항 없음 principal.cloud.environment 상수: MICROSOFT_AZURE
해당 사항 없음 principal.platform 상수: LINUX
해당 사항 없음 target.cloud.environment 상수: MICROSOFT_AZURE

변경 로그

이 파서의 변경 로그 보기

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.