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 nolalu restart SSH, padahalssh-copy-idbelum 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
adduser deploymembuat user, folder/home/deploy, dan menanyakan password-nya. Password ini nanti dipakai untuksudo, bukan untuk login.usermod -aG sudo deploymenambah deploy ke grupsudo.-a(append) penting: tanpa itu, grup lain milik deploy terhapus.
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
PermitRootLogin no: root gak bisa login lewat SSH sama sekali.PasswordAuthentication no: login cuma boleh pakai key. Bot yang menebak password ditolak.sshd -tmengecek penulisan config dan diam kalau benar. File di/etc/ssh/sshd_config.d/bisa menimpa nilai ini (di banyak image cloud adaPasswordAuthentication yesdi sana), jadi cek nilai yang berlaku dengansshd -T | grep -i passwordauthentication. Detailnya di Server Hardening Basics.
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
- fail2ban membaca log SSH dan memblokir IP yang gagal login berkali-kali (bawaannya 5 kali, diblokir 10 menit). Di Ubuntu, jail
sshdlangsung aktif begitu dipasang. - Zona waktu
Asia/Jakartamembuat jam di log (journalctl, log app) cocok dengan jam kerjamu (WIB). - Swap adalah disk yang dipakai saat RAM penuh. Lambat, tapi dengan RAM 1 GB,
npm ciyang kehabisan memori gak langsung dibunuh (Killed). Baris di/etc/fstabmembuatnya aktif lagi setelah reboot.
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
- Mematikan password sebelum key terpasang. Login berikutnya
Permission denied (publickey).Pasang key, tes di terminal kedua, baru tutup password. ufw enablesebelumufw allow 22/tcp. Login berikutnyaConnection timed out. Allow dulu, enable paling akhir.- Menutup sesi lama terlalu cepat. Sesi yang terbuka adalah jalan pulangmu. Tutup setelah login baru berhasil.
usermod -Gtanpa-a. User keluar dari grup lainnya. Selalu-aG.
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.