HackerOne 로그 수집

다음에서 지원:

이 문서에서는 Webhooks를 사용하여 로그를 Google Security Operations로 푸시하도록 HackerOne을 구성하는 방법을 설명합니다.

HackerOne은 조직과 보안 연구원을 연결하여 보안 취약점을 식별하고 해결하는 취약점 조정 및 버그 바운티 플랫폼입니다. 이 플랫폼은 소프트웨어 개발 수명 주기 전반에서 버그 바운티 프로그램, 취약점 공개 프로그램, 침투 테스트, 지속적인 보안 테스트를 제공합니다.

시작하기 전에

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

  • Google SecOps 인스턴스

  • Professional 또는 Enterprise 등급의 HackerOne 프로그램 (웹훅은 이러한 등급에서만 사용 가능)

  • HackerOne 프로그램 설정에 대한 관리 액세스 권한

  • Google Cloud 콘솔 액세스 (API 키 생성용)

Google SecOps에서 웹훅 피드 만들기

피드 만들기

  1. SIEM 설정> 피드로 이동합니다.
  2. 새 피드 추가를 클릭합니다.
  3. 다음 페이지에서 단일 피드 구성을 클릭합니다.
  4. 피드 이름 필드에 피드 이름을 입력합니다(예: HackerOne Webhook).
  5. 소스 유형으로 웹훅을 선택합니다.
  6. 로그 유형으로 HackerOne을 선택합니다.
  7. 다음을 클릭합니다.
  8. 다음 입력 파라미터의 값을 지정합니다.
    • 분할 구분 기호: 비워둡니다. 각 웹훅 요청에는 단일 JSON 이벤트가 포함됩니다.
    • 애셋 네임스페이스: 애셋 네임스페이스
    • 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
  9. 다음을 클릭합니다.
  10. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.

보안 비밀 키 생성 및 저장

피드를 만든 후 인증을 위한 보안 비밀 키를 생성해야 합니다.

  1. 피드 세부정보 페이지에서 보안 비밀 키 생성을 클릭합니다.
  2. 대화상자에 보안 비밀 키가 표시됩니다.
  3. 보안 비밀번호를 안전하게 복사하여 저장합니다.

중요: 비밀 키는 한 번만 표시되며 나중에 검색할 수 없습니다. 분실할 경우 새 비밀번호 키를 생성해야 합니다.

피드 엔드포인트 URL 가져오기

  1. 피드의 세부정보 탭으로 이동합니다.
  2. 엔드포인트 정보 섹션에서 피드 엔드포인트 URL을 복사합니다.
  3. URL 형식은 다음과 같습니다.

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    또는 리전 엔드포인트의 경우 다음을 실행합니다.

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. 다음 단계를 위해 이 URL을 저장합니다.

  5. 완료를 클릭합니다.

Google Cloud API 키 만들기

Chronicle에는 인증을 위한 API 키가 필요합니다. Google Cloud 콘솔에서 제한된 API 키를 만듭니다.

API 키 만들기

  1. Google Cloud 콘솔 사용자 인증 정보 페이지로 이동합니다.
  2. 프로젝트 (Google SecOps 인스턴스와 연결된 프로젝트)를 선택합니다.
  3. 사용자 인증 정보 만들기 API 키를 클릭합니다.
  4. API 키가 생성되어 대화상자에 표시됩니다.
  5. API 키 수정을 클릭하여 키를 제한합니다.

API 키 제한

  1. API 키 설정 페이지에서 다음을 수행합니다.
    • 이름: 설명이 포함된 이름을 입력합니다 (예: Chronicle HackerOne Webhook API Key).
  2. API 제한사항에서 다음을 수행합니다.
    1. 키 제한을 선택합니다.
    2. API 선택 드롭다운에서 Google SecOps API (또는 Chronicle API)를 검색하여 선택합니다.
  3. 저장을 클릭합니다.
  4. 페이지 상단의 API 키 필드에서 API 키 값을 복사합니다.
  5. API 키를 안전하게 저장합니다.

HackerOne 웹훅 구성

웹훅 URL 구성

Google SecOps 엔드포인트 URL, API 키, 비밀 키를 하나의 URL로 결합합니다. API 키와 보안 키는 모두 쿼리 매개변수로 추가해야 합니다.

URL 형식:

```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```

예:

```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```

다음을 바꿉니다. - <ENDPOINT_URL>: 피드 엔드포인트 URL 가져오기 섹션의 피드 엔드포인트 URL - <API_KEY>: Google Cloud API 키 만들기 섹션의 Google Cloud API 키입니다. - <SECRET_KEY>: 보안 비밀 키 생성 및 저장 섹션의 보안 비밀 키입니다.

중요: Google SecOps 비밀 키를 HackerOne의 Secret 필드에 입력하지 마세요. HackerOne Secret 필드는 HMAC 페이로드 서명 검증 (X-H1-Signature 헤더)에 사용되며, 이는 Google SecOps 웹훅 인증과는 별도의 메커니즘입니다. Google SecOps 보안 비밀을 HackerOne의 Secret 필드에 배치하면 HackerOne이 해당 값을 Google SecOps 인증 사용자 인증 정보로 전달하지 않으므로 403 Forbidden 오류가 발생합니다. 대신 keysecret를 모두 페이로드 URL의 쿼리 매개변수로 추가합니다.

