04. Role: Web App Server

04. Role: Web App Server (Caddy + Backend)

Server ini menjalankan aplikasi web (Node.js, Python, Go) yang diisolasi dengan Caddy sebagai reverse proxy dan TLS terminator.

2.1 Arsitektur

Semua aplikasi backend mendengarkan pada 127.0.0.1 (localhost) untuk meminimalkan permukaan serangan. Caddy menangani komunikasi eksternal.

2.2 Instalasi Paket

2.2.1 Caddy (Reverse Proxy)

Gunakan repository resmi untuk mendapatkan versi terbaru.

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1G 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1G 'https://dl.cloudsmith.io/public/caddy/stable/debian.list' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

2.2.2 Backend Runtimes

Instal runtime sesuai dengan kebutuhan aplikasi.

# Node.js
sudo apt install -y nodejs npm

# Python
sudo apt install -y python3 python3-venv python3-pip

2.3 Konfigurasi Caddy

Lokasi file: /etc/caddy/Caddyfile

Template Konfigurasi:

app.<YOUR_DOMAIN> {
    log {
        output file /var/log/caddy/access.log {
            roll_size 50mb
            roll_keep 10
        }
        format json
    }

    reverse_proxy 127.0.0.1:5000

    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Referrer-Policy "strict-origin-when-cross-origin"
        -Server
    }
}

2.4 Runtime Backend & Sandboxing

Semua aplikasi backend (Node.js, Python, Go) harus dijalankan sebagai service systemd dengan fitur sandboxing aktif untuk membatasi akses ke sistem jika terjadi kompromi pada aplikasi.

2.4.1 Template Systemd Terproteksi (Sandbox)

Simpan di /etc/systemd/system/<service-name>.service. Template ini memberikan isolasi tingkat tinggi.

[Unit]
Description=Backend Service
After=network.target

[Service]
# User & Path Setup
User=app-user
WorkingDirectory=/home/app-user/app
# Contoh ExecStart (sesuaikan dengan runtime)
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5

# --- SANDBOXING / HARDENING ---
# Isolasi Sistem File
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes

# Pembatasan Privilege
NoNewPrivileges=yes
CapabilityBoundingSet=
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
LockPersonality=yes

# Network & System Call Filtering
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM

# Jalur yang Diizinkan (Opsional)
# Jika aplikasi perlu menulis file, tentukan di sini:
# ReadWritePaths=/home/app-user/app/logs
# BindReadOnlyPaths=/etc/app/config.json

[Install]
WantedBy=multi-user.target

2.4.2 Penjelasan Direktif Keamanan

Direktif Fungsi
ProtectSystem=strict Seluruh root filesystem menjadi read-only bagi service.
ProtectHome=yes Direktori /home dan /root tidak dapat diakses oleh service.
PrivateTmp=yes Memberikan /tmp dan /var/tmp yang terisolasi dan privat.
NoNewPrivileges=yes Mencegah proses mendapatkan privilege tambahan (misal via SUID).
CapabilityBoundingSet= Menghapus semua kernel capabilities (Service tidak bisa jadi root).
SystemCallFilter= Membatasi syscall yang diizinkan hanya untuk fungsi standar service.

2.4.3 Contoh Per Runtime

Node.js

Pastikan aplikasi mendengarkan pada 127.0.0.1:PORT.

ExecStart=/usr/bin/node /home/app-user/app/server.js

Python (Gunicorn)

Gunakan virtual environment untuk keamanan dan isolasi dependensi.

ExecStart=/home/app-user/app/venv/bin/gunicorn -w 4 -b 127.0.0.1:5001 app:app

Go

Go binary sangat cocok dengan sandboxing karena statis.

ExecStart=/home/app-user/app/binary-name -listen 127.0.0.1:5002

2.5 Verifikasi & Monitoring Keamanan

  1. Audit Isolasi: Jalankan perintah berikut untuk mengecek seberapa aman service Anda:

    systemd-analyze security <service-name>.service

    Target skor: < 2.0 (Low Exposure).

  2. Firewall (UFW): Hanya izinkan trafik publik ke Caddy (Reverse Proxy).

    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
  3. CrowdSec Integration: Pastikan CrowdSec memantau log Caddy untuk memblokir serangan layer 7.

    sudo cscli collections install crowdsecurity/caddy
    sudo cscli collections install crowdsecurity/http-cves
    sudo cscli collections install crowdsecurity/web-application-abuse

    Catatan: Pemblokiran aktual (remediasi) ditangani oleh crowdsec-firewall-bouncer-nftables yang telah diinstal di tahap baseline. Ini akan secara otomatis memutus koneksi IP penyerang ke port 80/443.