Topik ini membuka proyek penutup jalur Linux, yaitu menyiapkan satu VPS (virtual private server) baru dari OS telanjang sampai layak dipakai. Hasil akhirnya adalah server dengan pengguna administratif sendiri, SSH yang diperketat, dan firewall aktif, ditata mengikuti arsitektur tetap yang dipakai dua topik berikutnya. Sandbox tidak dapat membuat VPS, sehingga pembuatan server dilakukan pada penyedia cloud mana pun. Topik ini menyiapkan seluruh bagian yang dapat dikerjakan secara lokal, yaitu skrip inisialisasi, daftar periksa, dan pemeriksaan sintaksnya.
Arsitektur server tujuan#
Server yang dibangun sepanjang proyek ini memiliki bentuk yang tetap, sehingga setiap keputusan konfigurasi selanjutnya dapat diukur terhadap gambar yang sama. Diagram berikut memperlihatkan lapisannya, mulai dari firewall di depan sampai cadangan harian di belakang.
Paket dari internet terlebih dahulu melewati ufw, dan satu-satunya jalur masuk yang diberi aturan allow adalah port 22 menuju sshd. Layanan aplikasi yang ditempatkan pada topik berikutnya tidak mendengarkan port publik mana pun, sehingga tidak ada jalur langsung dari luar ke layanannya. Di dalam server, layanan menulis data dan log ke pustakanya, sedangkan timer cadangan mengambil isi pustaka itu setiap malam melalui rsync. Susunan ini membuat setiap lapisan dapat diperiksa secara terpisah, yaitu firewall dengan ufw status, layanan dengan systemctl status, dan cadangan dengan daftar snapshotnya.
Skrip inisialisasi dan pemeriksaan sintaks#
Seluruh tahap penyiapan ditulis lebih dahulu sebagai satu skrip shell sebelum menyentuh server. Menyimpan langkah dalam skrip, alih-alih mengetiknya satu per satu di sesi SSH, membuat urutan tahap dapat ditinjau ulang dan diulang persis pada server berikutnya. Sintaks skrip juga dapat diperiksa terlebih dahulu tanpa menjalankan satu pun perintahnya. Skrip bernama inisialisasi-server.sh mencakup empat tahap berikut.
- Pembaruan paket dengan
apt-get updatedanapt-get upgrade -y, sehingga server dimulai dari paket-paket terbaru. - Pembuatan pengguna administratif bernama admin beserta keanggotaan grup sudo, agar pekerjaan harian tidak dilakukan sebagai root.
- Pengerasan sshd melalui berkas drop-in
/etc/ssh/sshd_config.d/99-pengerasan.confyang berisiPermitRootLogin nodanPasswordAuthentication no, diikutisshd -tuntuk memeriksa konfigurasi sebelum ssh di-restart. - Penetapan firewall dengan
ufw allow OpenSSHlebih dahulu, baruufw enable, sehingga akses SSH tetap terbuka ketika firewall diaktifkan.
Draf skripnya ditulis ke folder kerja, kemudian diperiksa dengan bash -n, yaitu opsi yang meminta bash menguraikan seluruh baris tanpa menjalankannya:
# draf skrip inisialisasi ditulis ke folder kerja
mkdir -p /tmp/kerja-menyiapkan-vps
cat > /tmp/kerja-menyiapkan-vps/inisialisasi-server.sh <<'SKRIP'
#!/bin/bash
# inisialisasi-server.sh: penyiapan awal VPS Ubuntu 24.04
# Dijalankan sekali dari sesi SSH dengan hak root.
set -euo pipefail
# tahap 1: pembaruan paket
apt-get update
apt-get upgrade -y
# tahap 2: pengguna administratif
adduser --disabled-password --gecos "" admin
usermod -aG sudo admin
printf 'admin ALL=(ALL) NOPASSWD: ALL\n' > /etc/sudoers.d/90-admin
chmod 440 /etc/sudoers.d/90-admin
# tahap 3: pengerasan sshd lewat berkas drop-in
printf 'PermitRootLogin no\nPasswordAuthentication no\n' \
> /etc/ssh/sshd_config.d/99-pengerasan.conf
sshd -t
systemctl restart ssh
# tahap 4: firewall, aturan SSH sebelum enable
ufw allow OpenSSH
ufw --force enable
SKRIP
# pemeriksaan sintaks tanpa mengeksekusi satu pun perintah di dalamnya
bash -n /tmp/kerja-menyiapkan-vps/inisialisasi-server.sh
echo "sintaks draf inisialisasi-server.sh sah"sintaks draf inisialisasi-server.sh sahApabila tidak menemukan kesalahan, bash -n berjalan senyap, sehingga pesan sukses dari echo yang menyusulnya menandakan struktur skrip sah. Kesalahan seperti tanda kutip yang tidak tertutup dilaporkan lengkap dengan nomor barisnya. Baris set -euo pipefail membuat skrip berhenti sejak error pertama, pola yang sama dengan disiplin set -e pada modul scripting shell. Skrip ini sengaja tidak dieksekusi di lingkungan latihan karena seluruh perintahnya menuntut hak root pada server sungguhan.
Daftar periksa penyerahan#
Skrip tidak dipercaya mentah-mentah, karena satu tahap yang gagal di tengah jalan harus terdeteksi sebelum tahap berikutnya dinyatakan selesai. Karena itu, berkas langkah-persiapan.md berikut menjadi catatan langkah proyek ini, yaitu daftar periksa yang setiap butirnya menyebut tahap beserta perintah verifikasinya:
# Daftar periksa penyiapan VPS
Centang setiap butir hanya setelah perintah verifikasinya berhasil dijalankan di server.
## 1. Akses awal
- [ ] Kunci SSH dibuat dengan `ssh-keygen -t ed25519`
- [ ] Kunci publik terpasang pada server melalui mekanisme penyedia cloud atau `ssh-copy-id`
- [ ] Login pertama ke server berhasil tanpa kata sandi
## 2. Pembaruan dan pengguna administratif
- [ ] `apt-get update && apt-get upgrade -y` berakhir tanpa pesan error
- [ ] Pengguna admin ada dan berada di grup sudo: `id admin`
- [ ] Berkas `/etc/sudoers.d/90-admin` ada dengan izin 440: `stat -c '%a %n' /etc/sudoers.d/90-admin`
## 3. Pengerasan SSH
- [ ] Berkas `/etc/ssh/sshd_config.d/99-pengerasan.conf` ada: `cat /etc/ssh/sshd_config.d/99-pengerasan.conf`
- [ ] `sshd -t` berakhir senyap dengan kode kembali 0
- [ ] Percobaan login root dan login kata sandi dari sesi baru ditolak
## 4. Firewall
- [ ] `sudo ufw allow OpenSSH` dijalankan sebelum `ufw enable`
- [ ] `sudo ufw status verbose` menampilkan `Status: active` dengan aturan `22/tcp ALLOW`
## 5. Pemeriksaan akhir
- [ ] Sesi baru masuk sebagai admin melalui kunci: `ssh admin@<alamat-server>`
- [ ] `sudo systemctl status ssh --no-pager` menampilkan `active (running)`
- [ ] Server dinyatakan siap pakai dan lanjut ke pengerjaan layananDaftar itu disalin ke folder kerja sebagai salinan yang akan dicentang selama pengerjaan, sedangkan berkas pada bundle tetap menjadi acuan bersih. Pemeriksaan berikut memastikan salinan kerjanya identik dengan asetnya:
# salinan kerja daftar periksa
cp langkah-persiapan.md /tmp/kerja-menyiapkan-vps/
# tanpa keluaran berarti tidak ada perbedaan
diff langkah-persiapan.md /tmp/kerja-menyiapkan-vps/langkah-persiapan.md
echo "salinan kerja identik dengan aset"salinan kerja identik dengan asetPola kerjanya sederhana, yaitu satu butir, satu perintah verifikasi, satu tanda centang. Butir yang verifikasinya gagal menghentikan pengerjaan pada baris itu sampai penyebabnya ditemukan. Ketika seluruh butir sudah tercentang, daftar periksa ini sekaligus menjadi bukti penyerahan.
Berkas yang sama sekaligus menjadi tempat mencatat keputusan proyek, misalnya alamat server dan nama pengguna administratifnya, sehingga penyiapan server berikutnya cukup mengulang daftar yang sama tanpa mencari ulang keputusan lama. Catatan semacam ini ringan dirawat karena bentuknya teks biasa, dan perbedaannya terhadap acuan selalu dapat diperiksa dengan diff sebagaimana blok di atas.
Menjalankan skrip di server#
Sebelum skrip dieksekusi, kunci SSH harus sudah tersedia, yaitu pasangan kunci dibuat dengan ssh-keygen dan kunci publiknya terpasang pada server. Urutan eksekusinya dikerjakan dari terminal lokal setelah VPS dibuat dan alamatnya diketahui, dengan asumsi penyedia cloud memasang kunci publik untuk root saat server dibuat. Ukuran dan lokasi servernya bebas dipilih karena skrip ini hanya menuntut Ubuntu 24.04 beserta hak root:
# tidak-dijalankan
# pembuatan VPS dan ssh ke server menuntut penyedia cloud, keduanya di luar sandbox
scp inisialisasi-server.sh [email protected]:/tmp/
ssh [email protected] 'bash /tmp/inisialisasi-server.sh'Pertama kali, login dilakukan sebagai root karena admin belum ada dan root masih diizinkan login dengan kunci. Setelah skrip berakhir tanpa pesan error, konfigurasi pengerasan pada tahap tiga menolak login root, sehingga verifikasi berikutnya masuk sebagai admin:
# tidak-dijalankan
# verifikasi akhir, kini sebagai admin dan melalui firewall
ssh [email protected] 'sudo ufw status verbose'
ssh [email protected] 'systemctl status ssh --no-pager'Pada server, ufw status verbose menampilkan Status: active dengan aturan 22/tcp ALLOW dari Anywhere, sedangkan status ssh menampilkan active (running). Apabila salah satu pemeriksaan gagal, butir yang bersangkutan pada daftar periksa dibiarkan belum tercentang dan tahapnya ditelusuri ulang dari skripnya. Pengerjaan ulang skrip berhenti pada tahap pengguna karena adduser menolak nama yang sudah ada. Keadaan itu justru menandakan tahap-tahap sebelumnya sudah berlaku, sehingga sisa tahap cukup dilanjutkan secara manual sesuai urutan berkasnya.
Kesalahan umum#
- Mengaktifkan
ufw enablesebelum aturanallowuntuk SSH ada. Firewall yang aktif tanpa aturan itu menutup sambungan yang sedang dipakai dan mengunci akses ke server, sehingga urutan tahap empat tidak boleh dibalik. - Memberi keanggotaan sudo tanpa jalur eskalasi yang berfungsi. Pengguna dari
adduser --disabled-passwordmemiliki kata sandi terkunci, sehingga sudo yang menanyakan kata sandi selalu gagal dan pekerjaan administratif apa pun terhenti. - Me-restart ssh dengan konfigurasi yang belum diperiksa. Kesalahan ketik pada berkas konfigurasi membuat sesi baru ditolak, sedangkan sesi yang sudah terbuka masih hidup dan menjadi satu-satunya jalan memperbaikinya.
sshd -tsebelum restart mencegah keadaan ini. - Menyunting
/etc/ssh/sshd_configlangsung alih-alih membuat berkas drop-in. Berkas utama milik paket dan dapat berubah saat pembaruan, sedangkan drop-in99-pengerasan.conftersendiri dan menimpa nilai bawaannya secara eksplisit.
Ringkasan#
- Arsitektur tujuannya adalah ufw dengan default deny di depan, sshd pada port 22 sebagai satu-satunya jalur masuk, layanan tanpa port publik, dan cadangan harian.
- Empat tahap penyiapan, yaitu pembaruan, pengguna administratif, pengerasan sshd, dan firewall, disatukan dalam satu skrip yang diperiksa sintaksnya dengan
bash -n. - Daftar periksa mengikat setiap butir tahap kepada perintah verifikasinya, sehingga penyerahan server dapat dibuktikan butir demi butir.
- Urutan eksekusinya aman karena skrip dijalankan sebagai root sebelum login root dinonaktifkan, lalu verifikasinya masuk sebagai admin.
Referensi#
- sshd_config(5) — Ubuntu Manpages
— Direktif
PermitRootLogin,PasswordAuthentication, dan aturan Include untuk sshd_config.d. - ufw(8) — Ubuntu Manpages
— Perintah
allow,enable, danstatus verbosepada ufw. - Firewalls — Ubuntu Server documentation — Panduan resmi Ubuntu Server tentang ufw dan kebijakan defaultnya.