SSH Security #
SSH adalah pintu masuk Ansible ke semua managed node. Jika SSH tidak dikonfigurasi dengan benar, semua enkripsi Vault dan kontrol akses yang kamu bangun bisa dilewati begitu saja. Mengotomasi hardening SSH dengan Ansible justru sangat tepat — kamu bisa memastikan konfigurasi yang konsisten di semua server, dan setiap perubahan terdokumentasi dalam playbook.
Konfigurasi sshd_config yang Aman #
Berikut konfigurasi SSH dasar yang direkomendasikan untuk server production:
# roles/ssh-hardening/tasks/main.yml
- name: Konfigurasi SSH hardening
blockinfile:
path: /etc/ssh/sshd_config
marker: "# {mark} ANSIBLE MANAGED — SSH Hardening"
block: |
# Nonaktifkan login root via SSH
PermitRootLogin no
# Nonaktifkan autentikasi dengan password — hanya key-based
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
# Batasi jumlah percobaan autentikasi
MaxAuthTries 3
# Timeout untuk koneksi yang tidak aktif
ClientAliveInterval 300
ClientAliveCountMax 2
# Nonaktifkan X11 forwarding jika tidak diperlukan
X11Forwarding no
# Nonaktifkan TCP forwarding jika tidak diperlukan
AllowTcpForwarding no
# Gunakan hanya algoritma kriptografi yang kuat
KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256
Ciphers [email protected],[email protected]
MACs hmac-sha2-256,hmac-sha2-512
notify: Restart SSH
Sebelum menerapkan
PasswordAuthentication noke production, pastikan semua user yang perlu akses sudah punya SSH key yang valid dan terdistribusi. Konfigurasi ini tidak bisa di-revert jika kamu terkunci keluar dari server!Selalu test di staging dulu, dan pastikan ada akses alternatif (console cloud atau out-of-band access) sebelum menerapkan ke production.
Membatasi Akses SSH Berdasarkan User #
Batasi user mana saja yang diizinkan login via SSH:
- name: Batasi akses SSH hanya untuk user tertentu
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?AllowUsers'
line: "AllowUsers {{ ssh_allowed_users | join(' ') }}"
notify: Restart SSH
# group_vars/all.yml
ssh_allowed_users:
- deployer
- ansible-deploy
- alice
- bob
# Semua user lain — termasuk root — tidak bisa login via SSH
SSH Key Management: Ed25519 atas RSA #
Algoritma Ed25519 lebih aman dan lebih cepat dibandingkan RSA 2048:
# Pastikan semua user menggunakan Ed25519, bukan RSA lama
- name: Buat SSH keypair Ed25519 untuk deployment
openssh_keypair:
path: /home/deployer/.ssh/id_ed25519
type: ed25519
owner: deployer
group: deployer
mode: '0600'
state: present
# Hapus key RSA lama jika masih ada
- name: Hapus key RSA lama
file:
path: "{{ item }}"
state: absent
loop:
- /home/deployer/.ssh/id_rsa
- /home/deployer/.ssh/id_rsa.pub
Membatasi Akses Berdasarkan IP (AllowFrom) #
Untuk server yang sangat sensitif, batasi dari IP mana SSH bisa diakses menggunakan hosts.allow (TCP Wrappers) atau firewall:
- name: Konfigurasi TCP Wrappers untuk membatasi akses SSH
blockinfile:
path: /etc/hosts.allow
marker: "# {mark} ANSIBLE MANAGED — SSH Access"
block: |
# Hanya izinkan SSH dari IP/range tertentu
sshd: 10.0.0.0/8 # Internal network
sshd: 203.0.113.10 # IP bastion host
notify: Reload TCP Wrappers
- name: Tolak semua SSH dari IP lain
lineinfile:
path: /etc/hosts.deny
line: "sshd: ALL"
state: present
Monitoring Percobaan Login Gagal #
- name: Install fail2ban untuk proteksi brute force
apt:
name: fail2ban
state: present
- name: Konfigurasi fail2ban untuk SSH
template:
src: jail.local.j2
dest: /etc/fail2ban/jail.local
notify: Restart fail2ban
{# templates/jail.local.j2 #}
[DEFAULT]
bantime = 3600 # Ban selama 1 jam
findtime = 600 # Window 10 menit
maxretry = 3 # Maksimal 3 percobaan gagal
[sshd]
enabled = true
port = {{ ssh_port | default(22) }}
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Audit Koneksi SSH Aktif #
- name: Cek koneksi SSH yang sedang aktif
command: ss -tnp | grep :22
register: active_ssh
changed_when: false
- name: Tampilkan koneksi SSH aktif
debug:
var: active_ssh.stdout_lines
# Dengan module setup — lihat semua proses SSH
- name: Kumpulkan informasi sesi SSH aktif
command: who
register: active_sessions
changed_when: false
Ringkasan #
- Nonaktifkan
PasswordAuthentication nodanPermitRootLogin nosebagai langkah hardening paling mendasar — tapi pastikan SSH key sudah terdistribusi sebelumnya.- Gunakan
AllowUsersuntuk membatasi siapa saja yang bisa login via SSH — prinsip least privilege di level transport.- Gunakan Ed25519 bukan RSA untuk SSH key — lebih kuat secara kriptografi dan lebih cepat.
MaxAuthTries 3danfail2banuntuk melindungi dari brute force attack.- Batasi akses berdasarkan IP menggunakan TCP Wrappers atau firewall untuk server yang sangat sensitif.
- Selalu test di staging sebelum menerapkan hardening SSH ke production — kesalahan konfigurasi bisa mengunci kamu keluar dari server.
← Sebelumnya: Secret Management Berikutnya: Common Mistake →