L
JavaScript • Literally Web ID

Arsitektur Zero Trust Security dengan Cloudflare Access dan Argo Tunnel

⏱️ 22 menit baca • 📅 12 Oct 2026 • 👁️ 1 views
Arsitektur Zero Trust Security dengan Cloudflare Access dan Argo Tunnel

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap infrastruktur web modern, perimeter keamanan tradisional yang mengandalkan VPN korporat, pembatasan alamat IP sumber (IP Whitelisting), dan port terbuka pada firewall perimeter (seperti port 80 dan 443 yang langsung menghadap internet) telah usang dan terbukti rapuh. Pendekatan lama ini menciptakan apa yang disebut sebagai attack surface yang masif. Begitu seorang penyerang berhasil menembus perimeter luar atau mendapatkan kredensial VPN yang sah, mereka mendapatkan akses lateral (lateral movement) ke seluruh jaringan internal, membahayakan database sensitif, sistem manajemen backend, dan layanan mikro pendukung.

Bottleneck keamanan utama di dunia nyata sering kali berakar pada kompleksitas pengelolaan aturan firewall, pembukaan port pada router tepi (edge router) atau load balancer, serta manajemen sertifikat SSL/TLS yang terfragmentasi di berbagai server backend. Ketika sebuah perusahaan menjalankan aplikasi di lingkungan hybrid (sebagian on-premise, sebagian di AWS/GCP, dan sebagian di server bare-metal), membuka port untuk setiap layanan internal memerlukan konfigurasi NAT port forwarding yang rumit dan rentan terhadap kesalahan manusia (human error).

Perbandingan kondisi Sebelum vs Sesudah penerapan Zero Trust dengan Cloudflare Access dan Argo Tunnel:

  • Sebelum (Tradisional / VPN / Direct Public IP):

    • Server backend memiliki IP publik atau berada di balik NAT dengan port terbuka (misal 443). Rentan terhadap pemindaian port (port scanning), serangan DDoS langsung ke asal (origin DDoS), dan eksploitasi kerentanan zero-day pada layanan web server (Nginx/Apache).
    • Akses admin memerlukan VPN yang lambat, membebani bandwidth gateway, dan tidak menyediakan visibilitas granular per aplikasi atau per pengguna.
    • Manajemen identitas terpisah-pisah antara direktori lokal server dan aplikasi.
  • Sesudah (Zero Trust - Cloudflare Tunnel & Access):

    • Tidak ada port inbound yang terbuka pada infrastruktur asal (origin). Server backend sepenuhnya terisolasi dari internet publik.
    • Semua traffic masuk harus melewati jaringan global Cloudflare (Edge), diinspeksi oleh WAF, divalidasi melalui penyedia identitas OIDC (Google, Okta, Azure AD), dan baru diteruskan melalui outbound persistent connection yang dienkripsi menggunakan cloudflared daemon (Argo Tunnel).
    • Kebijakan akses diterapkan secara real-time berdasarkan identitas pengguna, perangkat, lokasi geografis, dan postur keamanan (device posture).

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur Zero Trust berbasis Cloudflare mengubah paradigma konektivitas jaringan dari "percaya tetapi verifikasi" menjadi "tidak pernah percaya, selalu verifikasi". Inti dari arsitektur ini melibatkan dua komponen utama: Cloudflare Tunnel (argo tunnel) dan Cloudflare Access.

