Kodeloka
  1. Kodeloka
  2. Kelas Linux & Shell
  3. Materi

5 · Operasi · Modul 8 dari 8

SSH, Transfer Berkas & Akses Aman

Autentikasi berbasis kunci, konfigurasi klien yang menghemat waktu, terowongan port, dan pengerasan server SSH.

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'
🚫 Izin berkas yang salah membuat SSH menolak kunci
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 lama

Dulu 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
⚠️ Garis miring di akhir path sumber sangat berarti
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
🚫 Jangan tutup sesi lama sebelum menguji yang baru

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
📌 Selalu pakai tmux untuk pekerjaan panjang

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.