Auth0 로그 수집
개요
이 파서는 JSON 형식의 메시지에서 Auth0 로그 이벤트를 추출합니다. UDM 필드를 초기화하고, JSON 페이로드를 파싱하고, 관련 필드를 UDM 스키마에 매핑하고, type 필드를 기반으로 이벤트를 분류하여 적절한 보안 작업과 이벤트 유형을 설정합니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- 필요한 권한이 있는 Auth0 계정
Auth0 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: Auth0 로그).
- 소스 유형으로 Webhook을 선택합니다.
- 로그 유형으로 AUTH_ZERO를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 다음 입력 매개변수의 값을 지정합니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
\n
). - 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- 분할 구분 기호: 로그 줄을 구분하는 데 사용되는 구분 기호입니다(예:
- 다음을 클릭합니다.
- 확정 화면에서 피드 구성을 검토한 다음 제출을 클릭합니다.
- 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.
- 비밀 키를 복사하여 저장합니다. 이 보안 비밀 키는 다시 볼 수 없습니다. 필요한 경우 새 보안 비밀 키를 재생성할 수 있지만 이 작업을 하면 이전 보안 비밀 키는 더 이상 사용할 수 없게 됩니다.
- 세부정보 탭의 엔드포인트 정보 필드에서 피드 엔드포인트 URL을 복사합니다. 클라이언트 애플리케이션에서 이 엔드포인트 URL을 지정해야 합니다.
- 완료를 클릭합니다.
웹훅 피드에 대한 API 키 만들기
Google Cloud 콘솔 > 사용자 인증 정보로 이동합니다.
사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.
Google Security Operations API에 대한 API 키 액세스를 제한합니다.
엔드포인트 URL 지정
- 클라이언트 애플리케이션에서 웹훅 피드에 제공된 HTTPS 엔드포인트 URL을 지정합니다.
다음 형식의 커스텀 헤더의 일부로 API 키와 보안 비밀 키를 지정하여 인증을 사용 설정합니다.
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
권장사항: API 키를 URL에 지정하는 대신 헤더로 지정하세요. 웹훅 클라이언트가 커스텀 헤더를 지원하지 않는 경우 다음 형식의 쿼리 매개변수를 사용하여 API 키와 보안 비밀 키를 지정할 수 있습니다.
ENDPOINT_URL?key=API_KEY&secret=SECRET
다음을 바꿉니다.
ENDPOINT_URL
: 피드 엔드포인트 URL입니다.API_KEY
: Google Security Operations에 인증하기 위한 API 키입니다.SECRET
: 피드를 인증하기 위해 생성한 보안 비밀 키입니다.
Google SecOps용 Auth0 웹훅 구성
- Auth0 대시보드에 액세스합니다.
- 모니터링 > 스트림으로 이동합니다.
- 로그 스트림 만들기를 클릭합니다.
- 커스텀 Webhook 버튼을 클릭하고 원하는 이름을 지정합니다. 예: Google SecOps Webhook
- 다음을 구성합니다.
- 페이로드 URL: Google SecOps API 엔드포인트 URL을 입력합니다.
- Content-Type: Content-Type 헤더를 application/json으로 설정합니다. 이렇게 하면 Google SecOps에 전송되는 데이터의 형식이 전달됩니다.
- 선택사항: 승인 토큰: 보안을 강화하기 위해 비밀을 구성합니다. 이 키는 웹훅 요청의 진위를 확인하는 데 사용됩니다.
페이로드 맞춤설정: 이벤트 카테고리를 수정하여 Google SecOps로 전송되는 페이로드를 맞춤설정할 수 있습니다. 이렇게 하면 Auth0 이벤트에서 특정 데이터 포인트를 선택하고 Google SecOps에 맞게 형식을 지정할 수 있습니다. 사용 가능한 컨텍스트 변수와 스크립팅 옵션에 관한 자세한 내용은 Auth0 문서를 참고하세요. 최종 페이로드가 예상되는 Google SecOps UDM 형식에 맞는지 확인합니다.
- 저장을 클릭하여 웹훅을 만듭니다.
- 후크와 연결된 이벤트를 트리거합니다 (예: 신규 사용자 등록, 로그인).
- Google SecOps 콘솔에서 피드를 확인하여 로그가 Google SecOps로 전송되고 있는지 확인합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
client_id |
principal.asset.product_object_id |
client_id 필드에서 직접 매핑됩니다. |
client_name |
principal.hostname |
client_name 필드에서 직접 매핑됩니다. |
connection |
security_result.description |
connection 필드에서 직접 매핑됩니다. |
connection_id |
security_result.rule_id |
connection_id 필드에서 직접 매핑됩니다. |
date |
metadata.event_timestamp |
ISO8601 형식을 사용하여 date 필드에서 파싱됩니다. |
description |
metadata.description |
description 필드에서 직접 매핑됩니다. |
details.error |
security_result.detection_fields |
details.error 필드에서 매핑되었습니다. 키는 'Error'입니다. |
details.error.oauthError |
security_result.detection_fields |
details.error.oauthError 필드에서 매핑되었습니다. 키는 'oauthError'입니다. |
details.error.type |
security_result.detection_fields |
details.error.type 필드에서 매핑되었습니다. 키는 'oauth_error_type'입니다. |
details.ipOnAllowlist |
security_result.detection_fields |
details.ipOnAllowlist 필드에서 매핑되었습니다. 키는 'ipOnAllowlist'입니다. |
details.link |
target.url |
details.link 필드가 있는 경우 이 필드에서 직접 매핑되고, 그렇지 않은 경우에는 다른 필드에서 파생됩니다 (아래 참고). |
details.request.auth.strategy |
security_result.detection_fields |
details.request.auth.strategy 필드에서 매핑되었습니다. 키는 'strategy'입니다. |
details.request.body.app_metadata.blockedReason |
security_result.detection_fields |
details.request.body.app_metadata.blockedReason 필드에서 매핑되었습니다. 키는 'blockedReason'입니다. |
details.request.body.app_metadata.customer_id |
target.user.product_object_id |
details.request.body.app_metadata.customer_id 필드에서 직접 매핑됩니다. |
details.request.body.app_metadata.migrated |
security_result.detection_fields |
details.request.body.app_metadata.migrated 필드에서 매핑되었습니다. 키가 '이전'되었습니다. |
details.request.channel |
security_result.detection_fields |
details.request.channel 필드에서 매핑되었습니다. 키는 'channel'입니다. |
details.request.method |
network.http.method |
대문자로 변환한 후 details.request.method 필드에서 직접 매핑됩니다. |
details.request.path |
target.url |
details.link 가 없는 경우 details.request.path 필드에서 직접 매핑되고, 그렇지 않은 경우에는 다른 필드에서 파생됩니다 (아래 참고). |
details.response.body.email |
target.user.email_addresses |
details.response.body.email 필드에서 직접 매핑됩니다. |
details.response.body.email_verified |
security_result.detection_fields |
details.response.body.email_verified 필드에서 매핑되었습니다. 키는 'email_verified'입니다. |
details.response.body.nickname |
target.user.user_display_name |
details.response.body.nickname 필드에서 직접 매핑됩니다. |
details.response.body.user_id |
target.user.userid |
details.response.body.user_id 필드에서 직접 매핑됩니다. |
details.response.statusCode |
network.http.response_code |
정수로 변환한 후 details.response.statusCode 필드에서 직접 매핑됩니다. |
details.return_to |
target.url |
details.link 및 details.request.path 가 없는 경우 details.return_to 필드에서 직접 매핑되고, 그렇지 않으면 다른 필드에서 파생됩니다 (아래 참고). |
details.session_id |
network.session_id |
details.session_id 필드에서 직접 매핑됩니다. |
details.stats.loginsCount |
additional.fields |
details.stats.loginsCount 필드에서 매핑되었습니다. 키는 'loginsCount'입니다. |
details.requiresVerification |
security_result.detection_fields |
details.requiresVerification 필드에서 매핑되었습니다. 키는 'requiresVerification'입니다. |
details.to |
target.user.email_addresses |
details.to 필드에서 직접 매핑됩니다. |
hostname |
target.hostname |
hostname 필드에서 직접 매핑됩니다. |
ip |
principal.ip |
ip 필드에서 직접 매핑됩니다. |
js_data.audience |
target.url |
details.link , details.request.path , details.return_to 가 없는 경우 js_data.audience 필드에서 직접 매핑됩니다. |
js_data.details.body.email_verified |
security_result.detection_fields |
js_data.details.body.email_verified 필드에서 매핑되었습니다. 키는 'email_verified'입니다. |
js_data.details.body.is_signup |
security_result.detection_fields |
js_data.details.body.is_signup 필드에서 매핑되었습니다. 키는 'is_signup'입니다. |
js_data.details.body.transaction.redirect_uri |
target.url |
details.link , details.request.path , details.return_to , js_data.audience 가 없는 경우 js_data.details.body.transaction.redirect_uri 필드에서 직접 매핑됩니다. |
js_data.scope |
security_result.detection_fields |
js_data.scope 필드에서 매핑되었습니다. 키는 'scope'입니다. |
js_data.tracking_id |
security_result.detection_fields |
js_data.tracking_id 필드에서 매핑되었습니다. 키는 'tracking_id'입니다. |
log_id |
metadata.product_log_id |
log_id 필드에서 직접 매핑됩니다. |
metadata.log_type |
metadata.log_type |
log_type 필드에서 직접 매핑됩니다. |
metadata.product_name |
metadata.product_name |
'AUTH_ZERO'로 설정합니다. |
metadata.vendor_name |
metadata.vendor_name |
'AUTH_ZERO'로 설정합니다. |
metadata.product_event_type |
metadata.product_event_type |
type 필드에서 직접 매핑됩니다. |
network.http.parsed_user_agent |
network.http.parsed_user_agent |
user_agent 필드에서 파싱됩니다. |
network.http.user_agent |
network.http.user_agent |
user_agent 필드에서 직접 매핑됩니다. |
security_result.action |
security_result.action |
type 필드 (ALLOW 또는 BLOCK)에 따라 결정됩니다. 특정 매핑은 파서 코드를 참고하세요. |
strategy |
security_result.detection_fields |
strategy 필드에서 매핑됩니다. 키는 'strategy'입니다. |
strategy_type |
security_result.detection_fields |
strategy_type 필드에서 매핑됩니다. 키는 'strategy_type'입니다. |
target.user.email_addresses |
target.user.email_addresses |
이메일 주소인 경우 user_name 필드에서 직접 매핑되고, 그렇지 않은 경우에는 다른 필드에서 파생됩니다 (위 참고). |
target.user.userid |
target.user.userid |
user_id 필드에서 직접 매핑되며 user_id 가 없는 경우 details.response.body.user_id 또는 user_name 에서 매핑됩니다. |
user_agent |
network.http.user_agent |
user_agent 필드에서 직접 매핑됩니다. |
user_id |
target.user.userid |
user_id 필드에서 직접 매핑됩니다. |
user_name |
target.user.email_addresses |
user_name 필드에서 직접 매핑됩니다. security_result.action 이 'ALLOW'이고 type 이 'slo', 'sapi', 's', 'ss' 또는 'ssa'인 경우 'MACHINE'으로 설정합니다. extensions.auth.type 이 'MACHINE'이고 type 이 'slo'인 경우 'OTP'로 설정합니다. type , client_name , ip , hostname , has_user 등의 필드 조합에 따라 결정됩니다. 특정 매핑은 파서 코드를 참고하세요. |
변경사항
2024-03-07
- 버그 수정:
- 'data.user_name'이 'target.user.email_addresses'에 매핑되었습니다.
- 'data.details.body.email_verified', 'data.details.body.is_signup'이 'security_result.detection_fields'에 매핑되었습니다.
- 'data.details.body.transaction.redirect_uri'가 'target.url'에 매핑되었습니다.
2023-06-19
- 파서를 새로 만들었습니다.