Alur Data & Eksekusi (Under the Hood)

  1. Inisiasi Koneksi Outbound: Daemon cloudflared yang berjalan di server internal atau bastion host membuka beberapa koneksi TCP keluar yang dienkripsi TLS (menggunakan protokol HTTP/2 atau QUIC) ke pusat data Cloudflare terdekat (Edge). Tidak ada port inbound yang dibuka di firewall lokal.
  2. Permintaan Klien (User Request): Seorang pengguna mencoba mengakses aplikasi internal (misalnya admin.perusahaan.com). Permintaan DNS diarahkan ke jaringan Cloudflare.
  3. Evaluasi Cloudflare Access (OIDC / Identity Check): Sebelum permintaan mencapai terowongan, Cloudflare Access mencegat lalu lintas tersebut. Jika pengguna belum diautentikasi, mereka akan dialihkan ke penyedia identitas (IdP) eksternal seperti Okta, Google Workspace, atau Azure AD.
  4. Penegakan Kebijakan (Policy Enforcement): Setelah autentikasi berhasil, Cloudflare memeriksa apakah klaim JWT (JSON Web Token) dari pengguna memenuhi aturan granular yang ditetapkan (misalnya: anggota grup engineering DAN menggunakan perangkat yang terdaftar di MDM).
  5. Penerusan Melalui Tunnel: Setelah lolos verifikasi, Cloudflare merutekan permintaan melalui koneksi cloudflared yang sudah ada sebelumnya ke aplikasi backend (misalnya Nginx pada http://127.0.0.1:8080).
+-------------------------------------------------------------------------+
|                           KLIEN / PENGGUNA                              |
|          (Browser / API Client dengan Sertifikat/OIDC Token)            |
+-------------------------------------------------------------------------+
                                     |
                                     v
+-------------------------------------------------------------------------+
|                    CLOUDFLARE EDGE NETWORK                              |
|  - Anycast DNS                                                          |
|  - WAF & DDoS Mitigation                                                |
|  - Cloudflare Access (OIDC Auth & Granular Policy Validation)           |
+-------------------------------------------------------------------------+
                                     |
                  (Encrypted Outbound Tunnel / HTTP/2 or QUIC)
                                     v
+-------------------------------------------------------------------------+
|                        INFRASTRUKTUR LOKAL / ORIGIN                     |
|  +-------------------------------------------------------------------+  ||
|  |                     daemon: cloudflared                           |  ||
|  +-------------------------------------------------------------------+  ||
|                                    v                                    |
|  +-------------------------------------------------------------------+  ||
|  |            Web Server (Nginx / Caddy / Apache)                    |  ||
|  +-------------------------------------------------------------------+  ||
+-------------------------------------------------------------------------+

3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memahami mengapa pendekatan Cloudflare Tunnel + Access unggul dibandingkan metode konvensional, berikut adalah analisis komparatif mendalam berdasarkan beberapa parameter krusial:

Parameter / Metrik Tradisional VPN (OpenVPN/WireGuard) Reverse Proxy Tradisional + IP Whitelist Cloudflare Access & Argo Tunnel Verdict / Pemenang
Attack Surface Sedang (Port VPN terbuka) Tinggi (Port 80/443 terbuka ke publik) Nol (Tidak ada port terbuka) Cloudflare
Latensi Jaringan Tergantung lokasi VPN Gateway Tergantung server proxy Rendah (Edge global Anycast) Cloudflare
Kompleksitas Setup Tinggi (Manajemen kunci, routing) Sedang (SSL certs, Nginx conf) Rendah (CLI & Dashboard intuitif) Cloudflare
Konsumsi Sumber Daya (CPU/RAM) Sedang di VPN Server Rendah-Sedang di Origin Sangat Rendah di Origin (cloudflared < 50MB RAM) Cloudflare
Kontrol Akses Granular Berdasarkan subnet/IP Berdasarkan IP sumber Per-Aplikasi, Per-Pengguna, Multi-faktor (MFA) Cloudflare

[!IMPORTANT] Penggunaan VPN tradisional memberikan akses tingkat jaringan (network layer), yang berarti jika akun seseorang disusupi, penyerang dapat mengakses seluruh subnet. Sebaliknya, Cloudflare Access bekerja pada tingkat aplikasi (application layer), membatasi akses hanya pada URL atau layanan spesifik yang diizinkan.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum memulai implementasi, pastikan lingkungan Anda memenuhi spesifikasi teknis berikut:

  1. Domain yang Dikelola oleh Cloudflare: Domain utama Anda (misal: perusahaan.com) harus menggunakan nameserver Cloudflare.
  2. Server Origin (Backend):
    • OS: Ubuntu Server 22.04 LTS / Debian 12 / Rocky Linux 9.
    • Akses SSH dengan hak akses sudo.
    • Web server lokal yang berjalan (misal: Nginx mendengarkan pada 127.0.0.1:8080).
  3. Akun Cloudflare:
    • Paket Cloudflare Zero Trust (tersedia tier gratis untuk tim kecil).
  4. Dependency Tools:
    • curl, systemd, jq terinstal di server origin.

Verifikasi awal konektivitas dan manajemen DNS:

# Periksa versi sistem operasi
cat /etc/os-release

# Periksa apakah port lokal backend merespons
curl -I http://127.0.0.1:8080

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Instalasi cloudflared Daemon di Server Origin

Unduh dan pasang binari resmi cloudflared untuk arsitektur Linux x86_64:

# Unduh paket deb terbaru
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb

# Instal paket menggunakan dpkg
sudo dpkg -i cloudflared.deb

# Verifikasi instalasi
cloudflared --version

Langkah 2: Autentikasi dan Pembuatan Tunnel

Lakukan autentikasi mesin lokal dengan akun Cloudflare Anda:

sudo cloudflared tunnel login

Perintah ini akan mencetak URL di terminal. Buka URL tersebut di browser web Anda, masuk ke akun Cloudflare, dan pilih domain yang akan digunakan untuk mengotorisasi pembuatan terowongan.

Setelah berhasil, buat terowongan baru dengan nama yang deskriptif:

sudo cloudflared tunnel create prod-internal-app

Catat UUID terowongan yang dihasilkan (contoh: a1b2c3d4-e5f6-7890-abcd-ef0123456789).

Langkah 3: Konfigurasi File config.yml untuk cloudflared

Buat direktori konfigurasi sistem dan file konfigurasi YAML untuk daemon terowongan.

sudo mkdir -p /etc/cloudflared
sudo nano /etc/cloudflared/config.yml

Isi file /etc/cloudflared/config.yml dengan konfigurasi lengkap berikut:

# Konfigurasi Cloudflare Tunnel Daemon
tunnel: a1b2c3d4-e5f6-7890-abcd-ef0123456789
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef0123456789.json

# Pengaturan log
logfile: /var/log/cloudflared.log
loglevel: info

# Aturan routing masuk (Ingress Rules)
ingress:
  - hostname: internal-app.perusahaan.com
    service: http://127.0.0.1:8080
  - hostname: api-internal.perusahaan.com
    service: http://127.0.0.1:9000
  - service: http_status:404

Langkah 4: Daftarkan DNS dan Jalankan sebagai Layanan Systemd

Hubungkan hostname dengan UUID terowongan di Cloudflare DNS:

sudo cloudflared tunnel route dns prod-internal-app internal-app.perusahaan.com
sudo cloudflared tunnel route dns prod-internal-app api-internal.perusahaan.com

Instal dan jalankan cloudflared sebagai layanan sistem (systemd service) agar berjalan secara otomatis saat server dinyalakan ulang:

sudo cloudflared service install
sudo systemctl daemon-reload
sudo systemctl enable --now cloudflared
sudo systemctl status cloudflared

Langkah 5: Integrasi OIDC Identity Provider & Cloudflare Access Policies

  1. Buka dashboard Cloudflare Zero Trust (one.dash.cloudflare.com).
  2. Navigasi ke Settings > Authentication > Login Methods.
  3. Tambahkan Identity Provider (IdP) pilihan Anda (misalnya Google Workspace, Azure AD, atau Okta via OIDC/SAML).
  4. Navigasi ke Access > Applications > Add an Application.
  5. Pilih Self-Hosted, lalu isi:
    • Application Name: Internal Dashboard
    • Subdomain: internal-app.perusahaan.com
    • Domain: perusahaan.com
  6. Pada bagian Policies, buat aturan akses granular:
    • Policy Name: Engineering Team Only
    • Action: Allow
    • Include: Pilih Rule Type Emails atau Login Methods (misal: domain email @perusahaan.com DAN anggota grup OIDC engineering@perusahaan.com).

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah parameter krusial dalam file konfigurasi /etc/cloudflared/config.yml:

  • tunnel: a1b2c3d4-...
    • Fungsi: Mengidentifikasi secara unik instans terowongan yang terdaftar di jaringan Cloudflare. Nilai ini harus sama persis dengan UUID yang dihasilkan saat perintah cloudflared tunnel create dijalankan.
  • credentials-file: /root/.cloudflared/...
    • Fungsi: Menyimpan token kriptografis privat yang memberikan hak kepada daemon lokal untuk membuka koneksi atas nama terowongan tersebut. File ini harus memiliki izin akses ketat (chmod 600).
  • ingress:
    • Fungsi: Menentukan bagaimana Cloudflare Edge merutekan lalu lintas yang masuk berdasarkan hostname. Aturan dibaca dari atas ke bawah secara berurutan.
    • hostname: internal-app.perusahaan.com -> Menangkap traffic untuk domain spesifik.
    • service: http://127.0.0.1:8080 -> Meneruskan traffic ke aplikasi lokal yang berjalan di port 8080 pada server origin yang sama.
    • - service: http_status:404 -> Aturan Tangkapan Semuanya (Catch-all Rule) yang wajib ada di baris terakhir. Jika ada hostname lain yang mencoba masuk melalui terowongan ini tanpa aturan yang cocok, Cloudflare akan mengembalikan status HTTP 404 secara aman.

[!WARNING] Jangan pernah meninggalkan aturan catch-all kosong atau salah arahkan. Tanpa - service: http_status:404 di akhir blok ingress, daemon cloudflared akan menolak lalu lintas atau meneruskannya ke layanan default yang tidak diinginkan, menciptakan celah keamanan potensial.


7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam lingkungan produksi bersekala besar (high concurrency), satu instans cloudflared mungkin menghadapi batas kapasitas throughput atau menjadi titik kegagalan tunggal (Single Point of Failure / SPOF).

Desain High Availability (HA) Cloudflare Tunnel

Untuk menangani jutaan permintaan per hari dengan ketersediaan 99.99%:

  1. Multi-Replica Deployment: Sebarkan daemon cloudflared di setidaknya dua atau lebih server backend terpisah (misalnya backend-node-01 dan backend-node-02).
  2. Koneksi ke Terowongan yang Sama: Jalankan perintah cloudflared tunnel route menggunakan UUID terowongan yang sama pada kedua server. Cloudflare secara otomatis akan menyeimbangkan beban (load balancing) lalu lintas di antara instans-instans daemon yang terhubung melalui Anycast routing dan mekanisme internal Tunnel Multiplexing.
  3. Load Balancer Lokal (Nginx / HAProxy): Di setiap server backend, arahkan service: http://127.0.0.1:8080 ke upstream Nginx lokal yang mendistribusikan beban ke beberapa proses aplikasi (misalnya PHP-FPM atau Node.js cluster workers).
# Contoh Ingress untuk Multi-Replica Backend
ingress:
  - hostname: internal-app.perusahaan.com
    service: http://127.0.0.1:8080
    originRequest:
      connectTimeout: 30s
      noTLSVerify: true
      keepAliveConnections: 100
      keepAliveTimeout: 90s

8. Common Pitfalls, Anti-Patterns & Solusi

Berikut adalah kesalahan umum yang sering dilakukan oleh System Administrator dan pengembang saat mengonfigurasi Cloudflare Access & Argo Tunnel:

  1. Anti-Pattern: Menggunakan Satu Terowongan untuk Seluruh Layanan Tanpa Batasan

    • Masalah: Mengarahkan semua subdomain internal ke satu terowongan tunggal tanpa pemisahan hak akses aplikasi.
    • Solusi: Buat terowongan terpisah untuk lingkungan yang berbeda (misalnya tunnel-production, tunnel-staging) guna menerapkan prinsip least privilege dan isolasi kegagalan.
  2. Pitfall: Mengabaikan Pengaturan connectTimeout dan keepAliveTimeout

    • Masalah: Koneksi WebSocket atau Long-polling sering terputus secara tiba-tiba setelah beberapa menit.
    • Solusi: Tambahkan parameter keepAliveConnections dan sesuaikan keepAliveTimeout di dalam blok originRequest pada config.yml.
  3. Kesalahan Izin File Kredensial (/root/.cloudflared/)

    • Masalah: Daemon gagal berjalan setelah reboot dengan error failed to read credentials file. Penyebabnya adalah file JSON kredensial dapat dibaca oleh pengguna selain root.
    • Solusi: Perketat izin file:
      sudo chmod 600 /root/.cloudflared/*.json
      

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan bahwa lapisan Zero Trust tidak memperkenalkan latensi yang tidak dapat diterima, pengujian performa wajib dilakukan menggunakan tool benchmark modern seperti k6 atau wrk.

Skrip Pengujian Benchmark (k6)

Buat file load-test.js:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 50 },  // Ramp-up ke 50 virtual users
    { duration: '1m', target: 100 },  // Tahan di 100 virtual users
    { duration: '30s', target: 0 },   // Ramp-down
  ],
};

export default function () {
  const res = http.get('https://internal-app.perusahaan.com/healthcheck', {
    headers: { 'Cookie': 'CF_Authorization=JWT_TOKEN_SAMPLE' },
  });
  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 200ms': (r) => r.timings.duration < 200,
  });
  sleep(1);
}

Jalankan pengujian:

k6 run load-test.js

Tuning Kernel Linux untuk Throughput Tinggi

Sesuaikan parameter sysctl pada server origin untuk menangani koneksi konkuren dalam jumlah besar:

sudo nano /etc/sysctl.d/99-cloudflare-tunnel.conf

Tambahkan konfigurasi berikut:

# Tingkatkan batas file descriptor
fs.file-max = 2097152

# Optimasi TCP socket buffer
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535

# Reuse TIME_WAIT sockets
net.ipv4.tcp_tw_reuse = 1

Terapkan perubahan:

sudo sysctl --system

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur Zero Trust ini ke lingkungan produksi penuh, pastikan Anda telah melewati checklist verifikasi berikut:

  • Firewall Origin Tertutup: Pastikan port 80 dan 443 ditutup untuk semua IP publik kecuali rentang IP Cloudflare (Cloudflare IP Ranges), atau lebih baik lagi, tutup semua port inbound eksternal secara total.
  • Izin Kredensial Valid: File JSON kredensial terowongan memiliki izin akses ketat (600 milik root).
  • High Availability: Minimal 2 instans cloudflared berjalan di server backend terpisah yang terhubung ke terowongan yang sama.
  • Kebijakan Akses Granular: Aturan Cloudflare Access dikonfigurasi dengan validasi identitas OIDC dan batasan grup/perangkat.
  • Audit Log Aktif: Integrasi log Cloudflare Access dikirimkan ke SIEM atau sistem manajemen log eksternal (misalnya Datadog, Splunk, atau ELK Stack) untuk pemantauan keamanan real-time.
  • Aturan Catch-All Terpasang: File config.yml diakhiri dengan - service: http_status:404.

Dengan menerapkan arsitektur Zero Trust menggunakan Cloudflare Access dan Argo Tunnel secara disiplin, organisasi Anda tidak hanya menghilangkan risiko serangan berbasis perimeter tradisional, tetapi juga membangun fondasi infrastruktur web yang sangat aman, tangguh, dan mudah dikelola di era komputasi modern.

🏷️ Tags: #Web Architecture #Cloudflare #Zero Trust #Infrastructure Security #Networking