Mengumpulkan log Microsoft SQL Server
Dokumen ini menjelaskan cara menyerap log Microsoft SQL Server ke Google Security Operations menggunakan BindPlane. Parser menangani log Microsoft SQL Server terstruktur (JSON, key-value pair) dan semi-terstruktur (syslog). Proses ini mengekstrak kolom, menormalisasi stempel waktu, menangani berbagai format log berdasarkan konten SourceModuleType dan Message (termasuk peristiwa audit, login, dan database), serta memetakannya ke UDM. Agen ini juga melakukan logika parsing khusus untuk catatan audit, upaya login, dan operasi database, yang memperkaya data dengan informasi konteks dan tingkat keparahan tambahan.Agen ini mengumpulkan log Audit dan Error SQL Server dari Log Peristiwa Windows menggunakan penerus syslog (NXLog) dan mengirimkannya ke agen BindPlane untuk dikirimkan ke Google SecOps.
Sebelum memulai
Pastikan Anda memenuhi prasyarat berikut:
- Instance Google SecOps
- Host Windows Server 2016 atau yang lebih baru yang menjalankan Microsoft SQL Server
- Akses administratif untuk menginstal dan mengonfigurasi Agen BindPlane dan NXLog
- Jika berjalan di belakang proxy, pastikan port firewall terbuka sesuai dengan persyaratan agen Bindplane
Mendapatkan file autentikasi penyerapan Google SecOps
- Login ke konsol Google SecOps.
- Buka Setelan SIEM > Agen Pengumpulan.
- Download File Autentikasi Penyerapan. Simpan file dengan aman di sistem tempat BindPlane akan diinstal.
Mendapatkan ID pelanggan Google SecOps
- Login ke konsol Google SecOps.
- Buka Setelan SIEM > Profil.
- Salin dan simpan ID Pelanggan dari bagian Detail Organisasi.
Menginstal agen Bindplane
Instal agen Bindplane di sistem operasi Windows atau Linux Anda sesuai dengan petunjuk berikut.
Penginstalan Windows
- Buka Command Prompt atau PowerShell sebagai administrator.
Jalankan perintah berikut:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Referensi penginstalan tambahan
Untuk opsi penginstalan tambahan, lihat panduan penginstalan.
Mengonfigurasi agen BindPlane untuk menyerap Syslog dan mengirimkannya ke Google SecOps
- Akses file konfigurasi:
- Cari file
config.yaml. Biasanya, ada di direktori `C:\Program Files\observIQ\bindplane-agent` di Windows. - Buka file menggunakan editor teks (misalnya,
nano,vi, atau Notepad).
- Cari file
Edit file
config.yamlsebagai berikut:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:1514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <YOUR_CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'MICROSOFT_SQL' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels- Ganti port dan alamat IP sesuai kebutuhan di infrastruktur Anda.
- Ganti
<customer_id>dengan ID pelanggan yang sebenarnya. - Perbarui
/path/to/ingestion-authentication-file.jsonke jalur tempat file autentikasi disimpan di bagian Dapatkan file autentikasi penyerapan Google SecOps.
Mulai ulang agen Bindplane untuk menerapkan perubahan
Untuk memulai ulang agen Bindplane di Windows, Anda dapat menggunakan konsol Services atau memasukkan perintah berikut:
net stop BindPlaneAgent && net start BindPlaneAgent
Mengaktifkan Audit SQL Server di Log Peristiwa Windows
Anda dapat mengaktifkan Audit SQL Server menggunakan GUI SQL Server Management Studio (SSMS) atau perintah T-SQL. Pilih opsi yang paling sesuai dengan lingkungan Anda.
Opsi 1: Mengaktifkan Audit SQL Server melalui GUI SSMS
Membuat Audit Server di UI SQL Server Management Studio
- Buka SQL Server Management Studio (SSMS) dan hubungkan ke instance SQL Server Anda.
- Di Object Explorer, luaskan instance server Anda.
- Luaskan folder Security.
- Klik kanan Audits, lalu pilih New Audit.
- Dalam dialog Buat Audit, berikan detail konfigurasi berikut:
- Nama audit: Masukkan
ChronicleAudit. - Penundaan antrean (dalam milidetik): Masukkan
1000. - Saat log audit gagal: Pilih Lanjutkan.
- Tujuan audit: Pilih Log Aplikasi.
- Nama audit: Masukkan
- Klik OK untuk membuat audit.
- Di Object Explorer, klik kanan ChronicleAudit yang baru dibuat, lalu pilih Enable Audit.
Membuat Spesifikasi Audit Server melalui GUI SSMS
- Di Object Explorer, luaskan Security.
- Klik kanan Server Audit Specifications, lalu pilih New Server Audit Specification.
- Dalam dialog Create Server Audit Specification, berikan detail konfigurasi berikut:
- Nama: Masukkan
ChronicleAuditSpec. - Audit: Pilih ChronicleAudit dari menu.
- Nama: Masukkan
- Di bagian Jenis Tindakan Audit, klik Tambahkan, lalu pilih grup tindakan audit berikut (tambahkan setiap grup satu per satu dengan mengklik Tambahkan setelah memilih setiap grup):
- FAILED_LOGIN_GROUP
- SUCCESSFUL_LOGIN_GROUP
- LOGOUT_GROUP
- SERVER_ROLE_MEMBER_CHANGE_GROUP
- DATABASE_OBJECT_CHANGE_GROUP
- DATABASE_PRINCIPAL_CHANGE_GROUP
- SCHEMA_OBJECT_CHANGE_GROUP
- DATABASE_PERMISSION_CHANGE_GROUP
- Klik OK untuk membuat spesifikasi audit.
- Di Object Explorer, klik kanan ChronicleAuditSpec yang baru dibuat, lalu pilih Enable Server Audit Specification.
Memverifikasi Konfigurasi Audit
- Di Object Explorer, luaskan Security > Audits.
- Klik kanan ChronicleAudit, lalu pilih Properties.
- Pastikan Status ditampilkan sebagai Dimulai atau Diaktifkan.
- Luaskan Keamanan > Spesifikasi Audit Server.
- Klik kanan ChronicleAuditSpec, lalu pilih Properties.
- Pastikan semua delapan grup tindakan audit tercantum dan spesifikasi diaktifkan.
Opsi 2: Mengaktifkan Audit SQL Server menggunakan T-SQL
- Buka SQL Server Management Studio (SSMS) dan hubungkan ke instance SQL Server Anda.
Jalankan perintah T-SQL berikut untuk membuat audit server yang menulis ke Log Aplikasi Windows:
USE master; GO CREATE SERVER AUDIT ChronicleAudit TO APPLICATION_LOG WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE); GO ALTER SERVER AUDIT ChronicleAudit WITH (STATE = ON); GOBuat spesifikasi audit untuk merekam peristiwa keamanan yang relevan:
CREATE SERVER AUDIT SPECIFICATION ChronicleAuditSpec FOR SERVER AUDIT ChronicleAudit ADD (FAILED_LOGIN_GROUP), ADD (SUCCESSFUL_LOGIN_GROUP), ADD (LOGOUT_GROUP), ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP), ADD (DATABASE_OBJECT_CHANGE_GROUP), ADD (DATABASE_PRINCIPAL_CHANGE_GROUP), ADD (SCHEMA_OBJECT_CHANGE_GROUP), ADD (DATABASE_PERMISSION_CHANGE_GROUP); GO ALTER SERVER AUDIT SPECIFICATION ChronicleAuditSpec WITH (STATE = ON); GO
Konfigurasi ini memastikan peristiwa autentikasi, perubahan izin, dan modifikasi objek dicatat ke Log Peristiwa Windows.
Menginstal dan mengonfigurasi NXLog untuk meneruskan peristiwa ke BindPlane
- Download NXLog Community Edition dari nxlog.co/downloads.
- Jalankan penginstal dan selesaikan wizard penginstalan.
Buka file konfigurasi NXLog yang berada di:
C:\Program Files\nxlog\conf\nxlog.confGanti konten dengan konfigurasi berikut:
define ROOT C:\Program Files\nxlog Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log <Extension _json> Module xm_json </Extension> <Input in_eventlog> Module im_msvistalog Query <QueryList>\ <Query Id="0">\ <Select Path="Application">*[System[Provider[@Name='MSSQLSERVER']]]</Select>\ </Query>\ </QueryList> </Input> <Output out_syslog> Module om_udp Host 127.0.0.1 Port 1514 Exec to_json(); </Output> <Route r1> Path in_eventlog => out_syslog </Route>- Ganti nilai saat ini
127.0.0.1Host dengan alamat IP agen Bindplane. - Pastikan nilai Port cocok dengan port penerima Bindplane
udplogyang dikonfigurasi sebelumnya.
- Ganti nilai saat ini
Simpan file dan mulai ulang layanan NXLog:
net stop nxlog && net start nxlog
Tabel Pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
AccountName |
principal.user.userid |
Digunakan untuk principal.user.userid jika ada dalam log seperti Starting up database atau Log was backed up. |
AgentDevice |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "AgentDevice". |
AgentLogFile |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "AgentLogFile". |
agent.hostname |
observer.asset.hostname |
Dipetakan ke nama host pengamat. |
agent.id |
observer.asset_id |
Digabungkan dengan agent.type untuk membentuk observer.asset_id. |
agent.type |
observer.asset_id |
Digabungkan dengan agent.id untuk membentuk observer.asset_id. |
agent.version |
observer.platform_version |
Memetakan ke versi platform pengamat. |
ApplicationName |
principal.application |
Memetakan ke aplikasi utama. |
application_name |
target.application |
Memetakan ke aplikasi target. |
client_address |
principal.ip |
Digunakan untuk IP utama jika berbeda dari host dan bukan pipe lokal atau bernama. |
client_ip |
principal.ip |
Memetakan ke IP utama. |
computer_name |
about.hostname |
Memetakan ke nama host about. |
correlationId |
security_result.detection_fields |
Ditambahkan sebagai pasangan nilai kunci ke security_result.detection_fields dengan kunci "correlationId". |
Date |
metadata.event_timestamp |
Digabungkan dengan Time untuk membuat stempel waktu acara. |
database_name |
target.resource_ancestors.name |
Digunakan untuk nama ancestor resource target jika ada di log audit. |
durationMs |
network.session_duration.seconds |
Dikonversi dari milidetik ke detik dan dipetakan. |
ecs.version |
metadata.product_version |
Memetakan ke versi produk. |
error |
security_result.detection_fields |
Ditambahkan sebagai pasangan nilai kunci ke security_result.detection_fields dengan kunci "error". |
err_msg |
security_result.description |
Dipetakan ke deskripsi hasil keamanan. |
EventID |
metadata.product_event_type |
Digunakan untuk membuat jenis peristiwa produk jika kolom lain tidak tersedia, dengan awalan "EventID: ". |
event.action |
Source |
Digunakan sebagai sumber jika ada. |
event.code |
metadata.product_event_type |
Digabungkan dengan event.provider untuk membentuk metadata.product_event_type. |
event.provider |
metadata.product_event_type |
Digabungkan dengan event.code untuk membentuk metadata.product_event_type. |
EventReceivedTime |
metadata.ingested_timestamp |
Diuraikan dan digunakan sebagai stempel waktu yang di-ingest. |
event_time |
metadata.event_timestamp |
Diuraikan dan digunakan sebagai stempel waktu peristiwa. |
file_name |
principal.process.file.full_path |
Memetakan ke jalur lengkap file proses utama. |
file_path |
target.file.full_path |
Digunakan untuk jalur lengkap file target jika ditemukan di log pencadangan. |
first_lsn |
target.resource.attribute.labels |
Ditambahkan sebagai pasangan nilai kunci ke target.resource.attribute.labels dengan kunci "LSN Pertama". |
host |
principal.hostname, observer.hostname |
Digunakan untuk nama host utama atau pengamat jika bukan IP. Juga digunakan untuk nama host atau IP target, bergantung pada apakah itu IP atau bukan. |
host.ip |
principal.ip |
Digabungkan ke IP utama. |
host.name |
host |
Digunakan sebagai host jika ada. |
Hostname |
principal.hostname, target.hostname |
Digunakan untuk nama host utama atau target jika ada. |
hostinfo.architecture |
principal.asset.hardware.cpu_platform |
Dipetakan ke platform CPU hardware aset utama. |
hostinfo.os.build |
additional.fields |
Ditambahkan sebagai key-value pair ke additional.fields dengan kunci "os_build". |
hostinfo.os.kernel |
principal.platform_patch_level |
Memetakan ke tingkat patch platform utama. |
hostinfo.os.name |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "os_name". |
hostinfo.os.platform |
principal.platform |
Huruf kapital dan dipetakan ke platform utama. |
hostinfo.os.version |
principal.platform_version |
Memetakan ke versi platform utama. |
last_lsn |
target.resource.attribute.labels |
Ditambahkan sebagai pasangan nilai kunci ke target.resource.attribute.labels dengan kunci "LSN Terakhir". |
level |
security_result.severity |
Jika "Informasional", tetapkan security_result.severity ke "INFORMATIONAL". |
log.level |
security_result.severity_details |
Memetakan ke detail tingkat keparahan hasil keamanan. |
LoginName |
principal.user.userid |
Digunakan untuk ID pengguna utama jika ada di log KV. |
login_result |
security_result.action |
Menentukan tindakan hasil keamanan (ALLOW atau BLOCK). |
logon_user |
principal.user.userid |
Digunakan untuk ID pengguna utama jika ada di log login. |
logstash.process.host |
intermediary.hostname |
Memetakan ke nama host perantara. |
Message |
metadata.description, security_result.description |
Digunakan untuk deskripsi peristiwa atau deskripsi hasil keamanan, bergantung pada jenis log. |
msg |
metadata.description |
Digunakan untuk deskripsi acara jika ada. |
ObjectName |
target.resource.name |
Dipetakan ke nama resource target. |
object_name |
target.resource.name |
Digunakan untuk nama resource target jika ada di log audit. |
ObjectType |
target.resource.type |
Memetakan ke jenis resource target. |
operationId |
security_result.detection_fields |
Ditambahkan sebagai pasangan nilai kunci ke security_result.detection_fields dengan kunci "operationId". |
operationName |
metadata.product_event_type |
Dipetakan ke jenis peristiwa produk. |
operationVersion |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "operationVersion". |
ProcessInfo |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "ProcessInfo". |
properties.apiVersion |
metadata.product_version |
Memetakan ke versi produk. |
properties.appId |
target.resource.product_object_id |
Dipetakan ke ID objek produk resource target. |
properties.clientAuthMethod |
extensions.auth.auth_details |
Digunakan untuk menentukan detail autentikasi. |
properties.clientRequestId |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "clientRequestId". |
properties.durationMs |
network.session_duration.seconds |
Dikonversi menjadi detik dan dipetakan. |
properties.identityProvider |
security_result.detection_fields |
Ditambahkan sebagai pasangan nilai kunci ke security_result.detection_fields dengan kunci "identityProvider". |
properties.ipAddress |
principal.ip, principal.asset.ip |
Diuraikan untuk IP dan digabungkan ke IP utama dan IP aset utama. |
properties.location |
principal.location.name |
Dipetakan ke nama lokasi utama. |
properties.operationId |
security_result.detection_fields |
Ditambahkan sebagai pasangan nilai kunci ke security_result.detection_fields dengan kunci "operationId". |
properties.requestId |
metadata.product_log_id |
Dipetakan ke ID log produk. |
properties.requestMethod |
network.http.method |
Dipetakan ke metode HTTP jaringan. |
properties.requestUri |
target.url |
Memetakan ke URL target. |
properties.responseSizeBytes |
network.received_bytes |
Dikonversi menjadi bilangan bulat tidak bertanda dan dipetakan. |
properties.responseStatusCode |
network.http.response_code |
Dikonversi menjadi bilangan bulat dan dipetakan. |
properties.roles |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "roles". |
properties.servicePrincipalId |
principal.user.userid |
Digunakan untuk ID pengguna utama jika properties.userId tidak ada. |
properties.signInActivityId |
network.session_id |
Memetakan ke ID sesi jaringan. |
properties.tenantId |
metadata.product_deployment_id |
Dipetakan ke ID deployment produk. |
properties.tokenIssuedAt |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "tokenIssuedAt". |
properties.userAgent |
network.http.user_agent |
Memetakan ke agen pengguna HTTP jaringan. |
properties.userId |
principal.user.userid |
Digunakan untuk ID pengguna utama jika ada. |
properties.wids |
security_result.detection_fields |
Ditambahkan sebagai key-value pair ke security_result.detection_fields dengan kunci "wids". |
reason |
security_result.summary |
Digunakan untuk ringkasan hasil keamanan dalam peristiwa login. |
resourceId |
target.resource.attribute.labels |
Ditambahkan sebagai pasangan nilai kunci ke target.resource.attribute.labels dengan kunci "ID Resource". |
schema_name |
target.resource_ancestors.resource_subtype |
Digunakan untuk subjenis ancestor resource target jika ada di log audit. |
security_result.description |
metadata.description |
Digunakan untuk deskripsi peristiwa jika bukan peristiwa audit. |
security_result.severity |
security_result.severity |
Memetakan secara langsung jika ada. Disetel ke "RENDAH" untuk log KV, "INFORMASI" untuk pesan error tertentu, dan berasal dari kolom level atau Severity. |
security_result.severity_details |
security_result.severity_details |
Memetakan secara langsung jika ada. |
security_result.summary |
security_result.summary |
Memetakan secara langsung jika ada. Disetel ke "Koneksi dibuat menggunakan autentikasi Windows" atau alasan tertentu dari peristiwa login, atau "SQL Server Audit Record" untuk peristiwa audit. |
security_result_action |
security_result.action |
Digabungkan ke dalam security_result.action. Ditetapkan ke "ALLOW" untuk sebagian besar peristiwa, dan berasal dari login_result untuk peristiwa login. |
server_instance_name |
target.hostname |
Digunakan untuk nama host target jika ada di log audit. |
server_principal_name |
principal.user.userid |
Digunakan untuk ID pengguna utama jika ada di log audit. |
server_principal_sid |
principal.asset_id |
Digunakan untuk membuat ID aset utama, dengan awalan "server SID:". |
session_id |
network.session_id |
Digunakan untuk ID sesi jaringan jika ada di log audit. |
sev |
security_result.severity |
Digunakan untuk menentukan tingkat keparahan hasil keamanan. |
Severity |
security_result.severity |
Digunakan untuk menentukan tingkat keparahan hasil keamanan. |
Source |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "Source". |
source |
principal.resource.attribute.labels |
Ditambahkan sebagai key-value pair ke principal.resource.attribute.labels dengan kunci "source". |
SourceModuleType |
observer.application |
Memetakan ke aplikasi pengamat. |
SourceModuleName |
additional.fields |
Ditambahkan sebagai pasangan nilai kunci ke additional.fields dengan kunci "SourceModuleName". |
source_module_name |
observer.labels |
Ditambahkan sebagai pasangan nilai kunci ke observer.labels dengan kunci "SourceModuleName". |
source_module_type |
observer.application |
Memetakan ke aplikasi pengamat. |
SPID |
network.session_id |
Memetakan ke ID sesi jaringan. |
statement |
target.process.command_line |
Digunakan untuk command line proses target jika ada di log audit. |
TextData |
security_result.description, metadata.description |
Digunakan untuk deskripsi hasil keamanan jika bukan peristiwa login, atau deskripsi peristiwa jika merupakan peristiwa login. |
time |
metadata.event_timestamp |
Diuraikan dan digunakan sebagai stempel waktu peristiwa. |
Time |
metadata.event_timestamp |
Digabungkan dengan Date untuk membuat stempel waktu acara. |
transaction_id |
target.resource.attribute.labels |
Ditambahkan sebagai pasangan nilai kunci ke target.resource.attribute.labels dengan kunci "transaction_id". |
UserID |
principal.user.windows_sid |
Digunakan untuk SID Windows pengguna utama jika ada dan dalam format yang benar. |
user_id |
principal.user.userid |
Digunakan untuk ID pengguna utama jika ada. |
metadata.log_type |
metadata.log_type |
Dikodekan secara permanen ke "MICROSOFT_SQL". |
metadata.vendor_name |
metadata.vendor_name |
Dikodekan secara permanen ke "Microsoft". |
metadata.product_name |
metadata.product_name |
Dikodekan secara permanen ke "SQL Server". |
metadata.event_type |
metadata.event_type |
Disetel ke berbagai nilai, bergantung pada konten log, termasuk "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT", dan "STATUS_UNCATEGORIZED" sebagai default. |
extensions.auth.type |
extensions.auth.type |
Setel ke "MACHINE" untuk peristiwa login dan logout. |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.