Skip to content

[SECURITY] Implementasi & Perkuat Rate Limiting pada Semua Endpoint Kritis#972

Open
pandigresik wants to merge 2 commits intorilis-devfrom
dev-957
Open

[SECURITY] Implementasi & Perkuat Rate Limiting pada Semua Endpoint Kritis#972
pandigresik wants to merge 2 commits intorilis-devfrom
dev-957

Conversation

@pandigresik
Copy link
Contributor

Perbaikan issue #957

Peningkatan Keamanan: Pembatasan Kecepatan & Penguncian Akun

Ringkasan

Dokumen ini menjelaskan peningkatan keamanan yang telah diterapkan untuk mengatasi kerentanan brute-force dan DDoS pada aplikasi OpenKab.

Masalah yang Diselesaikan

  1. RATE_LIMITER_ENABLED defaultnya false - Pembatasan kecepatan dinonaktifkan secara default
  2. Pembatasan kecepatan hanya berdasarkan IP - Mudah dihindari melalui VPN, rotasi IP, atau serangan terdistribusi
  3. Tidak ada penguncian akun - Tidak ada penguncian sementara setelah beberapa kali percobaan gagal
  4. Tidak ada penundaan bertahap - Tidak ada penundaan yang semakin lama antara percobaan

Solusi yang Diterapkan

1. Mengaktifkan Pembatasan Kecepatan Global Secara Default

  • Mengubah default RATE_LIMITER_ENABLED dari false menjadi true di .env.example
  • Menambahkan peringatan keamanan dalam komentar konfigurasi

2. Peningkatan Pembatasan Kecepatan dengan Sidik Jari Multi-Faktor

Pembatasan kecepatan sekarang menggabungkan:

  • Alamat IP - Lokasi jaringan
  • Sidik Jari User-Agent - Pengenal browser/klien (di-hash dengan xxHash64)
  • ID Pengguna (jika sudah terautentikasi) - Pengenal akun

Ini mencegah penghindaran melalui:

  • VPN/rotasi IP saja
  • Serangan terdistribusi dari klien yang sama
  • Upaya pembajakan sesi

3. Mekanisme Penguncian Akun

Setelah beberapa kali percobaan login gagal:

  • Akun dikunci sementara
  • Durasi penguncian: 15 menit (dapat diatur)
  • Maksimal percobaan sebelum dikunci: 5 kali (dapat diatur)
  • Pesan error yang jelas menunjukkan status penguncian dan waktu coba lagi

4. Penundaan Bertahap

Setelah setiap percobaan gagal, penundaan eksponensial diterapkan:

  • Rumus: base_delay × (multiplier ^ (attempts - 1))
  • Default: 2s, 4s, 8s, 16s, 32s... (maksimal 5 menit)
  • Memperlambat serangan otomatis

File yang Dimodifikasi

File Konfigurasi

  • .env.example - Menambahkan konfigurasi keamanan
  • config/app.php - Menambahkan konfigurasi penguncian dan penundaan bertahap
  • config/rate-limiter.php - Sudah memiliki default yang benar (true)

Database

  • database/migrations/2026_03_05_000001_add_account_lockout_to_users_table.php (BARU)
    • Menambahkan kolom failed_login_attempts
    • Menambahkan timestamp locked_at
    • Menambahkan timestamp lockout_expires_at

Model

  • app/Models/User.php
    • Menambahkan field fillable terkait penguncian
    • Menambahkan metode isLocked()
    • Menambahkan metode getLockoutRemainingSeconds()
    • Menambahkan metode recordFailedLogin()
    • Menambahkan metode resetFailedLogins()
    • Menambahkan metode lockAccount() dan unlockAccount()

Middleware

  • app/Http/Middleware/GlobalRateLimiter.php
    • Meningkatkan resolveRequestSignature() dengan IP + User-Agent + ID Pengguna
    • Menambahkan metode fingerprintUserAgent()
    • Menambahkan metode calculateProgressiveDelay()
    • Menambahkan metode recordFailedAttempt()
    • Menambahkan metode isLocked()
    • Menambahkan metode clearFailedAttempts()

Controller

  • app/Http/Controllers/Api/Auth/AuthController.php

    • Meningkatkan throttleKey() dengan IP + User-Agent + Kredensial
    • Menambahkan pemeriksaan penguncian akun
    • Menambahkan penundaan bertahap pada percobaan gagal
    • Mengatur ulang percobaan gagal saat login berhasil
  • app/Http/Controllers/Auth/OtpLoginController.php

    • Meningkatkan kunci pembatasan kecepatan dengan IP + User-Agent + ID Pengguna
    • Menambahkan pemeriksaan penguncian akun
    • Menambahkan penundaan bertahap pada verifikasi OTP gagal
    • Mengatur ulang percobaan gagal saat login berhasil
  • app/Http/Controllers/OtpController.php

    • Meningkatkan kunci pembatasan kecepatan dengan IP + User-Agent + ID Pengguna
    • Memperbarui semua operasi OTP (pengaturan, verifikasi, kirim ulang)
  • app/Http/Controllers/TwoFactorController.php

    • Meningkatkan kunci pembatasan kecepatan dengan IP + User-Agent + ID Pengguna
    • Memperbarui semua operasi 2FA (aktifkan, verifikasi, kirim ulang, tantangan)

Opsi Konfigurasi

Tambahkan ini ke file .env Anda:

# Global Rate Limiter
RATE_LIMITER_ENABLED=true
RATE_LIMITER_MAX_ATTEMPTS=60
RATE_LIMITER_DECAY_MINUTES=1

# Account Lockout
ACCOUNT_LOCKOUT_MAX_ATTEMPTS=5
ACCOUNT_LOCKOUT_DECAY_MINUTES=15

# Progressive Delay
PROGRESSIVE_DELAY_BASE_SECONDS=2
PROGRESSIVE_DELAY_MULTIPLIER=2

Langkah-Langkah Penerapan

  1. Backup database Anda

    mysqldump -u root -p your_database > backup.sql
  2. Jalankan migrasi

    php artisan migrate
  3. Perbarui file .env
    Salin nilai konfigurasi baru dari .env.example ke .env Anda

  4. Bersihkan cache

    php artisan config:clear
    php artisan cache:clear
  5. Uji implementasi

    • Coba beberapa kali login gagal untuk memverifikasi penguncian
    • Verifikasi penundaan bertahap diterapkan
    • Periksa header pembatasan kecepatan dalam respons

Perubahan Respons API

Respons Login Gagal (dengan penundaan bertahap)

{
  "message": "Kredensial tidak valid. Percobaan gagal ke-2. Delay: 4 detik.",
  "attempts_remaining": 3,
  "progressive_delay": 4
}

Respons Akun Terkunci

{
  "message": "AKUN TERKUNCI. Terlalu banyak gagal login (5 kali).",
  "locked": true,
  "lockout_expires_in": 900
}

Respons Batas Kecepatan Terlampaui

{
  "message": "TERLALU BANYAK PERCOBAAN. Silakan tunggu 10 menit sebelum mencoba lagi.",
  "retry_after": 600
}

Manfaat Keamanan

  1. Perlindungan brute-force - Penguncian akun mencegah tebakan kata sandi tanpa batas
  2. Tahan terhadap VPN/rotasi IP - Sidik jari multi-faktor mencegah penghindaran sederhana
  3. Pencegahan otomatis - Penundaan bertahap membuat serangan otomatis tidak praktis
  4. Perlindungan 2FA/OTP - Perlindungan yang sama berlaku untuk verifikasi OTP/2FA
  5. Pencegahan penyalahgunaan API - Pembatasan kecepatan global mencegah flooding

Rekomendasi Pemantauan

  1. Pantau kolom failed_login_attempts untuk pola yang mencurigakan
  2. Beri peringatan saat tingkat penguncian tinggi
  3. Catat kejadian pembatasan kecepatan terlampaui
  4. Pertimbangkan untuk menerapkan penilaian reputasi IP untuk perlindungan lanjutan

Pengujian

Jalankan tes yang ada untuk memastikan kompatibilitas:

php artisan test --filter=RateLimit
php artisan test --filter=Auth
php artisan test --filter=Otp
php artisan test --filter=TwoFactor

Referensi

  • Panduan Pembatasan Kecepatan OWASP
  • Dokumentasi Pembatasan Kecepatan Laravel
  • Panduan Autentikasi OWASP

@pandigresik pandigresik requested a review from vickyrolanda March 5, 2026 04:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant