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:

bash
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:

bash
ssh root@159.223.45.10

Saat pertama kali terhubung, SSH menampilkan fingerprint host dan bertanya:

bash
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.

bash
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:

bash
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:

bash
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:

bash
# 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:

bash
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:

bash
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:

bash
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:

bash
sudo nano /etc/ssh/sshd_config
bash
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.