GITHUB
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)
- Login ke Konsol Admin GitHub Enterprise Cloud.
- Buka Setelan Enterprise > Setelan > Log audit > Streaming log.
- Pastikan Anda memiliki izin pemilik perusahaan untuk mengonfigurasi streaming log audit.
- 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
- Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket
- Simpan Name dan Region bucket untuk referensi di masa mendatang (misalnya,
github-audit-logs
). - Buat Pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
- Pilih Pengguna yang dibuat.
- Pilih tab Kredensial keamanan.
- Klik Create Access Key di bagian Access Keys.
- Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
- Klik Berikutnya.
- Opsional: Tambahkan tag deskripsi.
- Klik Create access key.
- Klik Download file .CSV untuk menyimpan Kunci Akses dan Kunci Akses Rahasia untuk referensi di masa mendatang.
- Klik Selesai.
Mengonfigurasi kebijakan IAM untuk streaming S3 GitHub
- Di konsol AWS, buka IAM > Policies > Create policy > JSON tab.
- Salin dan tempel kebijakan berikut.
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/*" } ] }
Klik Berikutnya > Buat kebijakan.
Beri nama kebijakan
GitHubAuditStreamingPolicy
, lalu klik Buat kebijakan.Kembali ke pengguna IAM yang dibuat sebelumnya.
Pilih tab Izin.
Klik Tambahkan izin > Lampirkan kebijakan secara langsung.
Telusuri dan pilih
GitHubAuditStreamingPolicy
.Klik Berikutnya > Tambahkan izin.
Mengonfigurasi streaming log audit GitHub Enterprise Cloud
- Login ke GitHub Enterprise Cloud sebagai pemilik perusahaan.
- Klik foto profil Anda, lalu klik Setelan perusahaan.
- Di sidebar akun perusahaan, klik Setelan > Log audit > Streaming log.
- Pilih Konfigurasi streaming, lalu klik Amazon S3.
- Di bagian Authentication, klik Access keys.
- 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.
- Region: Pilih region bucket (misalnya,
- Klik Periksa endpoint untuk memverifikasi bahwa GitHub dapat terhubung dan menulis ke endpoint Amazon S3.
- Setelah Anda berhasil memverifikasi endpoint, klik Simpan.
Membuat pengguna & kunci IAM hanya baca untuk Google SecOps
- Buka Konsol AWS > IAM > Pengguna > Tambahkan pengguna.
- Klik Add users.
- Berikan detail konfigurasi berikut:
- Pengguna: Masukkan
secops-reader
. - Jenis akses: Pilih Kunci akses – Akses terprogram.
- Pengguna: Masukkan
- Klik Buat pengguna.
- Lampirkan kebijakan baca minimal (kustom): Pengguna > secops-reader > Izin > Tambahkan izin > Lampirkan kebijakan secara langsung > Buat kebijakan.
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" } ] }
Nama =
secops-reader-policy
.Klik Buat kebijakan > cari/pilih > Berikutnya > Tambahkan izin.
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
- Buka Setelan SIEM > Feed.
- Klik + Tambahkan Feed Baru.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
GitHub audit logs
). - Pilih Amazon S3 V2 sebagai Jenis sumber.
- Pilih GitHub sebagai Jenis log.
- Klik Berikutnya.
- 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.
- URI S3:
- Klik Berikutnya.
- 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.