Proteksi Cloud Run dengan CloudFlare

Published on
4 menit waktu membaca
––– dilihat
thumbnail-image

Pendahuluan

Saya membuat sebuah REST API sederhana yang di-deploy di Cloud Run. Aplikasinya simple, hanya mengecek fakta harian dari Wikipedia. Nah, berhubung saya memiliki semangat open-source yang tinggi (wkakakak), saya memutuskan untuk menambah satu fitur yang menurut saya gak terlalu krusial sebelum saya terbitkan source codenya. Fitur tersebut adalah Cek Gempa Terkini.

Mengapa saya memilih Cloud Run?

  1. Gratis hingga 2 juta request per bulan.
  2. Mudah di-deploy.
  3. Murah, saya hanya bayar kurang dari Rp150,- per bulan.

Namun, ada satu masalah yang saya temui.

Masalah

Tahun 2023, saya mendapatkan serangan DDoS yang cukup besar. Sebenarnya bukan DDoS, tetapi ada user yang mengakses API dengan hitungan request per detik. Celakanya, saya baru menyadari hal tersebut ketika akhir bulan dan tagihan Cloud Run saya melonjak. Plot twist dari serangan tersebut adalah, serangan tersebut mengakses API Gempa Terkini yang memang gak terlalu krusial.

Sebenarnya saya ingin membagikan buktinya tapi tampaknya Cloud Run menghapus log lebih dari 90 hari. Bukti yang ada hanya sisa dari CloudFlare.

Solusi

Secara default, Cloud Run tidak memiliki fitur proteksi DDoS. Andaikata ada, itu menggunakan Cloud Armor yang bagi saya sendiri terlalu mahal (saya tim kere hore og, tagihan perbulan aja cuma Rp.150,-). Nah, karena saya menggunakan CloudFlare dan CloudFlare sendiri memiliki fitur firewall, saya ingin menerapkannya. Oke kita terapkan:

Meng-CloudFlare-kan Domain

  1. Lakukan pointing domain/subdomain ke ghs.googlehosted.com dan matikan proxy CloudFlare (gambar awan).

  2. Di CloudFlare, pilih Rules > Configuration Rules, lalu tekan + Create Rule

  3. Masukkan konfigurasi seperti di bawah ini

    • Rule Name : Terserah Anda

    • Enable Custom filter expression

    • Setting When incoming requests match... ke:

      • Field : Hostname

      • Operator : equals

      • Value : domain anda

      Cara bacanya adalah sebagai berikut: Jika ada request masuk dan hostname dari requestnya sama dengan domain Anda, maka pengaturannya adalah ...

    • Atur Then the settings are… ke:

    • Automatic HTTP Rewrites : Off

    • Security Level : High

    • SSL / TLS : Full

    Anda bisa menyesuaikan pengaturan sesuai kebutuhan.

  4. Klik Deploy.

Mengaktifkan Web Application Firewall (WAF)

Masih ingat dengan REST API saya yang diakses dengan hitungan request per detik?. Di log Cloud Run, saya melihat bahwa request tersebut berasal dari IP milik Amazon. Nah, awalnya saya berpikiran bahwa saya dapat memblokir IPnya saja. Akan tetapi, setelah dicek lebih lanjut, ternyata IP request tersebut berubah-ubah. Sebagai seorang DevOps, saya tahu bahwa IP tersebut akan terus berubah karena sifatnya yang elastic. Daripada saya mumet mikirin IPnya + CIDRnya, yaudah saya blokir ASN Amazon saja (aowkaowk).

Oke sekarang kita akan mengaktifkan Web Application Firewall (WAF) di CloudFlare.

  1. Di CloudFlare, pilih Security > WAF, pilih Custom Rules lalu tekan + Create Rule
  1. Sebagai contoh, saya akan memblokir request yang berasal dari ASN AS14618 (contoh semata, jangan diikuti).

    • Rule Name : AS14618 AMAZON-AES (saya malas kasi nama formal toh buat pribadi)

    • Setting If incoming requests match… ke:

      • Field : AS Num

      • Operator : equals

      • Value : 14618

      Cara bacanya adalah sebagai berikut: Jika ada request masuk dan ASN dari request sama dengan 14618, maka pengaturannya adalah ...

    • Atur Then take action… ke:

      • Action : Block

    Anda bisa menyesuaikan pengaturan sesuai kebutuhan.

Hasil

Sekarang, Cloud Run saya sudah terproteksi dengan CloudFlare. Saya coba akses API saya dengan menggunakan domain yang sudah di-proteksi, dan hasilnya adalah API tetap dapat diakses dengan baik.

Ini screenshot 30 hari yang lalu, sehingga saya tidak bisa menunjukkan bukti bahwa API saya sudah terproteksi dengan baik karena Cloud Run menghapus log lebih dari 30 hari. Menyedihkan memang.

CloudFlare sendiri sebenarnya sudah memiliki banyak fitur seperti Rate Limiting yang bisa digunakan untuk membatasi request per detik dengan gratis (daripada saya harus bayar Cloud Armor). Tapi memang banyak batasan karena CloudFlare sendiri adalah layanan gratis. Namun, untuk kebutuhan saya yang sederhana, CloudFlare sudah cukup membantu.