VPS barumu baru saja aktif. Provider mengirim IP 159.223.45.10, username root, dan password sementara sepanjang 20 karakter acak. Sekarang kamu harus masuk ke server itu dari laptop, tanpa antarmuka grafis, cuma lewat terminal. Di sinilah SSH bekerja. Hampir semua urusan server — deploy aplikasi, ganti konfigurasi, baca log — berawal dari satu perintah ssh. Artikel ini memandu kamu dari login pertama sampai mengamankan server, dengan perintah yang bisa langsung kamu jalankan.
Kenapa SSH, Bukan Telnet
Dulu orang mengelola server jarak jauh pakai telnet. Password dikirim apa adanya, bisa disadap siapa saja yang memantau jaringan. SSH mengenkripsi seluruh sesi, dari proses login sampai setiap perintah yang kamu ketik. OpenSSH adalah implementasi yang paling umum dan sudah terpasang di hampir semua distro Linux serta macOS. Cek dulu di laptopmu:
ssh -V
Keluarannya kira-kira OpenSSH_9.6p1 Ubuntu-3ubuntu13. Kalau belum terpasang, jalankan sudo apt install openssh-client di Debian/Ubuntu atau brew install openssh di macOS.
Koneksi Pertama: ssh user@host
Bentuk dasar perintahnya selalu ssh user@host, dengan host berupa alamat IP atau nama domain. Sambungkan ke server barumu:
ssh root@159.223.45.10
Saat pertama kali terhubung, SSH menampilkan fingerprint host dan bertanya:
The authenticity of host '159.223.45.10' can't be established.
ED25519 key fingerprint is SHA256:9vZt4mHk1pQ8xR3uYw... .
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Ini normal, bukan error. Ketik yes, lalu masukkan password sementara. Fingerprint itu disimpan ke ~/.ssh/known_hosts, jadi koneksi berikutnya bisa memastikan kamu berbicara dengan server yang sama, bukan server tiruan. Kalau suatu hari server di-rebuild dan IP-nya dipakai mesin lain, SSH menolak dengan WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED. Jangan panik — hapus baris host lama dengan ssh-keygen -R 159.223.45.10, lalu coba lagi.
Fingerprint yang muncul saat pertama connect bisa kamu cocokkan dengan yang ditampilkan penyedia VPS, biasanya di dashboard atau email aktivasi. Kalau beda, ada yang tidak beres di tengah koneksi.
SSH Key: Login Tanpa Password
Password sementara itu menyebalkan: panjang, sulit diingat, dan jadi target brute force. Solusinya SSH key. Kamu membuat sepasang kunci — privat dan publik. Kunci privat tinggal di laptop, kunci publik kamu taruh di server. Saat login, server menantang klien membuktikan bahwa ia memegang kunci privat, tanpa kunci itu pernah dikirim lewat jaringan.
ssh-keygen -t ed25519 -C "email@kamu.com"
Pilih ed25519, jangan RSA. Kuncinya jauh lebih pendek dan cepat, tapi tetap kuat. Tekan Enter untuk lokasi default ~/.ssh/id_ed25519, lalu isi passphrase kalau laptopmu dipakai orang lain juga. Setelah itu salin kunci publik ke server:
ssh-copy-id root@159.223.45.10
Perintah ini menambahkan isi id_ed25519.pub ke ~/.ssh/authorized_keys di server. Coba ssh root@159.223.45.10 lagi — seharusnya tidak diminta password, paling cuma passphrase. Kalau masih diminta password, hampir selalu soal permission: direktori ~/.ssh di server harus 700 dan authorized_keys harus 600. Permission yang kelonggaran membuat SSH menolak key secara diam-diam.
Kunci privat (id_ed25519) jangan pernah dikirim ke siapa pun, di-upload, atau di-commit ke Git. Yang boleh disebar hanya kunci publik (id_ed25519.pub).
File ~/.ssh/config: Alias Supaya Tidak Mengetik IP
Menghafal IP dan username untuk tiap server itu buang-buang waktu. Buat alias lewat file ~/.ssh/config di laptop:
Host serverku
HostName 159.223.45.10
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
Setelah itu cukup ssh serverku. Satu file bisa memuat banyak host sekaligus. Tambahkan juga ServerAliveInterval 60 dan ServerAliveCountMax 3 di dalam blok Host supaya koneksi idle tidak mati mendadak — berguna kalau kamu sering meninggalkan sesi terminal berjam-jam.
Salin File dengan scp dan rsync
Deploy seringnya dimulai dari menyalin file dari laptop ke server. Sintaks scp mirip cp, dengan tambahan host tujuan:
# laptop -> server
scp app.tar.gz serverku:/root/
# server -> laptop
scp serverku:/var/log/nginx/access.log ./logs/
Untuk folder besar atau sinkronisasi rutin, rsync lebih efisien karena hanya mengirim bagian yang berubah:
rsync -avz --delete ./dist/ serverku:/var/www/app/
Flag -a menjaga permission dan timestamp, -v menampilkan progres, -z mengompres data, dan --delete menghapus file di tujuan yang sudah tidak ada di sumber. rsync berjalan di atas SSH, jadi tidak perlu membuka port tambahan.
Port Forwarding: Terowongan untuk Port yang Tertutup
Tidak semua layanan perlu dibuka ke internet. PostgreSQL di server, misalnya, cukup didengar di localhost. SSH bisa membuat terowongan supaya port lokal di laptop menembus ke server:
ssh -L 5432:localhost:5432 serverku
Perintah ini memetakan port 5432 di laptop ke localhost:5432 di server. Sekarang psql -h localhost -p 5432 di laptop bekerja seolah-olah PostgreSQL jalan di mesin lokal. Bentuk umumnya ssh -L port_lokal:host_tujuan:port_tujuan.
Arah sebaliknya pakai -R. Kamu punya web app berjalan di laptop pada port 3000 dan ingin memamerkannya tanpa deploy: ssh -R 8080:localhost:3000 serverku membuat port 8080 di server meneruskan koneksi ke laptopmu. Sedangkan ssh -D 1080 serverku mengubah SSH menjadi proxy SOCKS di localhost:1080 — atur browser memakai proxy itu dan semua lalu lintasmu keluar lewat server.
Tunnel mati kalau koneksi SSH putus. Untuk tunnel yang harus selalu hidup, gabungkan dengan autossh atau systemd timer supaya otomatis tersambung kembali.
ssh-agent: Ketik Passphrase Sekali Saja
Kalau key-mu berpassphrase, SSH menanyakannya setiap kali koneksi. ssh-agent menyimpan kunci yang sudah dibuka di memori:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Setelah ssh-add, passphrase diminta sekali dan diingat sampai kamu logout. Di macOS, Keychain sudah menjalankan agent secara otomatis. Untuk kasus khusus seperti git pull di server lewat koneksi berantai ada flag -A (agent forwarding), tapi hindari kalau bisa: -A bisa disalahgunakan kalau server perantara sudah dibobol. Gunakan ProxyJump sebagai gantinya.
Hardening: Tutup Pintunya Setelah Semua Beres
Setelah login key berhasil, matikan login password supaya bot brute force tidak punya celah. Edit /etc/ssh/sshd_config di server:
sudo nano /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin prohibit-password
prohibit-password berarti root hanya bisa masuk lewat key, bukan password. Setelah itu restart: sudo systemctl restart sshd. Sebelum menutup sesi, buka terminal baru dan pastikan login key masih berfungsi — salah konfigurasi di sini bisa membuatmu terkunci di luar server. Kalau server ini nantinya menjalankan aplikasi Python, bungkus aplikasinya sebagai service systemd supaya tetap hidup setelah kamu logout.
Langkah Berikutnya
Urutan yang paling sering saya pakai saat menangani server baru: buat key, ssh-copy-id, siapkan ~/.ssh/config, rsync kode, lalu jalankan aplikasi. Kalau empat langkah itu sudah lancar, kamu bisa naik level. Ansible mengotomasi semua perintah SSH di atas menjadi playbook yang bisa diulang, tmux menjaga sesi tetap hidup walau koneksi putus, dan Nginx berdiri di depan aplikasimu sebagai reverse proxy. Coba sekarang: buat key ed25519, salin ke server, dan matikan PasswordAuthentication.