Public vs Private Network #

Salah satu keputusan desain paling mendasar ketika meletakkan resource di cloud adalah: apakah resource ini perlu bisa diakses langsung dari internet, atau cukup dari dalam jaringan internal saja? Jawabannya menentukan apakah resource tersebut berada di public subnet atau private subnet — dan ini berdampak langsung pada posture keamanan sistem kamu. Prinsip umumnya sederhana: ekspos sesedikit mungkin ke internet, lindungi sebanyak mungkin di belakang private network.

Perbedaan Mendasar #

Public Network (Public Subnet):
  → Resource memiliki IP publik yang bisa dijangkau dari internet
  → Route table punya route ke Internet Gateway
  → Cocok untuk: load balancer, bastion host, NAT gateway
  → Bukan untuk: database, application server, internal services

Private Network (Private Subnet):
  → Resource hanya memiliki IP privat (tidak bisa dijangkau langsung dari internet)
  → Route table TIDAK punya route langsung ke Internet Gateway
  → Cocok untuk: database, application server, cache, internal services
  → Bisa inisiasi koneksi ke internet melalui NAT (outbound only)

Perbedaan kunci:
  Public  → internet BISA inisiasi koneksi ke resource
  Private → internet TIDAK BISA inisiasi koneksi ke resource
            resource BISA inisiasi koneksi ke internet (via NAT)

Jenis IP Address di Cloud #

Memahami jenis IP address yang ada di cloud membantu menjelaskan bagaimana aksesibilitas dikendalikan.

IP Privat (Private IP):
  → Selalu ada pada setiap resource di VPC
  → Diambil dari CIDR block VPC/subnet
  → Hanya bisa diakses dari dalam VPC (atau network yang terhubung)
  → Tidak bisa dijangkau dari internet

IP Publik (Public IP):
  → Opsional, di-assign ke resource di public subnet
  → Bisa berubah setiap kali instance di-stop dan di-start
  → Langsung accessible dari internet
  → Hilang jika instance dihentikan

Elastic IP / Static IP:
  → IP publik yang permanen dan tidak berubah
  → Tetap menjadi milik kamu sampai kamu lepaskan
  → Bisa di-reassign ke instance yang berbeda
  → Berguna untuk: endpoint yang tidak boleh berubah,
    whitelist di pihak ketiga, DNS record yang butuh IP stabil

Private IP vs Public IP dalam satu instance:
  Instance di public subnet:
    Private IP: 10.0.1.45   ← untuk komunikasi internal
    Public IP:  54.123.45.67 ← untuk akses dari internet
  
  Instance di private subnet:
    Private IP: 10.0.10.23  ← satu-satunya IP yang ada
    Public IP:  (tidak ada)

Pola Arsitektur: Defense in Depth #

Memisahkan resource ke dalam layer jaringan yang berbeda adalah implementasi prinsip defense in depth — setiap layer memberikan perlindungan tambahan.

Arsitektur Multi-Layer yang Aman:

  Internet
      │
      ▼
  ┌─────────────────────────────────────────────────────┐
  │  PUBLIC SUBNET                                      │
  │  [Load Balancer]  ← satu-satunya yang exposed       │
  │  Port 443 terbuka ke internet                       │
  └─────────────────────────────────────────────────────┘
      │
      │ Hanya port 8080 dari Load Balancer ke App
      ▼
  ┌─────────────────────────────────────────────────────┐
  │  PRIVATE SUBNET                                     │
  │  [App Server A]  [App Server B]                     │
  │  Tidak punya public IP                              │
  │  Tidak bisa diakses langsung dari internet          │
  └─────────────────────────────────────────────────────┘
      │
      │ Hanya port 5432 dari App Server ke Database
      ▼
  ┌─────────────────────────────────────────────────────┐
  │  DATA SUBNET                                        │
  │  [Database Primary]  [Database Replica]             │
  │  Tidak punya public IP                              │
  │  Tidak ada route ke internet sama sekali            │
  └─────────────────────────────────────────────────────┘

  Jika terjadi breach di Load Balancer:
    → Attacker masih butuh menembus private subnet untuk ke App Server
  
  Jika terjadi breach di App Server:
    → Attacker masih butuh menembus data subnet untuk ke Database
    → Database tidak bisa terima koneksi dari internet sama sekali

