AizuDemy

Mitigasi Bot dan Scraper Nakal Pakai TLS Fingerprinting JA4 di Caddy Server

Mitigasi Bot dan Scraper Nakal Pakai TLS Fingerprinting JA4 di Caddy Server
IKLAN
IDCloudHost
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 5 mnt baca baca
โšก TL;DR

Poin Kunci Artikel Ini:

  • Masalah: Server Down gara-gara Bot, IP Rate Limit GagalBayangkan skenario ini: jam dua malam, alert PagerDuty bunyi.
  • Server database down karena connection pool habis.
  • Masalahnya, langkah ini langsung gagal saat penyerang memakai residential proxy berotasi, jaringan Tor, atau ribuan IP Cloudflare WARP.
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

Masalah: Server Down gara-gara Bot, IP Rate Limit Gagal

Bayangkan skenario ini: jam dua malam, alert PagerDuty bunyi. Server database down karena connection pool habis. CPU VPS melonjak 100%. Setelah cek log web server, ada jutaan request HTTP GET mendadak ke endpoint API internal.

Refleks pertama sysadmin biasanya memasang rate_limit berbasis IP atau mengaktifkan Fail2ban. Masalahnya, langkah ini langsung gagal saat penyerang memakai residential proxy berotasi, jaringan Tor, atau ribuan IP Cloudflare WARP. Setiap request datang dari IP unik. Rate limiter IP jadi tidak berguna.

Memeriksa header User-Agent juga percuma. Scraper modern berbasis Playwright, Puppeteer, atau pustaka Python seperti curl_cffi bisa memalsukan string User-Agent menjadi Chrome terbaru di Windows 11 hanya dengan satu baris kode.

Solusinya: geser inspeksi dari layer aplikasi (L7) ke parameter kriptografi layer transport (L4/L6) dengan TLS Fingerprinting.

Analogi: KTP vs Sidik Jari

Pemeriksaan IP rate limit itu ibarat satpam memeriksa Kartu Tanda Penduduk (KTP) di pintu masuk. Jika penyerang mengganti KTP palsu tiap detik, satpam terkecoh. TLS Fingerprinting ibarat memeriksa tinggi badan, nada suara, dan sidik jari tamu. Biarpun KTP (IP dan User-Agent) berganti, bentuk fisik (karakteristik TLS Handshake) tidak bisa bohong.

Cara Kerja JA4 Fingerprinting

Saat client membuat koneksi HTTPS, langkah awal adalah mengirim paket Client Hello. Paket ini berisi preferensi versi TLS, daftar cipher suite yang didukung, tipe kurva elliptik, hingga format kompresi HTTP (ALPN). Kombinasi parameter ini unik untuk setiap pustaka HTTP, browser, atau runtime.

JA4 dibuat oleh FoxIO sebagai standar penerus JA3. Format JA4 membagi sidik jari TLS menjadi tiga segmen yang dipisahkan garis bawah (_):

  • Segmen 1 (Network & Protocol): Menyimpan info protokol (t=TLS, q=QUIC), versi TLS (13=1.3), indikator SNI (d=domain, i=IP), jumlah cipher suite, jumlah ekstensi, dan ALPN (h2=HTTP/2, h1=HTTP/1.1). Contoh: t13d1516h2.
  • Segmen 2 (Cipher Hash): Hash SHA-256 (diambil 12 karakter pertama) dari daftar Cipher Suite yang diurutkan.
  • Segmen 3 (Extension Hash): Hash SHA-256 (diambil 12 karakter pertama) dari daftar TLS Extensions dan Signature Algorithms.

Hasil akhirnya berupa string ringkas: t13d1516h2_8daaf6152771_000000000000. Python requests, Golang net/http, Curl, dan Chrome asli akan menghasilkan string JA4 berbeda meski dikirim dari IP sama.

Build & Setup Caddy Module JA4 di VPS

Caddy Server bawaan belum menyertakan modul pembacaan JA4. Kita perlu mengompilasi binary Caddy kustom menggunakan xcaddy.

1. Persiapan Environment di Linux VPS

Jalankan perintah berikut di Ubuntu/Debian untuk menginstal Golang dan utilitas kompilasi:

sudo apt update && sudo apt install -y golang-go git build-essential
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
export PATH=$PATH:$HOME/go/bin

2. Kompilasi Binary Caddy Kustom

Gunakan xcaddy untuk membangun binary Caddy dengan plugin TLS fingerprinting:

xcaddy build \
    --with github.com/caddyserver/caddy/v2 \
    --with github.com/mholt/caddy-l4 \
    --with github.com/altinity/caddy-ja4

Verifikasi modul dalam binary baru:

./caddy list-modules | grep ja4

Ganti binary Caddy sistem di VPS dengan hasil kompilasi:

sudo systemctl stop caddy
sudo cp ./caddy /usr/bin/caddy
sudo systemctl start caddy

Konfigurasi Filter Rule & Mitigasi Bot

Jangan langsung main blokir. Lakukan audit profil traffic terlebih dahulu.

Tahap 1: Logging (Audit Profile TLS)

Tambahkan blok penangkapan nilai JA4 ke /etc/caddy/Caddyfile:

example.com {
    log {
        output file /var/log/caddy/access.log
        format json
    }

    tls {
        caddy_ja4
    }

    handle {
        respond "OK - Client JA4: {tls.ja4}" 200
    }
}

Reload Caddy:

sudo systemctl reload caddy

Pantau log real-time menggunakan jq:

tail -f /var/log/caddy/access.log | jq '{ip: .request.remote_ip, ja4: .vars.tls_ja4, ua: .request.headers["User-Agent"][0]}'

Hasil Profiling Profil TLS Umum

  • Google Chrome Desktop (Windows/Mac): t13d1516h2_8daaf6152771_000000000000
  • Python Requests / Scrapy: t12d0804h1_13023d86012b_000000000000
  • Headless Chrome (Puppeteer Unpatched): t13d1010h2_6b4a3a30c5e1_000000000000
  • Go HTTP Client: t13d0605h2_2c4f1a9b8310_000000000000

Tahap 2: Pemblokiran (Enforcement Rules)

Gunakan matcher di Caddyfile untuk memblokir JA4 milik script scraper atau library otomatis yang teridentifikasi:

example.com {
    tls {
        caddy_ja4
    }

    @bad_bots {
        vars_exact {tls.ja4} "t12d0804h1_13023d86012b_000000000000" "t13d0605h2_2c4f1a9b8310_000000000000"
    }

    handle @bad_bots {
        respond "Access Denied" 403
    }

    handle {
        reverse_proxy localhost:8080
    }
}

Pengujian & Validasi Block Rule

Uji aturan pemblokiran menggunakan dua client berbeda.

Tes 1: Request lewat Curl (seharusnya diblokir jika fingerprint terdaftar):

curl -i https://example.com

Response menunjukkan status 403 Forbidden:

HTTP/2 403
content-type: text/plain; charset=utf-8

Access Denied

Tes 2: Buka https://example.com via browser Chrome biasa. Request diproses normal (HTTP 200 OK) karena fingerprint Chrome valid tidak masuk daftar blokir.

Strategi Lanjutan: Kombinasi Path & Whitelist

Hindari memblokir JA4 secara global jika fingerprint tersebut digunakan oleh layanan valid. Kombinasikan matcher JA4 dengan path spesifik (misal endpoint API sensitif):

example.com {
    tls {
        caddy_ja4
    }

    @api_scraper {
        path /api/v1/checkout/*
        vars_exact {tls.ja4} "t13d1010h2_6b4a3a30c5e1_000000000000"
    }

    handle @api_scraper {
        respond "Forbidden API Client" 403
    }
}

Kesimpulan

Memosisikan proteksi pada layer TLS via JA4 fingerprinting memberikan lapisan pertahanan solid melawan bot yang sering rotasi IP dan memalsukan User-Agent. Kompilasi Caddy dengan modul caddy-ja4, jalankan mode audit log, petakan fingerprint mencurigakan, dan pasang pemblokiran presisi pada Caddyfile.

A
Aizu Dev

Tim penulis AizuDemy yang menyajikan tutorial teknologi, cloud, dan pengembangan perangkat lunak dalam Bahasa Indonesia.

๐Ÿ“– Artikel Terkait