Mengumpulkan log GitLab
Ringkasan
Parser ini mengekstrak kolom dari log JSON GitLab, menormalisasinya ke dalam Unified Data Model (UDM), dan memperkaya data dengan konteks tambahan. Alat ini menangani berbagai jenis peristiwa GitLab, yang berfokus pada tindakan pengguna, akses resource, dan hasil keamanan, sekaligus memproses informasi terkait jaringan dan aplikasi. Parser juga menjalankan logika berdasarkan peran dan tindakan dalam GitLab, mengategorikan peristiwa, dan menetapkan tingkat keparahan yang sesuai.
Sebelum memulai
- Pastikan Anda memiliki instance Google Chronicle.
- Pastikan Anda memiliki akses dengan hak istimewa ke GitLab.
Mengonfigurasi feed di Google SecOps untuk menyerap log GitLab
- Buka Setelan SIEM > Feed.
- Klik Tambahkan baru.
- Di kolom Feed name, masukkan nama untuk feed (misalnya, GitLab Logs).
- Pilih Webhook sebagai Jenis sumber.
- Pilih Gitlab sebagai Jenis log.
- Klik Berikutnya.
- Opsional: tentukan nilai untuk parameter input berikut:
- Pemisah pemisahan: pembatas yang digunakan untuk memisahkan baris log, seperti
\n
. - Namespace aset: namespace aset.
- Label penyerapan: label yang diterapkan ke peristiwa dari feed ini.
- Pemisah pemisahan: pembatas yang digunakan untuk memisahkan baris log, seperti
- Klik Berikutnya.
- Tinjau konfigurasi feed di layar Finalize, lalu klik Submit.
- Klik Buat Kunci Rahasia untuk membuat kunci rahasia guna mengautentikasi feed ini.
- Salin dan simpan kunci rahasia. Anda tidak dapat melihat kunci rahasia ini lagi. Jika perlu, Anda dapat membuat ulang kunci rahasia baru, tetapi tindakan ini akan membuat kunci rahasia sebelumnya tidak berlaku lagi.
- Di tab Detail, salin URL endpoint feed dari kolom Endpoint Information. Anda perlu menentukan URL endpoint ini di aplikasi klien.
- Klik Selesai.
Membuat kunci API untuk feed webhook
Buka Konsol Google Cloud > Kredensial.
Klik Create credentials, lalu pilih API key.
Batasi akses kunci API ke Google Security Operations API.
Menentukan URL endpoint
- Di aplikasi klien, tentukan URL endpoint HTTPS yang diberikan di feed webhook.
Aktifkan autentikasi dengan menentukan kunci API dan kunci secret sebagai bagian dari header kustom dalam format berikut:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Rekomendasi: Tentukan kunci API sebagai header, bukan menentukannya di URL. Jika klien webhook Anda tidak mendukung header kustom, Anda dapat menentukan kunci API dan kunci rahasia menggunakan parameter kueri dalam format berikut:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Ganti kode berikut:
ENDPOINT_URL
: URL endpoint feed.API_KEY
: kunci API untuk mengautentikasi ke Google Security Operations.SECRET
: kunci rahasia yang Anda buat untuk mengautentikasi feed.
Mengonfigurasi webhook di GitLab untuk Google SecOps
- Buka browser web, lalu buka project GitLab yang webhook-nya ingin Anda konfigurasi.
- Di project Anda, buka Setelan > Webhook.
- Klik Tambahkan webhook baru.
- Di kolom URL, tempel URL Endpoint Google SecOps.
- Klik Tambahkan header kustom.
- Ketik X-Webhook-Access-Key di kolom Header Name.
- Untuk kolom Header Value, salin Kunci Rahasia yang dibuat selama konfigurasi Feed Google SecOps.
- Klik Tambahkan header kustom.
- Ketik X-goog-api-key di kolom Header Name.
- Untuk kolom Header Value, salin Kunci API yang dihasilkan selama konfigurasi Feed Google SecOps. Catatan: Untuk keamanan yang lebih baik, buat token rahasia dan tambahkan ke konfigurasi webhook GitLab dan konfigurasi Feed Google SecOps yang sesuai. Hal ini membantu memverifikasi keaslian webhook yang masuk.
- Pilih peristiwa GitLab yang akan memicu webhook. Misalnya, Anda dapat memilih Peristiwa push untuk mengirim data ke Google SecOps setiap kali kode di-push ke repositori. Pertimbangkan dengan cermat peristiwa mana yang relevan dengan kebutuhan pemantauan keamanan Anda. Terlalu banyak peristiwa dapat menyebabkan beban yang tidak perlu.
- Untuk lebih memahami tujuan webhook, beri nama yang bermakna, seperti Webhook Google SecOps.
- Pastikan kotak centang Enable SSL verification dicentang. Hal ini sangat penting untuk komunikasi yang aman.
- Klik Tambahkan webhook untuk menyimpan konfigurasi Anda.
Tabel Pemetaan UDM
Kolom Log | Pemetaan UDM | Logika |
---|---|---|
author_id |
principal.user.userid |
Dikonversi ke string. |
author_name |
principal.user.email_addresses |
Jika nilai cocok dengan ekspresi reguler alamat email. |
author_name |
principal.user.user_display_name |
Jika nilai tidak cocok dengan ekspresi reguler alamat email. |
details.as |
principal.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "as". |
details.add |
principal.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "add". |
details.as |
principal.user.role_name |
Nilai kolom log mentah. |
details.as |
principal.user.attribute.roles.type |
Tetapkan ke "ADMINISTRATOR" jika details.as adalah "Pemilik", "SERVICE_ACCOUNT" jika details.as adalah "Developer", "Pengelola", atau "Pelapor", dan "TYPE_UNSPECIFIED" jika details.as adalah "Tamu". |
details.custom_message |
security_result.description |
Nilai kolom log mentah. |
details.custom_message.action |
security_result.summary |
Nilai kolom log mentah. |
details.entity_path |
target.file.full_path |
Nilai kolom log mentah. |
details.target_id |
target.resource.id |
Dikonversi ke string. |
entity_path |
target.file.full_path |
Nilai kolom log mentah. |
entity_type |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "Jenis Entity". |
event_type |
metadata.product_event_type |
Nilai kolom log mentah. |
insertId |
metadata.product_log_id |
Nilai kolom log mentah. |
ip_address |
principal.ip , principal.asset.ip |
Nilai kolom log mentah. |
jsonPayload.action |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "action" dan nilai string. |
jsonPayload.controller |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "controller" dan nilai string. |
jsonPayload.correlation_id |
principal.asset_id |
Diawali dengan "id: ". |
jsonPayload.cpu_s |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "cpu_s" dan nilai string. |
jsonPayload.details.custom_message.protocol |
network.application_protocol |
Tetapkan ke "UNKNOWN_APPLICATION_PROTOCOL" jika nilainya "web", jika tidak, konversikan ke huruf besar. Juga ditambahkan sebagai kolom tambahan dengan kunci "Application Protocol" jika nilainya adalah "web". |
jsonPayload.mem_total_bytes |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "mem_total_bytes" dan nilai string. |
jsonPayload.meta_caller_id |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "ID Pemanggil" dan nilai string. |
jsonPayload.meta_client_id |
target.user.userid |
Nilai kolom log mentah. |
jsonPayload.meta_feature_category |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "Kategori Fitur" dan nilai string. |
jsonPayload.meta_remote_ip |
principal.ip , principal.asset.ip |
Nilai kolom log mentah, diuraikan sebagai array JSON dan digabungkan ke dalam kolom IP. |
jsonPayload.meta_user |
principal.user.userid |
Digunakan sebagai penggantian jika jsonPayload.username kosong. |
jsonPayload.method |
network.http.method |
Nilai kolom log mentah. |
jsonPayload.path |
target.process.file.full_path |
Nilai kolom log mentah. |
jsonPayload.pid |
target.process.pid |
Dikonversi ke string. |
jsonPayload.remote_ip |
principal.ip , principal.asset.ip |
Nilai kolom log mentah. |
jsonPayload.request_urgency |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "Urgensi Permintaan" dan nilai string. |
jsonPayload.severity |
security_result.severity |
Tetapkan ke "INFORMATIONAL" jika nilainya "INFO", "ERROR" jika nilainya "ERROR", dan "MEDIUM" jika nilainya "NOTICE". |
jsonPayload.status |
network.http.response_code |
Dikonversi menjadi bilangan bulat jika bukan "AKTIF". |
jsonPayload.ua |
network.http.user_agent |
Nilai kolom log mentah. |
jsonPayload.username |
principal.user.userid |
Nilai kolom log mentah. |
jsonPayload.worker_id |
principal.application |
Nilai kolom log mentah. |
labels.instance_name |
principal.hostname , principal.asset.hostname |
Nilai kolom log mentah, yang digunakan jika pesan berisi "Menghapus pengguna". |
logName |
security_result.category_details |
Nilai kolom log mentah. |
message |
security_result.summary |
Nilai kolom log mentah, yang digunakan jika jsonPayload.severity adalah "ERROR". |
protoPayload.@type |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "protoPayload type" dan nilai string. |
protoPayload.authenticationInfo.principalEmail |
principal.user.email_addresses , principal.user.userid |
Nilai kolom log mentah. |
protoPayload.authenticationInfo.principalSubject |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "authenticationInfo principalSubject" dan nilai string. |
protoPayload.authenticationInfo.serviceAccountKeyName |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "authenticationInfo serviceAccountKeyName" dan nilai string. |
protoPayload.authorizationInfo |
target.resource.attribute.labels , security_result.action |
Nilai dalam kolom ini ditambahkan sebagai label dengan kunci yang diawali dengan "authenticationInfo". security_result.action ditetapkan ke "ALLOW" jika nilai dalam granted bernilai benar, dan "BLOCK" jika salah. Kolom bertingkat seperti resourceAttributes juga ditambahkan sebagai label dengan kunci yang diawali dengan "authenticationInfo_resourceAttributes". |
protoPayload.methodName |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "protoPayload methodName" dan nilai string. |
protoPayload.request.@type |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "Request Type" dan nilai string. |
protoPayload.request.resource |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "Request resource". |
protoPayload.requestMetadata.callerIp |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "requestMetadata callerIp" dan nilai string. |
protoPayload.requestMetadata.callerSuppliedUserAgent |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "requestMetadata callerSuppliedUserAgent" dan nilai string. |
protoPayload.serviceName |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "serviceName" dan nilai string. |
protoPayload.status.code |
additional.fields |
Ditambahkan sebagai kolom dengan kunci "protoPayload status code" dan nilai string. |
protoPayload.status.message |
additional.fields , target.user.email_addresses , target.user.userid |
Ditambahkan sebagai kolom dengan kunci "protoPayload status message" dan nilai string. Jika alamat email dapat diekstrak dari pesan, alamat tersebut akan ditambahkan ke target.user.email_addresses dan target.user.userid . |
receiveTimestamp |
metadata.event_timestamp , timestamp |
Diurai sebagai stempel waktu peristiwa. |
resource.labels.project_id |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "Project id". |
resource.labels.zone |
target.cloud.availability_zone |
Nilai kolom log mentah. |
resource.type |
target.cloud.environment |
Tetapkan ke "GOOGLE_CLOUD_PLATFORM" jika nilainya cocok dengan "gce". |
security_result.action |
security_result.action |
Berasal dari protoPayload.authorizationInfo.granted . |
security_result.category_details |
security_result.category_details |
Digabung dengan logName . |
security_result.description |
security_result.description |
Berasal dari jsonPayload.details.custom_message . |
security_result.severity |
security_result.severity |
Berasal dari severity atau jsonPayload.severity . |
security_result.summary |
security_result.summary |
Berasal dari jsonPayload.details.custom_message.action atau jsonPayload.message . |
severity |
security_result.severity |
Tetapkan ke "INFORMATIONAL" jika nilainya "INFO", "ERROR" jika nilainya "ERROR", dan "MEDIUM" jika nilainya "NOTICE". |
sourceLocation |
principal.resource.attribute.labels |
Nilai dalam kolom ini ditambahkan sebagai label. |
target_details |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "Target Details". |
target_type |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "target type". |
timestamp |
timestamp |
Nilai kolom log mentah. Tetapkan berdasarkan keberadaan kolom utama dan target. Defaultnya adalah "GENERIC_EVENT" jika tidak ada kondisi tertentu yang terpenuhi. Nilai yang mungkin adalah "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS", "USER_UNCATEGORIZED". Tetapkan ke "GITLAB". Tetapkan ke "GITLAB". |
Perubahan
2024-04-08
- Memetakan "custom_message.action" ke "security_result.summary".
- Memetakan "ip_address" ke "principal.ip".
- Memetakan "applicationProtocol" ke "network.application_protocol".
- Memetakan "details.author_name"" ke "principal.user.email_addresses"
- Memetakan "author_id" ke "principal.user.userid".
- Memetakan "target_id" ke "target.resource.id".
- Memetakan "details.entity_path" ke "target.file.full_path".
- Memetakan "event_type" ke "product_event_type".
- Memetakan "target_type", "entity_type", dan "target_details" ke "resource.attribute.labels".
2023-10-20
- Memetakan kolom yang dimulai dengan "db_" ke "additional_fields".
- Memetakan kolom yang dimulai dengan "redis_" ke "additional_fields".
- Memetakan "severity" atau "jsonPayload.severity" ke "security_result.severity" jika nilainya adalah "ERROR" atau "NOTICE".
- Memetakan "jsonPayload.correlation_id" ke "principal.asset_id".
- Memetakan "kolom jsonPayload yang tidak dipetakan" ke "additional_fields".
- Memetakan "jsonPayload.worker_id" ke "principal.application".
- Memetakan "jsonPayload.method" ke "network.http.method".
- Memetakan "jsonPayload.pid" ke "target.process.pid".
- Memetakan "jsonPayload.status" ke "network.http.response_code".
- Memetakan "resource.labels.zone" ke "target.cloud.availability_zone".
- Memetakan "resource.type" ke "target.cloud.environment".
- Memetakan "jsonPayload.meta_user" ke "target.user.userid".
- Memetakan "jsonPayload.username" ke "principal.user.userid".
- Memetakan "jsonPayload.remote_ip" ke "principal.ip".
- Memetakan "jsonPayload.ua" ke "network.http.user_agent".
- Memetakan "jsonPayload.meta_client_id" ke "target.user.userid".
- Memetakan "jsonPayload.path" ke "target.process.file.full_path".
- Memetakan "protoPayload.authenticationInfo.principalEmail" ke "principal.user.email_addresses".
- Mempetakan kolom tambahan di "protoPayload" ke "additional.fields".
- Memberikan pemeriksaan bersyarat bahwa pemetaan yang diperlukan ada sebelum memetakan "metadata.event_type".
2023-10-10
- Memetakan "jsonPayload.details.as" ke "principal.resource.attribute.labels" dan "principal.user.role_name".
- Tetapkan "principal_role.type" ke "ADMINISTRATOR" untuk log yang memiliki "jsonPayload.details.as" sama dengan "Pemilik".
- Tetapkan "principal_role.type" ke "SERVICE_ACCOUNT" untuk log yang memiliki "jsonPayload.details.as" yang ditetapkan ke "Developer", "Maintainer", atau "Reporter".
- Tetapkan "principal_role.type" ke "TYPE_UNSPECIFIED" untuk log yang memiliki "jsonPayload.details.as" sama dengan "Tamu".
- Memetakan "jsonPayload.details.add" ke "principal.resource.attribute.labels".
- Memetakan "jsonPayload.entity_type" ke "target.resource.attribute.labels".
2023-08-31
- Parser yang baru dibuat.
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.