Akses ke Private Resource untuk Keperluan Operasional #

Resource di private subnet tidak bisa diakses langsung dari internet — tapi tim engineering tetap perlu akses untuk debugging dan maintenance. Ada beberapa pola yang aman untuk ini.

Bastion Host (Jump Server) #

Pola Bastion Host:

  Engineer laptop
      │
      │ SSH ke bastion host (IP publik, port 22)
      ▼
  [Bastion Host] ← di public subnet, punya public IP
      │
      │ SSH ke private resource (IP privat, port 22)
      ▼
  [App Server / Database] ← di private subnet

  Keamanan Bastion Host:
  ✓ Hanya izinkan SSH dari IP address yang dikenal (corporate IP)
  ✓ Gunakan key-based authentication, nonaktifkan password auth
  ✓ Aktifkan MFA untuk login ke bastion
  ✓ Log semua aktivitas di bastion host
  ✓ Bastion host tidak boleh punya software lain yang tidak perlu

VPN atau Direct Connect #

Akses via VPN (lebih aman dari bastion):

  Engineer laptop → VPN Client → VPN Gateway (di cloud)
                                      │
                                      ▼
                               Private subnet resources
                               (seperti akses dari dalam jaringan)

  Keuntungan dibanding bastion:
  ✓ Tidak ada "jump server" yang perlu di-maintain
  ✓ Akses lebih natural — bisa akses database langsung dengan
    tool GUI dari laptop
  ✓ Lebih mudah diaudit melalui VPN logs

Session Manager / Instance Connect #

Cloud-native access tanpa SSH terbuka:

  Engineer
      │
      ▼
  Cloud Provider Console / CLI
      │
      │ (melalui HTTPS ke control plane provider)
      ▼
  Agent di instance (SSM Agent, EC2 Instance Connect)
      │
      ▼
  Shell session di instance

  Keuntungan:
  ✓ Port 22 tidak perlu terbuka sama sekali di security group
  ✓ Semua sesi diaudit dan di-log oleh provider
  ✓ Akses dikontrol via IAM (siapa boleh connect ke instance mana)
  ✗ Butuh internet access atau VPC endpoint untuk instance
    bisa berkomunikasi dengan control plane

Kesalahan Umum yang Harus Dihindari #

// ANTI-PATTERN 1: Database di public subnet
  RDS database punya public IP dan bisa diakses dari internet
  → Attack surface yang tidak perlu
  → Database harus selalu di private subnet

// ANTI-PATTERN 2: Application server langsung exposed ke internet
  App server punya public IP, port 8080 terbuka ke 0.0.0.0/0
  → Jika ada vulnerability, langsung dieksploitasi
  → Semua trafik harus masuk melalui load balancer

// ANTI-PATTERN 3: Security group yang terlalu permisif
  Ingress: 0.0.0.0/0 port 22 (SSH terbuka ke seluruh internet)
  → Akan di-brute force dalam hitungan menit
  → Batasi ke IP spesifik atau gunakan Session Manager

// BENAR: Minimal exposure
  Hanya load balancer yang punya public IP
  Security group hanya izinkan trafik yang diperlukan
  Database tidak punya public IP dan tidak ada route ke internet
  Akses operasional melalui VPN atau Session Manager

Ringkasan #

  • Public subnet = internet bisa reach resource, private subnet = tidak bisa — ini adalah perbedaan paling fundamental dalam network design.
  • Sebagian besar resource harus di private subnet — database, application server, cache, internal services tidak perlu dan tidak boleh exposed ke internet.
  • Load balancer adalah satu-satunya titik masuk yang ideal — semua trafik dari internet masuk melalui load balancer, tidak langsung ke app server.
  • Defense in depth dengan layer jaringan — public subnet → private subnet → data subnet, masing-masing dengan firewall terpisah di antaranya.
  • Elastic IP untuk endpoint yang tidak boleh berubah — IP publik biasa bisa berubah saat instance restart; Elastic IP tetap.
  • Akses operasional ke private resource melalui VPN atau Session Manager — bukan dengan membuka port SSH ke seluruh internet.

← Sebelumnya: Subnet, CIDR, Routing   Berikutnya: NAT, Firewall, Security Group →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact