Panduan Komprehensif Setup Server Linux Ubuntu dari Nol: Hardening Keamanan, Web Server, dan Database untuk Production
Selamat datang di panduan definitif untuk menyiapkan server Linux yang siap produksi. Sebagai seorang praktisi yang telah menghabiskan bertahun-tahun di ruang server (baik fisik maupun cloud), saya tahu betapa frustrasinya menghadapi tutorial yang terlalu singkat atau hanya berisi perintah copy-paste tanpa konteks. Server yang buruk bukan hanya tentang performa lambat, tetapi tentang lubang keamanan yang menunggu untuk dieksploitasi.
Tutorial ini dirancang untuk Anda yang ingin memahami "apa", "bagaimana", dan yang terpenting, "kenapa" di balik setiap konfigurasi. Kita tidak akan sekadar menginstal perangkat lunak; kita akan membangun benteng digital. Kita akan menggunakan Ubuntu Server 22.04 LTS atau 24.04 LTS sebagai standar industri karena stabilitasnya, namun prinsip di sini dapat diterapkan pada distribusi lain seperti Debian atau CentOS dengan sedikit penyesuaian.
Ringkasan Singkat
Tujuan akhir dari panduan ini adalah mengubah server kosong (bare metal) menjadi mesin produksi yang aman, dioptimalkan, dan siap melayani aplikasi web. Pembaca kami adalah sysadmin pemula hingga menengah, atau developer yang ingin menyelami dunia DevOps. Output akhirnya adalah server dengan konfigurasi firewall ketat, akses SSH yang diamankan, web server Nginx yang efisien, database PostgreSQL yang andal, serta sertifikat SSL gratis. Tantangan terbesar biasanya bukan pada instalasi, melainkan pada konsistensi konfigurasi dan pencegahan lock-out (terkunci dari server sendiri).
Prasyarat
Sebelum kita menyentuh keyboard server, pastikan Anda telah menyiapkan segala sesuatunya dengan benar. Tidak ada yang lebih buruk daripada terjebak di tengah proses karena kekurangan alat.
- Hardware Minimum: VPS atau Dedicated Server dengan minimal 2 CPU Core, 2GB RAM (lebih baik 4GB untuk headroom), dan 40GB SSD. GPU tidak diperlukan untuk web server standar.
- Sistem Operasi: Ubuntu Server 22.04 LTS atau 24.04 LTS (Fresh install, tanpa panel kontrol seperti cPanel yang berat).
- Klien Lokal: Komputer dengan Terminal (Linux/macOS) atau PuTTY/PowerShell (Windows). Git untuk manajemen kode.
- Pengetahuan Dasar: Pemahaman dasar tentang baris perintah (CLI), konsep IP Address, dan cara kerja internet secara umum.
- Tools Tambahan: Text editor (VS Code), FileZilla atau SCP untuk transfer file awal.
Langkah-Langkah Setup Server Linux
1. Akses Awal dan Update Sistem
Setelah Anda mendapatkan IP server dari penyedia layanan cloud (seperti AWS, DigitalOcean, atau UpCloud), langkah pertama adalah masuk ke dalamnya. Biasanya, Anda akan menerima email berisi IP dan password root sementara.
1.1 Login sebagai Root
Buka terminal Anda dan gunakan perintah SSH. Kita menggunakan root untuk inisialisasi awal, tetapi nanti akan kita nonaktifkan demi keamanan.
Tujuan: Mendapatkan akses shell ke server.
Alasan Teknis: Kita butuh akses administratif tertinggi untuk mengubah konfigurasi dasar.
ssh root@ip_address_server_andaAnda akan diminta memasukkan password (paste dari email provider). Saat mengetik, tidak akan ada tampilan karakter di layar. Itu normal untuk keamanan Unix.
1.2 Mengubah Password Root
Jangan pernah menggunakan password default. Langsung ubahlah.
passwd Indikator Berhasil: Prompt mengatakan "password updated successfully".
Kesalahan Umum: Password terlalu pendek atau lemah (gunakan kombinasi huruf, angka, simbol).
1.3 Update Repository dan Upgrade Paket
Dunia Linux bergerak cepat. Bug ditemukan dan diperbaiki setiap hari. Pastikan server Anda menjalankan versi terbaru.
Tujuan: Memastikan semua paket sistem berada di versi teraman dan paling stabil.
Alasan Teknis: Paket lama sering memiliki kerentanan keamanan (CVE) yang diketahui publik.
apt update && apt upgrade -y Perintah apt update menyegarkan daftar paket dari repository, sementara apt upgrade -y menginstal pembaruan tanpa meminta konfirmasi satu per satu.
Indikator Berhasil: Tidak ada error merah, dan prompt kembali muncul. Jika ada kernel update, mungkin diminta reboot.
Troubleshooting:
Jika muncul error "Unable to locate package", cek koneksi internet server Anda atau coba ganti repository mirror ke yang lebih dekat dengan lokasi server (misalnya mengganti archive.ubuntu.com ke id.archive.ubuntu.com di file /etc/apt/sources.list).
2. Pembuatan User Sudo dan Manajemen Akses
Menggunakan akun root untuk pekerjaan sehari-hari adalah praktik yang sangat buruk. Kesalahan ketik satu saja (misalnya rm -rf /) bisa menghapus seluruh server. Kita akan membuat user biasa dengan hak istimewa.
2.1 Membuat User Baru
Ganti "namauser" dengan nama yang Anda inginkan.
adduser namauserAnda akan diminta mengisi password dan info opsional (bisa tekan Enter untuk melewati info opsional).
2.2 Memberikan Hak Sudo
Kita menambahkan user ini ke grup sudo. Grup ini memiliki izin untuk menjalankan perintah sebagai root.
usermod -aG sudo namauser Tujuan: Memungkinkan user biasa menjalankan perintah administratif.
Alasan Teknis: Prinsip hak istimewa terkecil (Principle of Least Privilege). Kita hanya menjadi root saat dibutuhkan saja.
2.3 Uji Coba User Sudo
Jangan keluar dulu. Kita tes di terminal saat ini (opsional) atau buka sesi SSH baru.
su - namauserSekarang coba jalankan perintah dengan sudo:
sudo ls /root Indikator Berhasil: Anda diminta memasukkan password user Anda, lalu bisa melihat isi folder root.
Kesalahan Umum: "user is not in the sudoers file". Artinya perintah usermod tadi tidak berhasil dijalankan atau Anda lupa restart shell.
3. Hardening Keamanan: Konfigurasi SSH
SSH (Secure Shell) adalah gerbang depan rumah Anda. Jika gerbang ini mudah dijebol, tidak peduli sekuat apa dinding Anda. Default konfigurasi SSH seringkali belum optimal untuk keamanan produksi.
3.1 Generate SSH Key Pair (Di Lokal/Komputer Anda)
Kita akan beralih dari password-based auth ke key-based auth. Ini jauh lebih aman karena kunci enkripsinya jauh lebih sulit ditebak dibandingkan password.
Buka terminal di komputer lokal Anda, bukan di server.
ssh-keygen -t ed25519 -C "[email protected]"Kita menggunakan Ed25519 karena algoritmanya lebih modern, kecil, dan aman dibanding RSA standar. Tekan Enter untuk menyimpan di lokasi default dan biarkan passphrase kosong atau isi sesuai keamanan yang diinginkan.
3.2 Copy Public Key ke Server
Kita perlu menaruh kunci publik ke dalam server agar server mengenali kunci privat kita.
ssh-copy-id namauser@ip_address_server_anda Jika Anda tidak punya perintah ssh-copy-id (misal di Windows), Anda bisa menyalin isi file id_ed25519.pub dan menempelkannya secara manual ke file ~/.ssh/authorized_keys di server.
Indikator Berhasil: Coba login lagi dengan user baru. Anda seharusnya tidak diminta password lagi.
3.3 Konfigurasi File sshd_config
Sekarang kita akan mengunci gerbang tersebut. Kita akan mematikan login root dan memaksa penggunaan kunci SSH.
Buka file konfigurasi:
sudo nano /etc/ssh/sshd_config Cari dan ubah baris berikut (jika diawali tanda pagar #, hapus pagar tersebut):
- Ubah
Port 22menjadiPort 2222(atau port non-standar lain). Ini mengurangi noise dari bot scanner otomatis. - Ubah
PermitRootLogin yesmenjadiPermitRootLogin no. Root tidak boleh bisa login langsung. - Ubah
PasswordAuthentication yesmenjadiPasswordAuthentication no. Ini mematikan login password sepenuhnya. - Pastikan
PubkeyAuthentication yestidak dikomentari.
Simpan dan keluar (Ctrl+O, lalu Ctrl+X).
3.4 Restart Layanan SSH
Agar perubahan diterapkan:
sudo systemctl restart sshPENTING: Jangan tutup sesi SSH saat ini sebelum memverifikasi koneksi baru! Buka tab terminal baru dan coba login dengan port baru:
ssh -p 2222 namauser@ip_address_server_anda Indikator Berhasil: Anda bisa masuk tanpa password melalui port baru.
Kesalahan Umum (Fatal): Anda mengubah port tapi lupa membukanya di firewall (langkah selanjutnya), atau Anda salah mengetik konfigurasi sehingga layanan gagal restart. Jika ini terjadi dan Anda terkunci, Anda biasanya harus menggunakan Console VNC/KVM yang disediakan panel penyedia VPS untuk memperbaikinya.
4. Setup Firewall: Mengamankan Jaringan dengan UFW
Firewall adalah filter yang mengatur lalu lintas masuk dan keluar. Ubuntu datang dengan UFW (Uncomplicated Firewall) yang, sesuai namanya, sangat mudah digunakan namun kuat. Filosofi default kita adalah deny all, allow specific (tolak semua, izinkan yang diperlukan).
4.1 Instalasi dan Cek Status
Biasanya sudah terinstal, tapi cek dulu:
sudo ufw status Jika statusnya inactive, kita lanjutkan setup.
4.2 Atur Default Policy
Pertama, kita tolak semua koneksi masuk dan izinkan semua koneksi keluar (server bisa update, tapi orang luar tidak bisa masuk sembarangan).
sudo ufw default deny incomingsudo ufw default allow outgoing4.3 Izinkan Koneksi yang Diperlukan
Kita harus mengizinkan SSH agar tidak terkunci sendiri. Ingat kita mengubah port SSH ke 2222.
sudo ufw allow 2222/tcp Jika Anda menjalankan web server (HTTP/HTTPS), izinkan port standar:
sudo ufw allow 80/tcpsudo ufw allow 443/tcp4.4 Aktifkan Firewall
Perintah ini akan memulai firewall dan menerapkan aturan:
sudo ufw enable Anda akan melihat peringatan "Command may disrupt existing ssh connections". Jawab y karena kita sudah mengizinkan port 2222 sebelumnya.
Indikator Berhasil: sudo ufw status verbose menampilkan daftar aturan dan status active.
Troubleshooting: Jika Anda lupa mengizinkan port SSH sebelum enable, Anda akan terkunci dari server. Gunakan console VPS penyedia layanan untuk ufw disable dan mulai ulang.
5. Instalasi dan Konfigurasi Nginx (Web Server)
Sekarang server sudah aman, saat kita membuatnya berguna. Nginx (dibaca Engine-X) adalah pilihan populer karena performanya tinggi dalam menangani koneksi konkuren dan penggunaan memori yang rendah.
5.1 Instalasi Nginx
sudo apt install nginx -y Layanan Nginx akan otomatis start setelah instalasi.
5.2 Verifikasi Instalasi
Buka browser dan akses http://ip_address_server_anda. Anda seharusnya melihat halaman "Welcome to Nginx".
Indikator Berhasil: Halaman default Nginx muncul di browser.
Kesalahan Umum: Halaman tidak muncul. Cek lagi firewall: sudo ufw allow 'Nginx Full' atau pastikan port 80 terbuka.
5.3 Struktur Direktori Nginx
Penting untuk memahami tempat menyimpan file Anda:
- /etc/nginx: Direktori konfigurasi.
- /etc/nginx/nginx.conf: File konfigurasi utama.
- /etc/nginx/sites-available: Tempat kita membuat konfigurasi tiap website.
- /etc/nginx/sites-enabled: Konfigurasi website yang sedang aktif (biasanya berisi symlink ke sites-available).
- /var/www/html: Root default untuk file website (namun kita akan membuat struktur terpisah untuk setiap site).
5.4 Membuat Server Block (Virtual Host)
Kita tidak akan menggunakan default configuration. Mari buat konfigurasi untuk website kita, misalnya domainanda.com.
Buat folder untuk website:
sudo mkdir -p /var/www/domainanda.com/html Beri kepemilikan folder kepada user Anda (agar bisa edit file tanpa sudo terus-menerus, meski untuk produksi permission harus diatur hati-hati):
sudo chown -R $USER:$USER /var/www/domainanda.com/html Setel permission:
sudo chmod -R 755 /var/www/domainanda.com Buat file index.html sederhana:
nano /var/www/domainanda.com/html/index.html Isi dengan HTML sederhana:
<html>
<head>
<title>Server Sukses!</title>
</head>
<body>
<h1>Setup Server Anda Berhasil!</h1>
</body>
</html> Sekarang buat konfigurasi Nginx:
sudo nano /etc/nginx/sites-available/domainanda.com Masukkan konfigurasi berikut (ini adalah boilerplate standar performa tinggi):
server {
listen 80;
listen [::]:80;
root /var/www/domainanda.com/html;
index index.html index.htm;
server_name domainanda.com www.domainanda.com;
location / {
try_files $uri $uri/ =404;
}
}5.5 Aktifkan Server Block
Kita perlu membuat symlink (tautan simbolis) dari folder sites-available ke sites-enabled:
sudo ln -s /etc/nginx/sites-available/domainanda.com /etc/nginx/sites-enabled/5.6 Uji Konfigurasi dan Restart
Jangan restart sebelum yakin konfigurasi valid. Nginx memiliki fitur pengecekan yang bagus:
sudo nginx -t Indikator Berhasil: Output menyatakan syntax is ok dan test is successful.
Kesalahan Umum: could not build server_names_hash. Jika nama domain Anda sangat panjang, tambahkan baris ini di http {} block di nginx.conf: server_names_hash_bucket_size 64;.
Jika sukses, restart Nginx:
sudo systemctl restart nginx6. Instalasi dan Keamanan Database (PostgreSQL)
Aplikasi web modern membutuhkan database. PostgreSQL adalah database open-source paling handal dan kaya fitur saat ini. MySQL/MariaDB bagus, tapi PostgreSQL sering jadi pilihan untuk data kompleks dan integritas data tinggi.
6.1 Instalasi PostgreSQL
sudo apt install postgresql postgresql-contrib -y6.2 Akses ke Database
PostgreSQL membuat user sistem bernama "postgres" secara default. Untuk mengelola database, kita login ke akun tersebut:
sudo -i -u postgres Sekarang Anda masuk ke prompt psql:
psql Anda akan melihat prompt berubah menjadi postgres=#.
6.3 Membuat Database dan User
Jangan pernah menggunakan user "postgres" untuk aplikasi Anda. Buat user khusus.
Di dalam prompt psql, ketik:
CREATE DATABASE aplikasidb; Buat user dengan password (ganti 'passwordkuat' dengan password yang benar-benar kuat):
CREATE USER userapp WITH PASSWORD 'passwordkuat'; Berikan izin (privileges) pada database tersebut kepada user:
GRANT ALL PRIVILEGES ON DATABASE aplikasidb TO userapp; Keluar dari psql:
\q Keluar dari user postgres:
exit6.4 Konfigurasi Remote Access (Opsional tapi Kritis)
Secara default, PostgreSQL hanya mendengarkan koneksi dari localhost (127.0.0.1). Jika aplikasi web Anda berada di server yang sama, ini aman. Namun, jika Anda ingin koneksi dari luar (misalnya laptop Anda untuk development tool), Anda perlu mengubahnya.
Edit file konfigurasi utama:
sudo nano /etc/postgresql/14/main/postgresql.conf Cari baris listen_addresses dan ubah menjadi:
listen_addresses = 'localhost, your_ip_address' Namun, untuk keamanan maksimal di awal, pertahankan saja localhost jika aplikasi dan database berada di satu server. Jika Anda mengubahnya, Anda juga harus mengedit pg_hba.conf untuk mengatur izin IP mana yang boleh konek.
Restart PostgreSQL:
sudo systemctl restart postgresql7. Keamanan Tambahan: SSL dengan Certbot (Let's Encrypt)
Web tanpa HTTPS saat ini dianggap tidak aman oleh browser dan mesin pencari. Kita akan menggunakan Let's Encrypt untuk mendapatkan sertifikat SSL gratis. Ini standar industri modern.
7.1 Instalasi Certbot
sudo apt install certbot python3-certbot-nginx -y7.2 Mendapatkan Sertifikat
Pastikan domain Anda sudah diarahkan (A record) ke IP server ini. Jika belum, Certbot akan gagal memverifikasi kepemilikan domain.
Jalankan perintah ini. Certbot akan otomatis mengedit konfigurasi Nginx kita:
sudo certbot --nginx -d domainanda.com -d www.domainanda.com Anda akan diminta email dan persetujuan Terms of Service. Pilih opsi untuk redirect HTTP ke HTTPS (biasanya opsi 2). Ini memaksa semua trafik menjadi aman.
Indikator Berhasil: Pesan "Successfully received certificate". Coba akses https://domainanda.com. Browser akan menampilkan gembok.
7.3 Auto-Renewal
Sertifikat Let's Encrypt berumur pendek (90 hari). Namun, Certbot otomatis memasang script cron atau systemd timer untuk memperbaruinya. Cek status:
sudo systemctl status certbot.timer Pastikan statusnya active.
8. Optimasi dan Hardening Lanjutan
Server sudah berjalan, tapi kita belum selesai. Bagian ini membedakan sysadmin junior dan senior.
8.1 Konfigurasi Swap
Jika server kecil (1-2GB RAM), swap mencegah server crash saat memori penuh dengan menukar data memori ke disk.
Cek apakah swap ada:
sudo swapon --show Jika kosong, buat file swap 1GB:
sudo fallocate -l 1G /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfilesudo swapon /swapfile Agar permanen, edit /etc/fstab dan tambahkan:
/swapfile none swap sw 0 08.2 Fail2Ban: Melawan Brute Force
Meskipun kita sudah mematikan password login dan mengubah port, ada baiknya memasang Fail2Ban untuk memantau log dan memblokir IP yang mencoba menyusup.
sudo apt install fail2ban -y Buat file konfigurasi lokal agar tidak tertimpa saat update:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local Edit jail.local dan pastikan bagian [sshd] aktif (enabled = true). Pastikan port sesuai (2222).
Restart layanan:
sudo systemctl restart fail2ban Tujuan: Otomatis memban IP yang gagal login berulang kali.
Kesalahan Umum: Salah mengatur port di konfigurasi jail.local sehingga Fail2Ban tidak memonitor log SSH dengan benar.
9. Monitoring dan Logging
Anda tidak bisa mengelola apa yang tidak Anda ukur. Jangan instal alat berat seperti Grafana/Prometheus untuk server kecil satu ini, cukup gunakan alat bawaan yang efisien.
9.1 htop
Lebih baik daripada top. Instal:
sudo apt install htop Jalankan htop untuk melihat penggunaan CPU, RAM, dan proses secara real-time dengan warna yang intuitif.
9.2 Logrotate
Linux menyimpan log di /var/log. Jika tidak diatur, file log ini bisa memenuhi disk dan membuat server crash. Logrotate sudah terinstal default, tapi cek konfigurasi Nginx di /etc/logrotate.d/nginx. Pastikan setting rotasi harian atau mingguan sudah sesuai kebutuhan.
Tips & Best Practice
- Backup Rutin: Jangan mengandalkan redundancy penyedia VPS. Gunakan
rsync untuk memindahkan data penting ke server lain atau layanan object storage (seperti S3) setiap hari. - Environment Variables: Jangan pernah menyimpan password atau API key di dalam kode aplikasi (hardcoded). Gunakan file
.env dan pastikan file tersebut ada di .gitignore jika menggunakan Git. - Struktur Folder: Buat direktori khusus untuk script maintenance Anda, misalnya
/opt/scripts. Jangan simpan script sembarangan di home directory user. - Update Rutin: Jadwalkan update sekali seminggu. Perintah
sudo unattended-upgrade bisa di-setup untuk instalasi patch keamanan otomatis. - Dokumentasi: Setiap kali Anda melakukan perubahan konfigurasi yang tidak standar, tulis catatan di file README di server Anda sendiri. Enam bulan kemudian Anda akan lupa kenapa Anda mengubah setting tersebut.
Penutup
Selamat! Anda telah membangun server Linux yang tidak hanya berfungsi, tetapi juga kokoh dan aman. Kita telah menempuh perjalanan dari update sistem dasar, hardening SSH, konfigurasi firewall, instalasi web server dan database, hingga pengamanan koneksi dengan SSL.
Server ini siap untuk menerima aplikasi Anda. Langkah logis selanjutnya adalah mempelajari automasi menggunakan Ansible atau Docker agar proses setup ini dapat direplikasi dalam hitungan detik jika Anda perlu menambah server baru. Ingat, sysadmin yang baik itu malas (dalam arti positif); dia mengotomasi hal-hal yang berulang agar bisa fokus pada masalah yang lebih menantang.
Teruslah bereksperimen, jangan takut error (asal ada backup), dan bangun kebiasaan membaca log jika terjadi masalah. Selamat mengoding!