Mengeraskan transport SSH untuk rsync: key-based auth ed25519, opsi -e ssh yang ketat tanpa password, kunci Restrict (no-port-forwarding) untuk akun rsync-only, serta mengapa daemon rsyncd tanpa TLS sebaiknya dibungkus SSH tunnel.

Episode 13 menetapkan satu aturan: pakai rsync ≥3.4.4 dan SSH. Episode 14 menyelesaikan sisi SSH-nya — karena "pakai SSH" saja belum cukup; kalian harus tahu cara mengeraskannya. SSH yang tidak dikonfigurasi dengan baik tetap bisa jadi pintu masuk: password yang di-brute-force, port forwarding yang disalahgunakan, atau akun backup dengan akses shell penuh.
Tujuan episode ini: membangun transport rsync yang tanpa password, tanpa perangkat interaktif, dan dengan hak sesedikit mungkin — arsitektur aman yang siap dipakai cron.
Langkah pertama: hilangkan autentikasi password. Key ed25519 dibuat sekali dan dipakai selamanya:
ssh-keygen -t ed25519 -f ~/.ssh/backup_key -N ""
ssh-copy-id -i ~/.ssh/backup_key.pub user@backup-host-t ed25519 — algoritma modern dan aman (bukan RSA 2048 yang lambat/lemah).-f — nama file spesifik untuk key backup, agar tidak tercampur key pribadi.-N "" — tanpa passphrase, karena cron harus bisa memakainya non-interaktif.Untuk mengunci SSH di sisi server agar password tidak pernah diterima:
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
KbdInteractiveAuthentication noWarning
Matikan PasswordAuthentication hanya setelah kalian yakin key sudah bisa login. Jika tidak, kalian bisa mengunci diri sendiri. Uji dulu dari terminal kedua sebelum me-restart sshd (sudo systemctl restart ssh).
Saat memanggil rsync, definisikan transport SSH secara eksplisit dengan opsi ketat — ini juga memastikan cron tidak bergantung pada file ~/.ssh/config atau agent:
rsync -avh -e "ssh -i /root/.ssh/backup_key -o BatchMode=yes -o ConnectTimeout=10" \
/home/data/ backup-user@backup-host:/backup/| Opsi | Arti |
|---|---|
-i | Key file spesifik |
BatchMode=yes | Gagal jika butuh password/prompt — tidak pernah menggantung |
ConnectTimeout=10 | Putus setelah 10 detik jika host tak terjangkau |
BatchMode=yes sangat penting untuk cron: tanpa itu, SSH yang tidak bisa autentikasi akan menunggu input password yang tak akan pernah diberikan — menggantung backup selamanya.
Key yang kalian taruh di host backup sebaiknya dibatasi. Saat menyiapkan akun rsync-only, tambahkan opsi kunci restrict di authorized_keys:
restrict,no-port-forwarding,no-agent-forwarding,no-pty \
ssh-ed25519 AAAA...backup-key user@backuprestrict menolak semua fasilitas SSH (forwarding, agent, PTY) secara default; no-port-forwarding menegaskan larangan port forwarding. Hasilnya: key ini hanya bisa menjalankan rsync, tidak bisa dijadikan pintu masuk ke layanan internal server lain.
Langkah lebih ketat: kunci key itu ke satu perintah rsync saja, memakai command=:
restrict,command="rsync --server --sender -logDtpre.iLsfxCIvu . /backup/" \
ssh-ed25519 AAAA...backup-key backup-user@backupDengan ini, siapa pun yang login memakai key itu hanya bisa mengeksekusi perintah rsync yang sudah ditentukan — bukan shell. Jika command= muncul, SSH mengabaikan perintah apa pun dari client. Ini pola "deployment key" yang aman untuk akun otomasi.
Tip
Mencari tahu string --server yang tepat bisa menyita waktu. Triknya: jalankan rsync -av -e ssh -v ... sekali dan baca baris command yang dikirim ke remote di output verbose — lalu salin ke command=. Mulai dari perintah yang persis itu.
Daemon rsyncd di port 873 tidak terenkripsi (sudah disinggung di episode 2 dan 13). Jika kalian tetap ingin memakai mode daemon untuk data sensitif, jangan buka port 873 ke jaringan — bungkus dengan SSH tunnel:
ssh -N -L 873:localhost:873 tunnel-user@server &
rsync -avh rsync://localhost/backup/ ./restored/SSH meneruskan port 873 lokal ke port 873 di server lewat koneksi terenkripsi. Client hanya berbicara ke localhost:873; lalu lintas jaringan yang sebenarnya melewati SSH. Hasilnya: kalian mendapat kemudahan mode daemon dan enkripsi SSH sekaligus — tanpa mengekspos port daemon ke dunia.
Important
Aturan singkat: SSH untuk hampir semua kasus, daemon hanya untuk mirror publik, dan jika daemon menyentuh data sensitif, bungkus dengan SSH tunnel. Jangan pernah memilih daemon langsung "karena lebih cepat" — pertukaran itu tidak pernah sepadan dengan risiko plaintext.
Ringkasan pola aman di host tujuan backup:
backup-user (bukan root) dengan UID/GID stabil (episode 11).authorized_keys dengan restrict.sshd_config: PasswordAuthentication no, PermitRootLogin no.backup-user, module/filesystem di-mount dengan noexec bila memungkinkan.ssh -i key backup-user@host "echo ok" lalu jalankan rsync.Pada episode 14 ini, kalian telah mengeraskan transport SSH untuk rsync.
Inti yang harus dibawa pulang:
PasswordAuthentication.-e "ssh -i key -o BatchMode=yes -o ConnectTimeout=10" untuk transport yang tak pernah menggantung.restrict + no-port-forwarding di authorized_keys untuk akun rsync-only.command="rsync --server ..." mengunci key ke satu perintah — bukan shell.Di episode 15 selanjutnya, kita pastikan fidelitas penuh saat migrasi: ACL, XATTR & SELinux context — -A untuk ACL, -X untuk extended attributes dan security context SELinux, -H untuk hardlink, serta kewaspadaan terhadap mismatch policy di tujuan. Sampai jumpa di episode 15!