Mengumpulkan log Framework Pemindaian File

Didukung di:

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

  1. Buka Konsol Google Cloud.
  2. Pilih project Anda atau buat project baru.
  3. Di menu navigasi, buka Cloud Storage > Buckets.
  4. Klik Create bucket.
  5. 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.
  6. 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.

  1. Hubungkan ke host server FSF melalui SSH.
  2. Buka file konfigurasi server FSF:

    sudo nano /opt/fsf/fsf-server/conf/config.py
    
  3. Cari kamus SCANNER_CONFIG.

  4. Perbarui parameter LOG_PATH ke 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
    }
    
  5. Simpan dan tutup file tersebut.

  6. 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/fsf
    
  7. Mulai ulang server FSF untuk menerapkan perubahan:

    sudo systemctl restart fsf
    
  8. Verifikasi 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

  1. Di host server FSF, instal Fluentd (td-agent):

    curl -fsSL https://toolbelt.treasuredata.com/sh/install-ubuntu-jammy-td-agent4.sh | sh
    
  2. Instal plugin output GCS:

    sudo td-agent-gem install fluent-plugin-gcs
    
  3. Verifikasi penginstalan plugin:

    td-agent-gem list | grep fluent-plugin-gcs
    

Buat akun layanan GCP untuk Fluentd

  1. Di GCP Console, buka IAM & Admin > Service Accounts.
  2. Klik Create Service Account.
  3. 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.
  4. Klik Create and Continue.
  5. Di bagian Berikan akun layanan ini akses ke project:
    1. Klik Pilih peran.
    2. Telusuri dan pilih Storage Object Admin.
  6. Klik Lanjutkan.
  7. Klik Done.

Buat kunci akun layanan

  1. Dari daftar Akun Layanan, klik akun layanan (fsf-fluentd-shipper).
  2. Buka tab Kunci.
  3. Klik Tambahkan Kunci > Buat kunci baru.
  4. Pilih JSON sebagai jenis kunci.
  5. Klik Create.
  6. File kunci JSON akan didownload ke komputer Anda.
  7. Transfer file kunci ke host server FSF:

    scp /path/to/downloaded-key.json user@fsf-server:/etc/td-agent/gcp-key.json
    
  8. Tetapkan 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

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket (fsf-logs-secops).
  3. Buka tab Izin.
  4. Klik Grant access.
  5. 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.
  6. Klik Simpan.

Mengonfigurasi Fluentd

  1. Di host server FSF, buat file konfigurasi Fluentd:

    sudo nano /etc/td-agent/td-agent.conf
    
  2. Tambahkan 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>
    
  3. Ganti YOUR_GCP_PROJECT_ID dengan project ID GCP Anda yang sebenarnya.

  4. Simpan dan tutup file tersebut.

  5. Buat direktori buffer:

    sudo mkdir -p /var/log/td-agent/buffer/gcs
    sudo chown -R td-agent:td-agent /var/log/td-agent/buffer
    
  6. Mulai ulang Fluentd untuk menerapkan konfigurasi:

    sudo systemctl restart td-agent
    
  7. Aktifkan Fluentd agar dimulai saat booting:

    sudo systemctl enable td-agent
    
  8. Pastikan Fluentd sedang berjalan:

    sudo systemctl status td-agent
    

Memverifikasi pengiriman log

  1. Periksa log Fluentd untuk mengetahui error:

    sudo tail -f /var/log/td-agent/td-agent.log
    
  2. Picu pemindaian FSF pengujian untuk membuat log:

    echo "test content" > /tmp/test.txt
    /opt/fsf/fsf-client/fsf_client.py /tmp/test.txt --suppress-report
    
  3. Tunggu 1-2 menit agar Fluentd memproses dan mengirimkan log.

  4. Di Konsol GCP, buka Cloud Storage > Buckets.

  5. Klik nama bucket (fsf-logs-secops).

  6. Buka awalan fsf-logs/.

  7. Verifikasi bahwa file JSON dibuat dengan stempel waktu.

  8. 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

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Baru.
  3. Klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, FSF File Scanning Logs).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih File Scanning Framework sebagai Jenis log.
  7. Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:

    secops-12345678@secops-gcp-prod.iam.gserviceaccount.com
    
  8. Salin alamat email untuk digunakan di langkah berikutnya.

  9. Klik Berikutnya.

  10. 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.

  11. Klik Berikutnya.

  12. 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.

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket (fsf-logs-secops).
  3. Buka tab Izin.
  4. Klik Grant access.
  5. Berikan detail konfigurasi berikut:
    • Add principals: Tempel email akun layanan Google SecOps.
    • Tetapkan peran: Pilih Storage Object Viewer.
  6. Klik Simpan.

Memverifikasi penyerapan

  1. Tunggu 10-15 menit hingga penyerapan awal selesai.
  2. Di Google SecOps, buka SIEM Settings > Feeds.
  3. Temukan feed (FSF File Scanning Logs).
  4. Pastikan Status ditampilkan sebagai Aktif.
  5. Klik nama feed untuk melihat metrik penyerapan.
  6. Pastikan jumlah Peristiwa yang diproses meningkat.
  7. Buka Penelusuran di Google SecOps.
  8. Jalankan kueri penelusuran untuk memverifikasi bahwa log FSF sedang di-ingest:

    metadata.log_type = "FILE_SCANNING_FRAMEWORK"
    
  9. 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/*.log
    
  • Periksa log Fluentd untuk mengetahui error:

    sudo tail -f /var/log/td-agent/td-agent.log
    
  • Pastikan 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.