Lewati ke konten

Streaming Access Log Scanner

Sebagian besar serangan siber (seperti scanning direktori WordPress, probing phpmyadmin, pemindaian berkas .git, dan brute force HTTP dasar) ditolak langsung oleh web server (Nginx/Apache) dengan status HTTP 404 atau 403 sebelum request sempat diteruskan ke proses PHP Laravel.

Akibatnya, request tersebut tidak pernah melewati middleware Laravel dan tidak tercatat di tabel pasak_logs.

Layanan AccessLogScannerService memecahkan masalah ini dengan membaca dan menganalisis berkas log akses mentah (raw access logs) web server secara streaming.


1. Arsitektur Hemat Memori (PHP Generator Stream)

Bagian berjudul “1. Arsitektur Hemat Memori (PHP Generator Stream)”

Berkas log akses produksi pada aplikasi sibuk sering kali berukuran ratusan megabyte hingga beberapa gigabyte dengan jutaan baris entri. Jika dibaca sekaligus menggunakan file_get_contents() atau file(), proses PHP akan langsung mengalami Memory Exhaustion Fatal Error.

AccessLogScannerService dirancang menggunakan PHP Generators (yield):

  • Baris berkas log dibaca satu per satu dari disk menggunakan pointer fgets().
  • Hanya satu baris yang berada di RAM pada satu waktu.
  • Pemindai dapat memproses berkas log berisi 500.000+ baris dengan konsumsi memori stabil di bawah 15 MB RAM!

Pemindai mendukung format log web server standar industri:

  • Nginx Standard Combined Log Format: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"
  • Apache Combined Log Format
  • Mendukung berkas log terkompresi .gz jika dikonfigurasikan.

3. Eksekusi via Artisan CLI (pasak:scan-logs)

Bagian berjudul “3. Eksekusi via Artisan CLI (pasak:scan-logs)”

Anda dapat menjalankan pemindai sewaktu-waktu menggunakan perintah:

A. Pratinjau Temuan Tanpa Mengubah Database (Dry-Run)

Bagian berjudul “A. Pratinjau Temuan Tanpa Mengubah Database (Dry-Run)”
Terminal window
php artisan pasak:scan-logs --file=/var/log/nginx/access.log --dry-run

B. Memindai dan Mengimpor ke Tabel pasak_logs

Bagian berjudul “B. Memindai dan Mengimpor ke Tabel pasak_logs”
Terminal window
php artisan pasak:scan-logs --file=/var/log/nginx/access.log --import

C. Memindai, Mengimpor, dan Otomatis Memblokir IP Penyerang Zero-Tolerance

Bagian berjudul “C. Memindai, Mengimpor, dan Otomatis Memblokir IP Penyerang Zero-Tolerance”
Terminal window
php artisan pasak:scan-logs --file=/var/log/nginx/access.log --import --block

Setiap IP yang ditemukan mencoba melakukan serangan zero-tolerance (misal mengunggah webshell, probe .env, atau path traversal) akan langsung dimasukkan ke tabel blocked_ips dan ditolak oleh aplikasi.

D. Memfilter Aktivitas Berdasarkan Rentang Waktu atau IP Tertentu

Bagian berjudul “D. Memfilter Aktivitas Berdasarkan Rentang Waktu atau IP Tertentu”
Terminal window
# Hanya memindai aktivitas dalam 2 hari terakhir
php artisan pasak:scan-logs --since="2 days ago"
# Memeriksa rekam jejak satu IP spesifik
php artisan pasak:scan-logs --ip=104.207.74.38 --samples

4. Otomasi Terjadwal Harian (Daily Scheduler)

Bagian berjudul “4. Otomasi Terjadwal Harian (Daily Scheduler)”

Anda dapat mengaktifkan pemindaian otomatis harian di latar belakang dengan menambahkan variabel berikut ke berkas .env:

SECURITY_ACCESS_LOG_AUTO_SCAN=true
SECURITY_ACCESS_LOG_AUTO_SCAN_HOURS=24
SECURITY_ACCESS_LOG_PATHS=/var/log/nginx/access.log,/var/log/nginx/error.log

Ketika opsi ini aktif, PasakServiceProvider akan secara otomatis menjadwalkan perintah:

Terminal window
php artisan pasak:scan-logs --import --min-level=high --since="24 hours ago"

dieksekusi setiap hari pada pukul 03:00 pagi.