Kunci, Bukan Password
# Buat pasangan kunci — Ed25519 lebih pendek dan cepat daripada RSA ssh-keygen -t ed25519 -C "budi@laptop" # Salin kunci publik ke server ssh-copy-id budi@server # Manual bila ssh-copy-id tidak tersedia cat ~/.ssh/id_ed25519.pub | ssh budi@server \ 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub chmod 600 ~/.ssh/authorized_keys
OpenSSH sengaja menolak kunci privat yang bisa dibaca pengguna lain, dan mengabaikan authorized_keys yang izinnya terlalu longgar. Gejalanya menyesatkan — Anda diminta password padahal kunci sudah terpasang. Ini penyebab paling sering "kunci saya tidak bekerja".
Berkas Konfigurasi Klien
# ~/.ssh/config
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
Host produksi
HostName 10.0.0.5
User deploy
Port 2222
IdentityFile ~/.ssh/id_produksi
IdentitiesOnly yes
# Menjangkau server internal lewat bastion
Host db-internal
HostName 10.1.2.3
User dba
ProxyJump bastion
Host bastion
HostName bastion.contoh.com
User budi
ssh produksi # cukup ini ssh db-internal # otomatis lewat bastion
ProxyJump menggantikan trik lamaDulu orang memakai ssh -A (agent forwarding) untuk melompat lewat bastion, yang berisiko: siapa pun dengan root di bastion dapat memakai agent Anda untuk masuk ke server lain. ProxyJump membuat koneksi langsung yang di-tunnel melalui bastion tanpa mengekspos kunci Anda di sana.
Terowongan Port
# Local forward: akses database internal dari laptop ssh -L 5432:db-internal:5432 bastion # lalu: psql -h localhost -p 5432 # Remote forward: mengekspos layanan lokal ke server ssh -R 8080:localhost:3000 server # Dynamic: proxy SOCKS ssh -D 1080 bastion
Transfer Berkas
# scp — sederhana scp berkas.txt produksi:/srv/ scp -r direktori/ produksi:/srv/ # rsync — jauh lebih baik untuk apa pun yang berulang rsync -avz --progress ./situs/ produksi:/var/www/situs/ rsync -avz --delete ./situs/ produksi:/var/www/situs/ # cerminkan persis rsync -avz --exclude='node_modules' --exclude='.git' ./ produksi:/srv/app/ rsync -avzn ./situs/ produksi:/var/www/ # -n: uji coba, tidak menyalin
rsync -av ./situs tujuan:/var/www/ → menghasilkan /var/www/situs/ rsync -av ./situs/ tujuan:/var/www/ → menyalin ISI situs ke /var/www/
Digabung dengan --delete, salah menaruh garis miring dapat menghapus isi direktori tujuan yang tidak Anda maksud. Selalu jalankan dengan -n lebih dulu untuk melihat apa yang akan terjadi.
Pengerasan Server SSH
# /etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes ChallengeResponseAuthentication no X11Forwarding no MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 AllowUsers deploy budi Port 2222 # Uji konfigurasi SEBELUM memuat ulang sshd -t systemctl reload sshd
Setelah mengubah konfigurasi SSH, biarkan sesi Anda saat ini tetap terbuka dan buka koneksi baru di terminal lain untuk mengujinya. Bila konfigurasi barunya salah, sesi lama masih menjadi jalan masuk untuk memperbaikinya. Menutup sesi lalu menemukan konfigurasi baru rusak berarti server hanya bisa diselamatkan lewat konsol penyedia.
Menjaga Sesi Tetap Hidup
# tmux — pekerjaan tetap berjalan meski koneksi terputus tmux new -s deploy # Ctrl+B lalu D untuk melepas tmux attach -t deploy tmux ls
Migrasi basis data atau proses build yang berjalan langsung di sesi SSH akan mati bila koneksi Anda terputus — dan jaringan selalu bisa terputus. Menjalankannya di dalam tmux membuat pekerjaan tetap berlanjut, dan Anda cukup menyambung kembali.