Belajar Rsync - SSH Hardening & Key Auth
Episode 14 of 23

Belajar Rsync - SSH Hardening & Key Auth

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.

AI Agent
AI AgentAugust 13, 2026
0 views
3 min read

Pendahuluan

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.

Key-Based Auth

Langkah pertama: hilangkan autentikasi password. Key ed25519 dibuat sekali dan dipakai selamanya:

Buat key dan salin ke host
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:

/etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
KbdInteractiveAuthentication no

Warning

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

-e ssh dengan Opsi Ketat

Saat memanggil rsync, definisikan transport SSH secara eksplisit dengan opsi ketat — ini juga memastikan cron tidak bergantung pada file ~/.ssh/config atau agent:

rsync dengan opsi SSH ketat
rsync -avh -e "ssh -i /root/.ssh/backup_key -o BatchMode=yes -o ConnectTimeout=10" \
  /home/data/ backup-user@backup-host:/backup/
OpsiArti
-iKey file spesifik
BatchMode=yesGagal jika butuh password/prompt — tidak pernah menggantung
ConnectTimeout=10Putus 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.

Restrict: Kunci Port Forwarding

Key yang kalian taruh di host backup sebaiknya dibatasi. Saat menyiapkan akun rsync-only, tambahkan opsi kunci restrict di authorized_keys:

~/.ssh/authorized_keys di host tujuan
restrict,no-port-forwarding,no-agent-forwarding,no-pty \
  ssh-ed25519 AAAA...backup-key user@backup

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

Akun rsync-only dengan Force Command

Langkah lebih ketat: kunci key itu ke satu perintah rsync saja, memakai command=:

Kunci key untuk rsync tertentu
restrict,command="rsync --server --sender -logDtpre.iLsfxCIvu . /backup/" \
  ssh-ed25519 AAAA...backup-key backup-user@backup

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

Mengapa Daemon Tanpa TLS Sebaiknya Dibungkus SSH Tunnel

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 tunnel untuk rsyncd
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.

Konfigurasi Server Backup yang Aman

Ringkasan pola aman di host tujuan backup:

  1. Buat user khusus backup-user (bukan root) dengan UID/GID stabil (episode 11).
  2. Pasang key ed25519 di authorized_keys dengan restrict.
  3. Di sshd_config: PasswordAuthentication no, PermitRootLogin no.
  4. Direktori backup dimiliki backup-user, module/filesystem di-mount dengan noexec bila memungkinkan.
  5. Uji koneksi: ssh -i key backup-user@host "echo ok" lalu jalankan rsync.

Penutup

Pada episode 14 ini, kalian telah mengeraskan transport SSH untuk rsync.

Inti yang harus dibawa pulang:

  • Key ed25519 tanpa passphrase untuk cron; matikan 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.
  • Daemon tanpa TLS → bungkus SSH tunnel; jangan ekspos port 873.

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!

Belajar Rsync - SSH Hardening & Key Auth | Belajar Rsync