Mengumpulkan log Framework Pemindaian File
Dokumen ini menjelaskan cara menyerap log File Scanning Framework ke Google Security Operations menggunakan Google Cloud Storage V2.
File Scanning Framework (FSF) adalah solusi pemindaian file rekursif modular open source yang dikembangkan oleh Emerson Electric Co. FSF menggunakan arsitektur client-server untuk menganalisis file dan menghasilkan hasil pemindaian JSON yang mendetail, termasuk metadata file, kecocokan tanda tangan YARA, sub-objek yang diekstrak, dan metadata khusus modul.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Project GCP dengan Cloud Storage API diaktifkan
- Izin untuk membuat dan mengelola bucket GCS
- Izin untuk mengelola kebijakan IAM di bucket GCS
- Instance server FSF yang di-deploy dengan akses tulis ke direktori log
- Akses root atau sudo ke host server FSF
Membuat bucket Google Cloud Storage
- Buka Konsol Google Cloud.
- Pilih project Anda atau buat project baru.
- Di menu navigasi, buka Cloud Storage > Buckets.
- Klik Create bucket.
Berikan detail konfigurasi berikut:
Setelan Nilai Beri nama bucket Anda Masukkan nama yang unik secara global (misalnya, fsf-logs-secops).Location type Pilih berdasarkan kebutuhan Anda (Region, Dual-region, Multi-region). Location Pilih lokasi (misalnya, us-central1).Kelas penyimpanan Standar (direkomendasikan untuk log yang sering diakses). Access control Seragam (direkomendasikan). Alat perlindungan Opsional: Aktifkan pembuatan versi objek atau kebijakan retensi. Klik Create.
Mengonfigurasi direktori output log FSF
FSF menulis hasil pemindaian JSON ke direktori log yang dapat dikonfigurasi. Konfigurasi direktori khusus untuk penyerapan Google SecOps.
- Hubungkan ke host server FSF melalui SSH.
Buka file konfigurasi server FSF:
sudo nano /opt/fsf/fsf-server/conf/config.pyCari kamus
SCANNER_CONFIG.Perbarui parameter
LOG_PATHke direktori khusus:SCANNER_CONFIG = { 'LOG_PATH': '/var/log/fsf', 'YARA_PATH': '/opt/fsf/fsf-server/yara/rules.yara', 'PID_PATH': '/tmp/scanner.pid', 'EXPORT_PATH': '/tmp', 'TIMEOUT': 60, 'MAX_DEPTH': 10 }Simpan dan tutup file tersebut.
Buat direktori log dengan izin yang sesuai:
sudo mkdir -p /var/log/fsf sudo chown -R fsf:fsf /var/log/fsf sudo chmod 755 /var/log/fsfMulai ulang server FSF untuk menerapkan perubahan:
sudo systemctl restart fsfVerifikasi bahwa FSF menulis log ke direktori baru:
ls -lh /var/log/fsf/
Menginstal dan mengonfigurasi Fluentd
Fluentd akan memantau file log FSF dan mengirimkannya ke Google Cloud Storage.
Menginstal Fluentd
Di host server FSF, instal Fluentd (td-agent):
curl -fsSL https://toolbelt.treasuredata.com/sh/install-ubuntu-jammy-td-agent4.sh | shInstal plugin output GCS:
sudo td-agent-gem install fluent-plugin-gcsVerifikasi penginstalan plugin:
td-agent-gem list | grep fluent-plugin-gcs
Buat akun layanan GCP untuk Fluentd
- Di GCP Console, buka IAM & Admin > Service Accounts.
- Klik Create Service Account.
- Berikan detail konfigurasi berikut:
- Nama akun layanan: Masukkan
fsf-fluentd-shipper. - Deskripsi akun layanan: Masukkan
Service account for Fluentd to ship FSF logs to GCS.
- Nama akun layanan: Masukkan
- Klik Create and Continue.
- Di bagian Berikan akun layanan ini akses ke project:
- Klik Pilih peran.
- Telusuri dan pilih Storage Object Admin.
- Klik Lanjutkan.
- Klik Done.
Buat kunci akun layanan
- Dari daftar Akun Layanan, klik akun layanan (
fsf-fluentd-shipper). - Buka tab Kunci.
- Klik Tambahkan Kunci > Buat kunci baru.
- Pilih JSON sebagai jenis kunci.
- Klik Create.
- File kunci JSON akan didownload ke komputer Anda.
Transfer file kunci ke host server FSF:
scp /path/to/downloaded-key.json user@fsf-server:/etc/td-agent/gcp-key.jsonTetapkan izin yang sesuai pada file kunci:
sudo chown td-agent:td-agent /etc/td-agent/gcp-key.json sudo chmod 600 /etc/td-agent/gcp-key.json
Memberikan izin IAM pada bucket GCS
- Buka Cloud Storage > Buckets.
- Klik nama bucket (
fsf-logs-secops). - Buka tab Izin.
- Klik Grant access.
- Berikan detail konfigurasi berikut:
- Tambahkan prinsipal: Masukkan email akun layanan (misalnya,
fsf-fluentd-shipper@PROJECT_ID.iam.gserviceaccount.com). - Tetapkan peran: Pilih Storage Object Admin.
- Tambahkan prinsipal: Masukkan email akun layanan (misalnya,
- Klik Simpan.
Mengonfigurasi Fluentd
Di host server FSF, buat file konfigurasi Fluentd:
sudo nano /etc/td-agent/td-agent.confTambahkan konfigurasi berikut:
# Tail FSF JSON logs <source> @type tail path /var/log/fsf/*.log pos_file /var/log/td-agent/fsf.log.pos tag fsf.scan read_from_head true <parse> @type json time_key timestamp time_format %Y-%m-%dT%H:%M:%S.%L%z </parse> </source> # Ship to Google Cloud Storage <match fsf.scan> @type gcs project YOUR_GCP_PROJECT_ID keyfile /etc/td-agent/gcp-key.json bucket fsf-logs-secops object_key_format %{path}%{time_slice}_%{index}.%{file_extension} path fsf-logs/ <buffer tag,time> @type file path /var/log/td-agent/buffer/gcs timekey 3600 timekey_wait 10m timekey_use_utc true chunk_limit_size 10MB </buffer> <format> @type json </format> store_as json auto_create_bucket false </match>Ganti
YOUR_GCP_PROJECT_IDdengan project ID GCP Anda yang sebenarnya.Simpan dan tutup file tersebut.
Buat direktori buffer:
sudo mkdir -p /var/log/td-agent/buffer/gcs sudo chown -R td-agent:td-agent /var/log/td-agent/bufferMulai ulang Fluentd untuk menerapkan konfigurasi:
sudo systemctl restart td-agentAktifkan Fluentd agar dimulai saat booting:
sudo systemctl enable td-agentPastikan Fluentd sedang berjalan:
sudo systemctl status td-agent
Memverifikasi pengiriman log
Periksa log Fluentd untuk mengetahui error:
sudo tail -f /var/log/td-agent/td-agent.logPicu pemindaian FSF pengujian untuk membuat log:
echo "test content" > /tmp/test.txt /opt/fsf/fsf-client/fsf_client.py /tmp/test.txt --suppress-reportTunggu 1-2 menit agar Fluentd memproses dan mengirimkan log.
Di Konsol GCP, buka Cloud Storage > Buckets.
Klik nama bucket (
fsf-logs-secops).Buka awalan
fsf-logs/.Verifikasi bahwa file JSON dibuat dengan stempel waktu.
Download dan periksa file untuk mengonfirmasi bahwa file tersebut berisi hasil pemindaian FSF dalam format JSON.
Mengambil akun layanan Google SecOps
Google SecOps menggunakan akun layanan unik untuk membaca data dari bucket GCS Anda. Anda harus memberi akun layanan ini akses ke bucket Anda.
Dapatkan email akun layanan
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
FSF File Scanning Logs). - Pilih Google Cloud Storage V2 sebagai Source type.
- Pilih File Scanning Framework sebagai Jenis log.
Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:
secops-12345678@secops-gcp-prod.iam.gserviceaccount.comSalin alamat email untuk digunakan di langkah berikutnya.
Klik Berikutnya.
Tentukan nilai untuk parameter input berikut:
URL bucket penyimpanan: Masukkan URI bucket GCS dengan jalur awalan:
gs://fsf-logs-secops/fsf-logs/Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda:
- Jangan pernah: Tidak pernah menghapus file apa pun setelah transfer (direkomendasikan untuk pengujian).
- Hapus file yang ditransfer: Menghapus file setelah transfer berhasil.
Hapus file yang ditransfer dan direktori kosong: Menghapus file dan direktori kosong setelah transfer berhasil.
Usia File Maksimum: Menyertakan file yang dimodifikasi dalam beberapa hari terakhir (defaultnya adalah 180 hari).
Namespace aset: Namespace aset.
Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
Klik Berikutnya.
Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Memberikan izin IAM ke akun layanan Google SecOps
Akun layanan Google SecOps memerlukan peran Storage Object Viewer di bucket GCS Anda.
- Buka Cloud Storage > Buckets.
- Klik nama bucket (
fsf-logs-secops). - Buka tab Izin.
- Klik Grant access.
- Berikan detail konfigurasi berikut:
- Add principals: Tempel email akun layanan Google SecOps.
- Tetapkan peran: Pilih Storage Object Viewer.
- Klik Simpan.
Memverifikasi penyerapan
- Tunggu 10-15 menit hingga penyerapan awal selesai.
- Di Google SecOps, buka SIEM Settings > Feeds.
- Temukan feed (
FSF File Scanning Logs). - Pastikan Status ditampilkan sebagai Aktif.
- Klik nama feed untuk melihat metrik penyerapan.
- Pastikan jumlah Peristiwa yang diproses meningkat.
- Buka Penelusuran di Google SecOps.
Jalankan kueri penelusuran untuk memverifikasi bahwa log FSF sedang di-ingest:
metadata.log_type = "FILE_SCANNING_FRAMEWORK"Pastikan hasil pemindaian FSF muncul di hasil penelusuran.
Pemecahan masalah
Tidak ada log yang muncul di GCS
Verifikasi bahwa FSF menulis log ke
/var/log/fsf/:ls -lh /var/log/fsf/ tail -f /var/log/fsf/*.logPeriksa log Fluentd untuk mengetahui error:
sudo tail -f /var/log/td-agent/td-agent.logPastikan kunci akun layanan GCP valid dan memiliki izin yang benar.
Pastikan nama bucket dalam konfigurasi Fluentd cocok dengan nama bucket sebenarnya.
Error izin Fluentd
- Pastikan akun layanan (
fsf-fluentd-shipper) memiliki peran Storage Object Admin di bucket. - Pastikan jalur kunci dalam konfigurasi Fluentd sudah benar.
Verifikasi bahwa file kunci memiliki kepemilikan dan izin yang benar:
ls -l /etc/td-agent/gcp-key.json
Google SecOps tidak menyerap log
- Pastikan akun layanan Google SecOps memiliki peran Storage Object Viewer di bucket.
- Pastikan URI bucket dalam konfigurasi feed sudah benar dan menyertakan garis miring di akhir.
- Verifikasi bahwa file ada di bucket GCS pada jalur awalan yang ditentukan.
- Periksa status feed di SIEM Settings > Feeds untuk melihat pesan error.
Log FSF tidak dalam format yang diharapkan
- Verifikasi bahwa FSF dikonfigurasi untuk menulis output JSON (perilaku default).
- Pastikan bagian
<parse>Fluentd dikonfigurasi dengan@type json. Periksa file log secara manual untuk memverifikasi bahwa file tersebut berisi JSON yang valid:
head -n 1 /var/log/fsf/*.log | jq .
Tabel pemetaan UDM
| Kolom log | Pemetaan UDM | Logika |
|---|---|---|
| CompressType_label, compressed_parents | about.labels | Digabungkan dari CompressType_label (kunci "Compress Type", nilai dari Object.EXTRACT_ZIP.Object_0.Compress Type jika pesan berisi "Compress Type") dan compressed_parents (kunci "Compressed Parent Files", digabungkan dari Object.EXTRACT_ZIP.Object_0.META_VT_CACHE.vt_data.additional_info.compressed_parents) |
| Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.MD5, Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.MD5, Object.EXTRACT_SWF.META_BASIC_INFO.MD5, Object.EXTRACT_GZIP.META_BASIC_INFO.MD5, Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.MD5 | intermediary.file.md5 | Nilai dari Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.MD5 jika EXTRACT_EMBEDDED ada, atau Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.MD5 jika EXTRACT_ZIP ada, atau Object.EXTRACT_SWF.META_BASIC_INFO.MD5 jika EXTRACT_SWF ada, atau Object.EXTRACT_GZIP.META_BASIC_INFO.MD5 jika EXTRACT_GZIP ada, atau Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.MD5 |
| Object.EXTRACT_EMBEDDED.Object_0.Description | intermediary.file.mime_type | Nilai disalin secara langsung |
| Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.SHA1, Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.SHA1, Object.EXTRACT_SWF.META_BASIC_INFO.SHA1, Object.EXTRACT_GZIP.META_BASIC_INFO.SHA1, Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.SHA1 | intermediary.file.sha1 | Nilai dari Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.SHA1 jika EXTRACT_EMBEDDED ada, atau Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.SHA1 jika EXTRACT_ZIP ada, atau Object.EXTRACT_SWF.META_BASIC_INFO.SHA1 jika EXTRACT_SWF ada, atau Object.EXTRACT_GZIP.META_BASIC_INFO.SHA1 jika EXTRACT_GZIP ada, atau Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.SHA1 |
| Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.SHA256, Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.SHA256, Object.EXTRACT_SWF.META_BASIC_INFO.SHA256, Object.EXTRACT_GZIP.META_BASIC_INFO.SHA256, Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.SHA256 | intermediary.file.sha256 | Nilai dari Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.SHA256 jika EXTRACT_EMBEDDED ada, atau Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.SHA256 jika EXTRACT_ZIP ada, atau Object.EXTRACT_SWF.META_BASIC_INFO.SHA256 jika EXTRACT_SWF ada, atau Object.EXTRACT_GZIP.META_BASIC_INFO.SHA256 jika EXTRACT_GZIP ada, atau Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.SHA256 |
| Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.Size, Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.Size, Object.EXTRACT_SWF.META_BASIC_INFO.Size, Object.EXTRACT_GZIP.META_BASIC_INFO.Size, Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.Size | intermediary.file.size | Nilai dari Object.EXTRACT_EMBEDDED.Object_0.META_BASIC_INFO.Size jika EXTRACT_EMBEDDED ada, atau Object.EXTRACT_ZIP.Object_0.META_BASIC_INFO.Size jika EXTRACT_ZIP ada, atau Object.EXTRACT_SWF.META_BASIC_INFO.Size jika EXTRACT_SWF ada, atau Object.EXTRACT_GZIP.META_BASIC_INFO.Size jika EXTRACT_GZIP ada, atau Object.EXTRACT_CAB.Object_0.META_BASIC_INFO.Size; tanpa " .*" di akhir dan dikonversi ke uinteger |
| Object.EXTRACT_ZIP.Object_0.META_VT_CACHE.vt_data.scan_id | intermediary.resource.id | Nilai disalin secara langsung |
| Object.EXTRACT_ZIP.Object_0.META_VT_CACHE.vt_data.permalink | intermediary.url | Nilai disalin secara langsung |
| Object.META_EMERSON_INFO.results | intermediary.user.email_addresses | Digabungkan dari matched_email dalam array hasil |
| Summary.Observations | metadata.description | Digabungkan dari array dengan pemisah ", ", koma di awal dihapus |
| Waktu Pemindaian | metadata.event_timestamp | Dikonversi menggunakan filter tanggal dengan format yyyy-MM-dd HH:mm:ss |
| Sumber | metadata.event_type | Ditetapkan ke "SCAN_FILE" jika Sumber tidak kosong, jika tidak "GENERIC_EVENT" |
| Object.META_VT_CACHE._id | metadata.product_log_id | Nilai disalin secara langsung |
| result.ad_data.message | network.http.response_code | Diekstrak sebagai bilangan bulat menggunakan pola grok INT dari result.ad_data.message |
| Sumber | principal.hostname | Nilai disalin secara langsung |
| Object.META_EMERSON_INFO.result_summary, Object.EXTRACT_ZIP.Object_0.META_VT_CACHE.vt_data.verbose_msg | security_result.summary | Tetapkan ke Object.META_EMERSON_INFO.result_summary jika ada, atau Object.EXTRACT_ZIP.Object_0.META_VT_CACHE.vt_data.verbose_msg |
| Nama file | target.file.full_path | Nilai disalin secara langsung |
| Object.META_BASIC_INFO.MD5 | target.file.md5 | Nilai disalin secara langsung |
| Summary.Yara | target.file.mime_type | Diekstrak dari indeks pertama Summary.Yara, huruf besar, dan "FT_" dihapus jika Yara ada, jika tidak, ditetapkan ke "ZIP" jika EXTRACT_ZIP ada, "SWF" jika EXTRACT_SWF ada, "GZIP" jika EXTRACT_GZIP ada, "CAB" jika EXTRACT_CAB ada |
| Object.META_BASIC_INFO.SHA1, Object.META_VT_CACHE.SHA1 | target.file.sha1 | Nilai dari Object.META_BASIC_INFO.SHA1 jika tidak kosong, atau Object.META_VT_CACHE.SHA1 |
| Object.META_BASIC_INFO.SHA256 | target.file.sha256 | Nilai disalin secara langsung |
| Object.META_BASIC_INFO.Size | target.file.size | Menghapus " .*" di akhir dan dikonversi menjadi uinteger |
| metadata.vendor_name | Ditetapkan ke "EMERSON" | |
| metadata.product_name | Setel ke "FILE SCANNING FRAMEWORK" |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.