GITHUB

Didukung di:

Dokumen ini menjelaskan cara menyerap log audit GitHub ke Google Security Operations menggunakan Amazon S3. Parser mencoba mengekstrak data dari kolom "message" menggunakan berbagai pola grok, yang menangani format JSON dan non-JSON. Berdasarkan "process_type" yang diekstrak, logika penguraian tertentu diterapkan menggunakan grok, kv, dan filter lainnya untuk memetakan data log mentah ke dalam skema Model Data Terpadu (UDM).

Sebelum memulai

Pastikan Anda memenuhi prasyarat berikut:

  • Instance Google SecOps.
  • Akses istimewa ke tenant GitHub Enterprise Cloud dengan izin pemilik perusahaan.
  • Akses istimewa ke AWS (S3, IAM).

Kumpulkan prasyarat GitHub Enterprise Cloud (Akses Enterprise)

  1. Login ke Konsol Admin GitHub Enterprise Cloud.
  2. Buka Setelan Enterprise > Setelan > Log audit > Streaming log.
  3. Pastikan Anda memiliki izin pemilik perusahaan untuk mengonfigurasi streaming log audit.
  4. Salin dan simpan detail berikut di lokasi yang aman:
    • Nama GitHub Enterprise
    • Nama organisasi dalam perusahaan

Mengonfigurasi bucket AWS S3 dan Pengelolaan Akses dan Identitas untuk Google SecOps

  1. Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket
  2. Simpan Name dan Region bucket untuk referensi di masa mendatang (misalnya, github-audit-logs).
  3. Buat Pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
  4. Pilih Pengguna yang dibuat.
  5. Pilih tab Kredensial keamanan.
  6. Klik Create Access Key di bagian Access Keys.
  7. Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
  8. Klik Berikutnya.
  9. Opsional: Tambahkan tag deskripsi.
  10. Klik Create access key.
  11. Klik Download file .CSV untuk menyimpan Kunci Akses dan Kunci Akses Rahasia untuk referensi di masa mendatang.
  12. Klik Selesai.

Mengonfigurasi kebijakan IAM untuk streaming S3 GitHub

  1. Di konsol AWS, buka IAM > Policies > Create policy > JSON tab.
  2. Salin dan tempel kebijakan berikut.
  3. Policy JSON (ganti github-audit-logs jika Anda memasukkan nama bucket yang berbeda):

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Sid": "AllowPutObjects",
        "Effect": "Allow",
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        }
    ]
    }
    
  4. Klik Berikutnya > Buat kebijakan.

  5. Beri nama kebijakan GitHubAuditStreamingPolicy, lalu klik Buat kebijakan.

  6. Kembali ke pengguna IAM yang dibuat sebelumnya.

  7. Pilih tab Izin.

  8. Klik Tambahkan izin > Lampirkan kebijakan secara langsung.

  9. Telusuri dan pilih GitHubAuditStreamingPolicy.

  10. Klik Berikutnya > Tambahkan izin.

Mengonfigurasi streaming log audit GitHub Enterprise Cloud

  1. Login ke GitHub Enterprise Cloud sebagai pemilik perusahaan.
  2. Klik foto profil Anda, lalu klik Setelan perusahaan.
  3. Di sidebar akun perusahaan, klik Setelan > Log audit > Streaming log.
  4. Pilih Konfigurasi streaming, lalu klik Amazon S3.
  5. Di bagian Authentication, klik Access keys.
  6. Berikan detail konfigurasi berikut:
    • Region: Pilih region bucket (misalnya, us-east-1).
    • Bucket: Ketik nama bucket yang ingin Anda streaming (misalnya, github-audit-logs).
    • Access Key ID: Masukkan ID kunci akses Anda dari pengguna IAM.
    • Secret Key: Masukkan kunci rahasia Anda dari pengguna IAM.
  7. Klik Periksa endpoint untuk memverifikasi bahwa GitHub dapat terhubung dan menulis ke endpoint Amazon S3.
  8. Setelah Anda berhasil memverifikasi endpoint, klik Simpan.

Membuat pengguna & kunci IAM hanya baca untuk Google SecOps

  1. Buka Konsol AWS > IAM > Pengguna > Tambahkan pengguna.
  2. Klik Add users.
  3. Berikan detail konfigurasi berikut:
    • Pengguna: Masukkan secops-reader.
    • Jenis akses: Pilih Kunci akses – Akses terprogram.
  4. Klik Buat pengguna.
  5. Lampirkan kebijakan baca minimal (kustom): Pengguna > secops-reader > Izin > Tambahkan izin > Lampirkan kebijakan secara langsung > Buat kebijakan.
  6. JSON:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Action": ["s3:GetObject"],
        "Resource": "arn:aws:s3:::github-audit-logs/*"
        },
        {
        "Effect": "Allow",
        "Action": ["s3:ListBucket"],
        "Resource": "arn:aws:s3:::github-audit-logs"
        }
    ]
    }
    
  7. Nama = secops-reader-policy.

  8. Klik Buat kebijakan > cari/pilih > Berikutnya > Tambahkan izin.

  9. Buat kunci akses untuk secops-reader: Kredensial keamanan > Kunci akses > Buat kunci akses > download .CSV (Anda akan menempelkan nilai ini ke feed).

Mengonfigurasi feed di Google SecOps untuk menyerap log GitHub

  1. Buka Setelan SIEM > Feed.
  2. Klik + Tambahkan Feed Baru.
  3. Di kolom Nama feed, masukkan nama untuk feed (misalnya, GitHub audit logs).
  4. Pilih Amazon S3 V2 sebagai Jenis sumber.
  5. Pilih GitHub sebagai Jenis log.
  6. Klik Berikutnya.
  7. Tentukan nilai untuk parameter input berikut:
    • URI S3: s3://github-audit-logs/
    • Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda.
    • Usia File Maksimum: Menyertakan file yang diubah dalam beberapa hari terakhir. Defaultnya adalah 180 hari.
    • ID Kunci Akses: Kunci akses pengguna dengan akses ke bucket S3.
    • Kunci Akses Rahasia: Kunci rahasia pengguna dengan akses ke bucket S3.
    • Namespace aset: namespace aset.
    • Label penyerapan: label yang diterapkan ke peristiwa dari feed ini.
  8. Klik Berikutnya.
  9. Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
actor principal.user.userid Nilai diambil dari kolom actor.
actor_id principal.user.attribute.labels.value Nilai diambil dari kolom actor_id.
actor_ip principal.ip Nilai diambil dari kolom actor_ip.
actor_location.country_code principal.location.country_or_region Nilai diambil dari kolom actor_location.country_code.
application_name target.application Nilai diambil dari kolom application_name.
business target.user.company_name Nilai diambil dari kolom business.
business_id target.resource.attribute.labels.value Nilai diambil dari kolom business_id.
config.url target.url Nilai diambil dari kolom config.url.
created_at metadata.event_timestamp Nilai dikonversi dari milidetik UNIX menjadi stempel waktu.
data.cancelled_at extensions.vulns.vulnerabilities.scan_end_time Nilai dikonversi dari format ISO8601 menjadi stempel waktu.
data.email target.email Nilai diambil dari kolom data.email.
data.event security_result.about.labels.value Nilai diambil dari kolom data.event.
data.events security_result.about.labels.value Nilai diambil dari kolom data.events.
data.head_branch security_result.about.labels.value Nilai diambil dari kolom data.head_branch.
data.head_sha target.file.sha256 Nilai diambil dari kolom data.head_sha.
data.hook_id target.resource.attribute.labels.value Nilai diambil dari kolom data.hook_id.
data.started_at extensions.vulns.vulnerabilities.scan_start_time Nilai dikonversi dari format ISO8601 menjadi stempel waktu.
data.team target.user.group_identifiers Nilai diambil dari kolom data.team.
data.trigger_id security_result.about.labels.value Nilai diambil dari kolom data.trigger_id.
data.workflow_id security_result.about.labels.value Nilai diambil dari kolom data.workflow_id.
data.workflow_run_id security_result.about.labels.value Nilai diambil dari kolom data.workflow_run_id.
enterprise.name additional.fields.value.string_value Nilai diambil dari kolom enterprise.name.
external_identity_nameid target.user.email_addresses Jika nilainya adalah alamat email, nilai tersebut akan ditambahkan ke array target.user.email_addresses.
external_identity_nameid target.user.userid Nilai diambil dari kolom external_identity_nameid.
external_identity_username target.user.user_display_name Nilai diambil dari kolom external_identity_username.
hashed_token network.session_id Nilai diambil dari kolom hashed_token.
job_name target.resource.attribute.labels.value Nilai diambil dari kolom job_name.
job_workflow_ref target.resource.attribute.labels.value Nilai diambil dari kolom job_workflow_ref.
org target.administrative_domain Nilai diambil dari kolom org.
org_id additional.fields.value.string_value Nilai diambil dari kolom org_id.
programmatic_access_type additional.fields.value.string_value Nilai diambil dari kolom programmatic_access_type.
public_repo additional.fields.value.string_value Nilai diambil dari kolom public_repo.
public_repo target.location.name Jika nilainya "false", nilai tersebut dipetakan ke "PRIVATE". Jika tidak, nilai ini dipetakan ke "PUBLIC".
query_string additional.fields.value.string_value Nilai diambil dari kolom query_string.
rate_limit_remaining additional.fields.value.string_value Nilai diambil dari kolom rate_limit_remaining.
repo target.resource.name Nilai diambil dari kolom repo.
repo_id additional.fields.value.string_value Nilai diambil dari kolom repo_id.
repository_public additional.fields.value.string_value Nilai diambil dari kolom repository_public.
request_body additional.fields.value.string_value Nilai diambil dari kolom request_body.
request_method network.http.method Nilai dikonversi menjadi huruf besar.
route additional.fields.value.string_value Nilai diambil dari kolom route.
status_code network.http.response_code Nilai dikonversi menjadi bilangan bulat.
timestamp metadata.event_timestamp Nilai dikonversi dari milidetik UNIX menjadi stempel waktu.
token_id additional.fields.value.string_value Nilai diambil dari kolom token_id.
token_scopes additional.fields.value.string_value Nilai diambil dari kolom token_scopes.
transport_protocol_name network.application_protocol Nilai dikonversi menjadi huruf besar.
url_path target.url Nilai diambil dari kolom url_path.
user target.user.user_display_name Nilai diambil dari kolom user.
user_agent network.http.user_agent Nilai diambil dari kolom user_agent.
user_agent network.http.parsed_user_agent Nilai diuraikan.
user_id target.user.userid Nilai diambil dari kolom user_id.
workflow.name security_result.about.labels.value Nilai diambil dari kolom workflow.name.
workflow_run.actor.login principal.user.userid Nilai diambil dari kolom workflow_run.actor.login.
workflow_run.event additional.fields.value.string_value Nilai diambil dari kolom workflow_run.event.
workflow_run.head_branch security_result.about.labels.value Nilai diambil dari kolom workflow_run.head_branch.
workflow_run.head_sha target.file.sha256 Nilai diambil dari kolom workflow_run.head_sha.
workflow_run.id target.resource.attribute.labels.value Nilai diambil dari kolom workflow_run.id.
workflow_run.workflow_id security_result.about.labels.value Nilai diambil dari kolom workflow_run.workflow_id.
T/A metadata.event_type Nilai ditentukan berdasarkan kolom action dan actor. Jika kolom action berisi "_member", nilai akan ditetapkan ke "USER_RESOURCE_UPDATE_PERMISSIONS". Jika kolom action tidak kosong dan kolom actor tidak kosong, nilainya ditetapkan ke "USER_RESOURCE_UPDATE_CONTENT". Jika tidak, nilai ditetapkan ke "USER_RESOURCE_ACCESS".
T/A metadata.log_type Nilai ditetapkan ke "GITHUB".
T/A metadata.product_name Nilai ditetapkan ke "GITHUB".
T/A metadata.vendor_name Nilai ditetapkan ke "GITHUB".
T/A target.resource.resource_type Nilai ditetapkan ke "STORAGE_OBJECT".
T/A security_result.about.labels.key Nilai ditetapkan ke string konstan berdasarkan kolom data yang sesuai. Misalnya, untuk data.workflow_id, kunci ditetapkan ke "Workflow Id".
T/A target.resource.attribute.labels.key Nilai ditetapkan ke string konstan berdasarkan kolom data yang sesuai. Misalnya, untuk data.hook_id, kunci disetel ke "Hook Id".

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.