Mengumpulkan log GitLab
Ringkasan
Parser ini mengekstrak kolom dari log JSON GitLab, menormalisasinya ke dalam Model Data Terpadu (UDM), dan memperkaya data dengan konteks tambahan. Fitur 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 melakukan logika berdasarkan peran dan tindakan dalam GitLab, mengategorikan peristiwa, dan menetapkan tingkat keparahan yang sesuai.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps.
- Akses istimewa ke GitLab.
Menyiapkan feed
Ada dua titik entri berbeda untuk menyiapkan feed di platform Google SecOps:
- Setelan SIEM > Feed
- Hub Konten > Paket Konten
Menyiapkan feed dari Setelan SIEM > Feed
Untuk mengonfigurasi feed, ikuti langkah-langkah berikut:
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- 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: pemisah yang digunakan untuk memisahkan baris log, seperti
\n
. - Namespace aset: namespace aset.
- Label penyerapan: label yang diterapkan ke peristiwa dari feed ini.
- Pemisah pemisahan: pemisah yang digunakan untuk memisahkan baris log, seperti
- Klik Berikutnya.
- Tinjau konfigurasi feed di layar Selesaikan, lalu klik Kirim.
- 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.
- Di tab Detail, salin URL endpoint feed dari kolom Informasi Endpoint. Anda perlu menentukan URL endpoint ini di aplikasi klien Anda.
- Klik Selesai.
Menyiapkan feed dari Hub Konten
Tentukan nilai untuk kolom berikut:
- Pemisah pemisahan: pemisah yang digunakan untuk memisahkan baris log, seperti
\n
.
Opsi lanjutan
- Nama Feed: Nilai yang telah diisi otomatis yang mengidentifikasi feed.
- Jenis Sumber: Metode yang digunakan untuk mengumpulkan log ke Google SecOps.
- Namespace Aset: Namespace yang terkait dengan feed.
Label Penyerapan: Label yang diterapkan ke semua peristiwa dari feed ini.
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.
Di tab Detail, salin URL endpoint feed dari kolom Informasi Endpoint. Anda perlu menentukan URL endpoint ini di aplikasi klien Anda.
Membuat kunci API untuk feed webhook
Buka konsolGoogle Cloud > Kredensial.
Klik Create credentials, lalu pilih API key.
Membatasi akses kunci API ke Chronicle API.
Tentukan URL endpoint
- Di aplikasi klien Anda, tentukan URL endpoint HTTPS yang disediakan di feed webhook.
Aktifkan autentikasi dengan menentukan kunci API dan kunci rahasia 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 Anda, lalu buka project GitLab yang ingin Anda konfigurasi webhook-nya.
- Di project Anda, buka Settings > Webhooks.
- Klik Tambahkan webhook baru.
- Di kolom URL, tempelkan URL Endpoint SecOps Google.
- Klik Tambahkan header kustom.
- Ketik X-Webhook-Access-Key di kolom Header Name.
- Untuk kolom Header Value, salin Kunci Secret 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 meningkatkan keamanan, buat token rahasia dan tambahkan ke konfigurasi webhook GitLab dan konfigurasi Feed Google SecOps yang sesuai. Hal ini membantu memverifikasi keaslian webhook masuk.
- Pilih peristiwa GitLab yang akan memicu webhook. Misalnya, Anda dapat memilih Push events 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 pemuatan yang tidak perlu.
- Untuk lebih memahami tujuan webhook, beri nama yang bermakna, seperti Webhook Google SecOps.
- Pastikan kotak 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 |
Disetel 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 Entitas". |
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 |
Ditetapkan ke "UNKNOWN_APPLICATION_PROTOCOL" jika nilainya adalah "web", atau dikonversi menjadi 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 "Caller Id" 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 "Request Urgency" dan nilai string. |
jsonPayload.severity |
security_result.severity |
Ditetapkan ke "INFORMATIONAL" jika nilainya adalah "INFO", "ERROR" jika nilainya adalah "ERROR", dan "MEDIUM" jika nilainya adalah "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, digunakan jika pesan berisi "Removing user". |
logName |
security_result.category_details |
Nilai kolom log mentah. |
message |
security_result.summary |
Nilai kolom log mentah, 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 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 "Jenis Permintaan" dan nilai string. |
protoPayload.request.resource |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "Minta 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 email tersebut akan ditambahkan ke target.user.email_addresses dan target.user.userid . |
receiveTimestamp |
metadata.event_timestamp , timestamp |
Diuraikan 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 |
Diperoleh dari protoPayload.authorizationInfo.granted . |
security_result.category_details |
security_result.category_details |
Digabungkan dengan logName . |
security_result.description |
security_result.description |
Diperoleh 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 |
Ditetapkan ke "INFORMATIONAL" jika nilainya adalah "INFO", "ERROR" jika nilainya adalah "ERROR", dan "MEDIUM" jika nilainya adalah "NOTICE". |
sourceLocation |
principal.resource.attribute.labels |
Nilai dalam kolom ini ditambahkan sebagai label. |
target_details |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "Detail Target". |
target_type |
target.resource.attribute.labels |
Ditambahkan sebagai label dengan kunci "target type". |
timestamp |
timestamp |
Nilai kolom log mentah. Ditetapkan berdasarkan keberadaan kolom target dan prinsipal. Defaultnya adalah "GENERIC_EVENT" jika tidak ada kondisi tertentu yang terpenuhi. Nilai yang mungkin adalah "USER_RESOURCE_UPDATE_CONTENT", "USER_RESOURCE_ACCESS", "USER_UNCATEGORIZED". Ditetapkan ke "GITLAB". Ditetapkan ke "GITLAB". |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.