VPS Setup & Configuration — DevOps

Setup VPS dari Nol VPS (Virtual Private Server) adalah server virtual yang kamu kelola sendiri. Ini panduan setup VPS baru untuk menjalankan web application…

VPS (Virtual Private Server) adalah server virtual yang kamu sewa: satu VM dengan CPU, RAM, dan disk-nya sendiri, IP publik, dan akses root penuh. Begitu dibuat, VPS itu langsung bisa diakses seluruh internet, jadi jam pertamanya dipakai untuk menguncinya. Bayangin kamu baru dapat ruko untuk cabang kedua warungmu. Pemiliknya menyerahkan kunci master (password root). Kamu membuat kunci sendiri untuk karyawanmu (user deploy dan SSH key), mencoba kunci baru itu di pintu dulu sebelum kunci master disimpan, menutup semua pintu kecuali pintu depan (firewall), menyewa satpam yang mengusir orang yang lima kali salah kode (fail2ban), lalu menyetel jam dinding ke WIB dan menyiapkan gudang cadangan (swap).

🧪 Tebakan cepat: di VPS baru, lewat sesi root yang sedang terbuka, kamu menulis PasswordAuthentication no lalu restart SSH, padahal ssh-copy-id belum pernah jalan. Apakah sesi root yang sedang terbuka itu langsung putus? Tebak dulu, jawabannya ada di bagian "Menutup root dan password".

Jam pertama di web-2

catatan-api butuh server kedua, web-2 (Ubuntu 24.04, RAM 1 GB, IP 203.0.113.11). Provider mengirim password root lewat email. Ini urutan yang kamu jalankan di Lab, dan urutannya penting:

# Langkah Perintah utama
1 Update paket apt update && apt upgrade -y
2 User biasa dengan sudo adduser deploy, usermod -aG sudo deploy
3 SSH key untuk deploy, lalu tes ssh-copy-id [email protected] (dari laptop)
4 Tutup root dan password PermitRootLogin no, PasswordAuthentication no
5 Buka port yang dipakai ufw allow 22/tcp, 80/tcp, 443/tcp
6 Nyalakan firewall ufw enable
7 Satpam SSH apt install -y fail2ban
8 Zona waktu timedatectl set-timezone Asia/Jakarta
9 Swap file swap 1 GB

Alasan tiap pengaturan keamanan ini dibahas lebih dalam di pelajaran Server Hardening Basics (track Security). Di sini fokusnya urutan dan perintahnya.

Login pertama dan update

Dari laptop, login sebagai root dengan password dari email. ssh (Secure Shell) adalah perintah untuk masuk ke terminal server lewat koneksi terenkripsi:

budi@laptop:~$ ssh [email protected]
root@web-2:~# apt update && apt upgrade -y
...
37 packages can be upgraded. Run 'apt list --upgradable' to see them.
...
37 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Image VPS biasanya dibuat berminggu-minggu sebelumnya, jadi patch keamanan yang tertinggal dipasang dulu.

User deploy dan SSH key

Root bisa melakukan apa saja, jadi kerja sehari-hari memakai user biasa yang naik hak lewat sudo:

root@web-2:~# adduser deploy
info: Adding user `deploy' ...
...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
...
root@web-2:~# usermod -aG sudo deploy

Lalu di laptop, pasang public key-mu ke server (bikin dulu dengan ssh-keygen -t ed25519 kalau belum punya):

budi@laptop:~$ ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/budi/.ssh/id_ed25519.pub"
...
[email protected]'s password:

Number of key(s) added: 1

ssh-copy-id login sekali pakai password, lalu menambahkan public key ke /home/deploy/.ssh/authorized_keys. Karena itu dia harus jalan sebelum password dimatikan. Tes ssh [email protected] di terminal kedua: masuk tanpa ditanya password artinya key-nya jalan.

Menutup root dan password

Edit /etc/ssh/sshd_config (dengan nano), lalu cek dan terapkan:

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
root@web-2:~# sshd -t
root@web-2:~# systemctl restart ssh

Restart SSH gak memutus sesi yang sedang terbuka; yang berubah cuma login berikutnya. Jadi sesi root tadi tetap jalan. Itu jawaban tebakannya. Tapi begitu kamu logout, login baru ditolak dengan [email protected]: Permission denied (publickey)., karena password sudah ditutup dan key-nya belum ada. Selama sesi lama masih terbuka, kamu masih bisa memperbaikinya, jadi jangan tutup sesi itu sebelum login di terminal kedua berhasil.

Firewall: allow dulu, baru enable

root@web-2:~# ufw allow 22/tcp
Rules updated
Rules updated (v6)
root@web-2:~# ufw allow 80/tcp && ufw allow 443/tcp
Rules updated
Rules updated (v6)
Rules updated
Rules updated (v6)
root@web-2:~# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

UFW di Ubuntu menolak semua koneksi masuk begitu aktif, kecuali port yang di-allow. Port 22 (SSH) harus di-allow sebelum ufw enable. Kalau terbalik, sesi yang sedang terbuka tetap jalan, tapi login berikutnya berakhir dengan ssh: connect to host 203.0.113.11 port 22: Connection timed out.

fail2ban, zona waktu, swap

root@web-2:~# apt install -y fail2ban
root@web-2:~# fail2ban-client status
Status
|- Number of jail:	1
`- Jail list:	sshd
root@web-2:~# timedatectl set-timezone Asia/Jakarta
root@web-2:~# fallocate -l 1G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6f1c2a9e-3b7d-4e58-9a0c-2d4f8b1e7a63
root@web-2:~# echo '/swapfile none swap sw 0 0' >> /etc/fstab

Di latihan: membuat perintah UFW

generateUfwRules(services) mengubah daftar nama service jadi perintah UFW, lalu menambahkan "sudo ufw enable" paling akhir, persis urutan aman tadi. Peta port-nya: ssh 22, http 80, https 443, mysql 3306, postgres 5432, redis 6379. Jadi ["ssh", "http", "https"] jadi ["sudo ufw allow 22/tcp", "sudo ufw allow 80/tcp", "sudo ufw allow 443/tcp", "sudo ufw enable"]. Di server sungguhan, port database seperti 5432 dan 6379 jangan dibuka ke semua orang: latihan ini cuma menguji pemetaan port-nya.

⚠️ Jebakan yang sering ketemu

TL;DR: VPS (Virtual Private Server) = VM sewaan dengan IP publik dan akses root, dan kamu masuk ke terminalnya dengan ssh. Jam pertama di web-2: apt update && apt upgrade -y, adduser deploy plus usermod -aG sudo deploy, ssh-copy-id dari laptop dan tes login di terminal kedua, lalu PermitRootLogin no dan PasswordAuthentication no (cek sshd -t, systemctl restart ssh), ufw allow 22/tcp, 80, 443 sebelum ufw enable, fail2ban, timedatectl set-timezone Asia/Jakarta, dan swap 1 GB. Langkah keamanan pertama: matikan login root, buat user baru, pakai SSH key, nyalakan firewall. Restart SSH gak memutus sesi yang terbuka, jadi biarkan sesi lama sampai login baru berhasil.

Yang akan kamu pelajari