SSH Security

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 no ke 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 no dan PermitRootLogin no sebagai langkah hardening paling mendasar — tapi pastikan SSH key sudah terdistribusi sebelumnya.
  • Gunakan AllowUsers untuk 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 3 dan fail2ban untuk 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 →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact