Mengumpulkan log GitLab

Didukung di:

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

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan baru.
  3. Di kolom Feed name, masukkan nama untuk feed (misalnya, GitLab Logs).
  4. Pilih Webhook sebagai Jenis sumber.
  5. Pilih Gitlab sebagai Jenis log.
  6. Klik Berikutnya.
  7. 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.
  8. Klik Berikutnya.
  9. Tinjau konfigurasi feed di layar Finalize, lalu klik Submit.
  10. Klik Buat Kunci Rahasia untuk membuat kunci rahasia guna mengautentikasi feed ini.
  11. 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.
  12. Di tab Detail, salin URL endpoint feed dari kolom Endpoint Information. Anda perlu menentukan URL endpoint ini di aplikasi klien.
  13. Klik Selesai.

Membuat kunci API untuk feed webhook

  1. Buka Konsol Google Cloud > Kredensial.

    Buka Kredensial

  2. Klik Create credentials, lalu pilih API key.

  3. Batasi akses kunci API ke Google Security Operations API.

Menentukan URL endpoint

  1. Di aplikasi klien, tentukan URL endpoint HTTPS yang diberikan di feed webhook.
  2. 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

  1. Buka browser web, lalu buka project GitLab yang webhook-nya ingin Anda konfigurasi.
  2. Di project Anda, buka Setelan > Webhook.
  3. Klik Tambahkan webhook baru.
  4. Di kolom URL, tempel URL Endpoint Google SecOps.
  5. Klik Tambahkan header kustom.
  6. Ketik X-Webhook-Access-Key di kolom Header Name.
  7. Untuk kolom Header Value, salin Kunci Rahasia yang dibuat selama konfigurasi Feed Google SecOps.
  8. Klik Tambahkan header kustom.
  9. Ketik X-goog-api-key di kolom Header Name.
  10. 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.
  11. 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.
  12. Untuk lebih memahami tujuan webhook, beri nama yang bermakna, seperti Webhook Google SecOps.
  13. Pastikan kotak centang Enable SSL verification dicentang. Hal ini sangat penting untuk komunikasi yang aman.
  14. 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.