Cloudflare Page Shield 로그 수집
이 문서에서는 Amazon S3를 사용하여 Cloudflare Page Shield 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
Page Shield는 스크립트, 연결, 쿠키 등 웹사이트 방문자가 로드하는 리소스를 관리하고 리소스가 변경되거나 악성으로 간주되면 알림을 트리거합니다.
시작하기 전에
- Google SecOps 인스턴스
- Page Shield가 사용 설정된 Cloudflare 계정
- Cloudflare 대시보드에 대한 액세스 권한
- AWS(S3, IAM)에 대한 액세스 권한
이 옵션은 Cloudflare Logpush를 사용하여 Page Shield 이벤트를 Amazon S3로 내보내고 Google SecOps가 이를 수집합니다.
Page Shield 사용 설정
- Cloudflare 대시보드에 로그인합니다.
- 계정과 도메인을 선택합니다.
- 보안 > 페이지 보호로 이동합니다.
- 페이지 실드 사용 설정을 클릭합니다.
Amazon S3 버킷 만들기
- Amazon S3 콘솔을 엽니다.
- 버킷 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 버킷 이름: 버킷의 의미 있는 이름을 입력합니다 (예:
cloudflare-pageshield-logs). - 리전: 원하는 AWS 리전을 선택합니다 (예:
us-east-1).
- 버킷 이름: 버킷의 의미 있는 이름을 입력합니다 (예:
- 만들기를 클릭합니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다.
S3 액세스 권한이 있는 IAM 사용자 만들기
- IAM 콘솔을 엽니다.
- 사용자 > 사용자 추가를 클릭합니다.
- 사용자 이름을 입력합니다 (예:
chronicle-s3-user). - 프로그래매틱 액세스를 선택합니다.
- 다음: 권한을 클릭합니다.
- 기존 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음: 태그를 클릭합니다.
- 다음: 검토를 클릭합니다.
- 사용자 만들기를 클릭합니다.
- .csv 파일 다운로드를 클릭하여 액세스 키 ID와 보안 비밀 액세스 키를 저장합니다.
Cloudflare용 S3 버킷 정책 구성
- Amazon S3 콘솔에서 버킷을 선택합니다.
- 권한 > 버킷 정책을 클릭합니다.
- 수정을 클릭합니다.
다음 정책을 붙여넣고
<BUCKET_NAME>을 버킷 이름으로 바꿉니다.{ "Id": "Policy1506627184792", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1506627150918", "Action": ["s3:PutObject"], "Effect": "Allow", "Resource": "arn:aws:s3:::<BUCKET_NAME>/*", "Principal": { "AWS": ["arn:aws:iam::391854517948:user/cloudflare-logpush"] } } ] }변경사항 저장을 클릭합니다.
Cloudflare Logpush 작업 만들기
- Cloudflare 대시보드에 로그인합니다.
- 계정과 도메인을 선택합니다.
- 분석 및 로그 > 로그로 이동합니다.
- Logpush 작업 만들기를 클릭합니다.
- 대상 선택에서 Amazon S3를 선택합니다.
- 다음 대상 정보를 입력합니다.
- 버킷 이름: S3 버킷 이름 (예:
cloudflare-pageshield-logs)을 입력합니다. - 버킷 리전: S3 버킷과 일치하는 리전을 선택합니다.
- 버킷 경로 (선택사항): 경로 접두사 (예:
pageshield/)를 입력합니다.
- 버킷 이름: S3 버킷 이름 (예:
- 계속을 클릭합니다.
- 소유권을 증명하기 위해 Cloudflare에서 지정된 대상으로 파일을 전송합니다. 토큰을 찾으려면 소유권 확인 파일의 개요 탭에서 열기 버튼을 선택한 다음 Cloudflare 대시보드에 붙여넣어 버킷에 대한 액세스 권한을 확인합니다. 소유권 토큰을 입력하고 계속을 선택합니다.
- 데이터 세트 선택에서 Page Shield 이벤트를 선택합니다.
- 다음을 클릭합니다.
- logpush 작업을 구성합니다.
- 작업 이름: 설명이 포함된 이름을 입력합니다 (예:
pageshield-to-s3). - 로그가 일치하는 경우: 모든 이벤트를 포함하려면 비워 두거나 필요에 따라 필터를 구성합니다.
- 다음 필드 보내기: 모든 필드를 선택하거나 특정 필드를 선택합니다.
- 작업 이름: 설명이 포함된 이름을 입력합니다 (예:
- 제출을 클릭합니다.
Page Shield 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
Cloudflare Page Shield S3). - 소스 유형으로 Amazon S3 V2를 선택합니다.
- 로그 유형으로 Cloudflare Page Shield를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
S3 URI: 버킷 URI를
s3://<BUCKET_NAME>/<BUCKET_PATH>/형식으로 입력합니다.소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다.
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
- 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키
보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 로직 |
|---|---|---|
| URLContainsCDNCGIPath | event.idm.read_only_udm.additional.fields.CGI_label | URLContainsCDNCGIPath에서 가져온 값으로, 키가 'CGI'인 라벨에 string_value로 설정됩니다. |
| 작업 | event.idm.read_only_udm.additional.fields.action_label | 작업에서 가져온 값으로, 키가 'action'인 라벨에 string_value로 설정됩니다. |
| resource.first_page_url | event.idm.read_only_udm.additional.fields.first_page_label | resource.first_page_url에서 가져온 값으로, 키가 'first_page_url'인 라벨의 string_value로 설정됩니다. |
| resource.last_page_url | event.idm.read_only_udm.additional.fields.last_page_label | resource.last_page_url에서 가져온 값으로, 키가 'last_page_url'인 라벨에 string_value로 설정됩니다. |
| 이름 | event.idm.read_only_udm.additional.fields.name_label | 이름에서 가져온 값으로, 키가 'name'인 라벨에 string_value로 설정됩니다. |
| ts | event.idm.read_only_udm.metadata.event_timestamp | ts (UNIX)에서 timestamp로 변환됨 |
| event.idm.read_only_udm.metadata.event_type | has_principal, has_target, has_target_user를 기반으로 파생됨: principal과 target이 모두 있는 경우 NETWORK_CONNECTION, target_user가 있는 경우 USER_UNCATEGORIZED, principal이 있는 경우 STATUS_UPDATE, 그 외의 경우 GENERIC_EVENT | |
| resource.url | event.idm.read_only_udm.network.http.referral_url | resource.url에서 가져온 값 |
| 호스트 | event.idm.read_only_udm.principal.asset.hostname | 호스트 또는 host.hostname에서 가져온 값 |
| 호스트 | event.idm.read_only_udm.principal.hostname | 호스트 또는 host.hostname에서 가져온 값 |
| alert_type | event.idm.read_only_udm.principal.resource.attribute.labels.alert_type_label | alert_type에서 가져온 값으로, 키가 'alert_type'인 라벨의 값으로 설정됩니다. |
| resource.cryptomining_score | event.idm.read_only_udm.principal.resource.attribute.labels.crypto_label | resource.cryptomining_score에서 가져온 값으로, 키가 'cryptominingscore%{index2}'인 라벨의 값으로 설정됩니다. |
| resource.dataflow_score | event.idm.read_only_udm.principal.resource.attribute.labels.dataflow_label | resource.dataflow_score에서 가져온 값이며, 키가 'dataflowscore%{index2}'인 라벨의 값으로 설정됩니다. |
| policie.description | event.idm.read_only_udm.principal.resource.attribute.labels.desc_label | policie.description에서 가져온 값으로, 키가 'description_%{index}'인 라벨의 값으로 설정됩니다. |
| version.fetched_at | event.idm.read_only_udm.principal.resource.attribute.labels.fetched_at_label | version.fetched_at에서 가져온 값이며, 키가 'fetchedat%{index2}'인 라벨의 값으로 설정됩니다. |
| version.hash | event.idm.read_only_udm.principal.resource.attribute.labels.hash_label | version.hash에서 가져온 값으로, 키가 'hash_%{index2}'인 라벨의 값으로 설정됩니다. |
| policie.id | event.idm.read_only_udm.principal.resource.attribute.labels.id_label | policie.id에서 가져온 값으로, 키가 'policyid%{index}'인 라벨의 값으로 설정됩니다. |
| data.options.remove_dashboard_links | event.idm.read_only_udm.principal.resource.attribute.labels.remove_dash_label | data.options.remove_dashboard_links에서 가져온 값으로, 키가 'remove_dashboard_links'인 라벨의 값으로 설정됩니다. |
| resource.resource_type | event.idm.read_only_udm.principal.resource.attribute.labels.res_type_label | resource.resource_type에서 가져온 값으로, 키가 'resourcetype%{index2}'인 라벨의 값으로 설정됩니다. |
| data.type | event.idm.read_only_udm.principal.resource.attribute.labels.type_label | data.type에서 가져온 값이며, 키가 'type'인 라벨의 값으로 설정됩니다. |
| data.zones | event.idm.read_only_udm.principal.resource.attribute.labels.zones_label | data.zones에서 가져온 값으로, 키가 'zones'인 라벨의 값으로 설정됩니다. |
| resource.id | event.idm.read_only_udm.principal.resource.id | resource.id에서 가져온 값 |
| PageURL | event.idm.read_only_udm.principal.url | PageURL에서 가져온 값 |
| account_id | event.idm.read_only_udm.principal.user.product_object_id | account_id에서 가져온 값 |
| policy_id | event.idm.read_only_udm.security_result.detection_fields.policy_id_label | policy_id에서 가져온 값으로, 키가 'policy_id'인 라벨의 값으로 설정됩니다. |
| policy_name | event.idm.read_only_udm.security_result.detection_fields.policy_name_label | policy_name에서 가져온 값으로, 키가 'policy_name'인 라벨의 값으로 설정됩니다. |
| 텍스트 | event.idm.read_only_udm.security_result.description | 텍스트에서 가져온 값 |
| resource.first_seen_at | event.idm.read_only_udm.security_result.first_discovered_time | resource.first_seen_at에서 ISO8601 타임스탬프로 변환됨 |
| PolicyID | event.idm.read_only_udm.security_result.rule_name | PolicyID에서 가져온 값 |
| data.severity | event.idm.read_only_udm.security_result.severity | data.severity에서 파생됩니다. 'INFO'인 경우 'INFORMATIONAL', 'WARN'인 경우 'MEDIUM', 그 외의 경우 'UNKNOWN_SEVERITY' |
| URL | event.idm.read_only_udm.target.url | URL에서 가져온 값 |
| URLHost | event.idm.read_only_udm.target.user.email_addresses | 이메일 패턴과 일치하는 경우 URLHost에서 가져온 값 |
도움이 더 필요한가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.