HackerOne에서 웹훅 만들기

  1. HackerOne에 로그인하고 프로그램으로 이동합니다.
  2. 참여로 이동하여 구성하려는 프로그램의 더보기 메뉴를 클릭한 다음 설정을 클릭합니다.
  3. 자동화 > 웹훅으로 이동합니다.
  4. 새 웹훅을 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.
    • 페이로드 URL: 위의 API 키와 보안 비밀이 포함된 전체 URL을 붙여넣습니다 (예: https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...).
    • Secret: 이 필드는 비워둡니다.
  6. 웹훅을 트리거할 이벤트를 선택합니다. 다음 중 하나를 선택합니다.
    • 모두 보내기: 모든 이벤트가 웹훅을 트리거합니다.
    • 개별 이벤트 지정: Google SecOps로 전송할 특정 이벤트를 선택합니다.
  7. 웹훅 추가를 클릭합니다.

웹훅 테스트

  1. 웹훅 구성 페이지에서 요청 테스트를 클릭하여 구성된 페이로드 URL로 예시 요청을 보냅니다.
  2. 응답이 HTTP 200인지 확인합니다.
  3. 웹훅을 클릭하여 세부정보를 확인합니다.
  4. 최근 전송 섹션에서 최근 전송이 성공 상태 (HTTP 200)로 표시되는지 확인합니다.
  5. 배송을 클릭하여 POST 페이로드 요청을 확인합니다.

다음과 같은 오류가 표시되면 다음을 확인하세요. - HTTP 403: API 키와 비밀 키가 페이로드 URL에 쿼리 매개변수로 올바르게 추가되었는지 확인합니다. HackerOne Secret 필드가 비어 있는지 확인합니다. - HTTP 401: API 키가 유효하고 Google SecOps API로 제한되어 있는지 확인합니다. - HTTP 404: 엔드포인트 URL이 올바르고 전체 경로 (/v2/unstructuredlogentries:batchCreate)가 포함되어 있는지 확인합니다.

Google SecOps에서 수집 확인

  1. Google SecOps에서 SIEM 설정 > 피드로 이동합니다.
  2. HackerOne 웹훅 피드를 찾습니다.
  3. 상태 열을 확인합니다 (활성이어야 함).
  4. 수신된 이벤트 수를 확인합니다 (증가해야 함).
  5. 최종 성공 시간 타임스탬프를 확인합니다 (최근이어야 함).

웹훅 한도 및 권장사항

요청 한도

| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |

UDM 매핑 테이블

로그 필드 UDM 매핑 논리
attributes.cleared, attributes.rules_of_engagement_signed, attributes.identity_verified, attributes.background_checked, attributes.citizenship_verified, attributes.residency_verified, type, attributes.title, attributes.main_state, attributes.state, relationships.reporter.data.type, relationships.reporter.data.attributes.reputation, relationships.reporter.data.attributes.signal, relationships.reporter.data.attributes.impact, relationships.reporter.data.attributes.disabled, relationships.reporter.data.attributes.profile_picture.62x62, relationships.reporter.data.attributes.profile_picture.82x82, relationships.reporter.data.attributes.profile_picture.110x110, relationships.reporter.data.attributes.profile_picture.260x260, relationships.reporter.data.attributes.hackerone_triager, relationships.program.data.id, relationships.program.data.type, relationships.program.data.attributes.handle, relationships.severity.data.type, relationships.severity.data.attributes.rating, relationships.severity.data.attributes.author_type, relationships.severity.data.attributes.calculation_method, relationships.weakness.data.id, relationships.weakness.data.type, relationships.weakness.data.attributes.name, relationships.weakness.data.attributes.description, relationships.weakness.data.attributes.external_id, relationships.structured_scope.data.id, relationships.structured_scope.data.type, relationships.structured_scope.data.attributes.asset_type, relationships.structured_scope.data.attributes.eligible_for_bounty, relationships.structured_scope.data.attributes.eligible_for_submission, relationships.structured_scope.data.attributes.instruction, relationships.structured_scope.data.attributes.max_severity, relationships.structured_scope.data.attributes.confidentiality_requirement, relationships.structured_scope.data.attributes.integrity_requirement, relationships.structured_scope.data.attributes.availability_requirement, relationships.inboxes.data.id, relationships.inboxes.data.type, relationships.inboxes.data.attributes.name, relationships.inboxes.data.attributes.type additional.fields 키-값 라벨로 병합됨
타임스탬프 metadata.event_timestamp yyyy-MM-dd'T'HH:mm:ss.SSSZ 형식의 날짜 필터를 사용하여 파싱됨
metadata.event_type has_principal이 true이면 'STATUS_UPDATE', has_principal_user_user가 true이면 'USER_UNCATEGORIZED', 그 밖의 경우에는 'GENERIC_EVENT'로 설정됩니다.
id metadata.product_log_id 값이 직접 복사됨
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id 'ASSET:'으로 시작합니다.
attributes.email_alias principal.user.email_addresses 병합됨
relationships.reporter.data.id principal.user.employee_id 값이 직접 복사됨
relationships.reporter.data.attributes.name principal.user.first_name 값이 직접 복사됨
attributes.username, relationships.reporter.data.attributes.username principal.user.user_display_name 비어 있지 않은 경우 relationships.reporter.data.attributes.username의 값, 그렇지 않은 경우 attributes.username
relationships.severity.data.attributes.user_id principal.user.userid 값이 직접 복사됨
relationships.severity.data.id security_result.rule_id 값이 직접 복사됨
relationships.severity.data.attributes.max_severity security_result.severity 대문자로 변환됨
attributes.vulnerability_information security_result.summary 값이 직접 복사됨

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