Block SSH Brute Force Attack SSHGuard
Block SSH Brute Force Attack SSHGuard

Block SSH Brute Force Attack dengan SSHGuard

Server yang terhubung ke internet publik adalah magnet bagi upaya brute force attack SSH. Serangan ini biasanya berupa percobaan login berulang-ulang dengan kombinasi username dan password acak oleh bot otomatis.

Jika tidak diblokir, aktivitas ini tidak hanya berisiko membobol akun dengan password lemah, tetapi juga membebani resource server.

Untuk mengatasinya, SSHGuard hadir sebagai solusi ringan dan sederhana yang memblokir IP penyerang secara otomatis melalui log sistem.

Debian/ Ubuntu

Install SSHGuard

Update package terlebih untuk memperbarui repository, lalu install package SSHGuard

sudo apt update
sudo apt install sshguard -y

Start dan Enable Service SSHGuard

sudo systemctl enable --now sshguard
sudo systemctl status sshguard
Status Service SSHGuard Ubuntu
Status Service SSHGuard Ubuntu

Configuration SSHGuard

sudo nano /etc/sshguard/sshguard.conf

Isi configuration file sshguard.conf

BACKEND="/usr/libexec/sshguard/sshg-fw-iptables"
LOGREADER="LANG=C journalctl -afb -p info -n1 -t sshd -o cat"
THRESHOLD=3
BLOCK_TIME=120
DETECTION_TIME=1800
WHITELIST_FILE=/etc/sshguard/whitelist

Keterangan:

  • Backend : Menggunakan iptables sebagai backend firewall untuk memblokir IP
  • LOGREADER : Membaca log SSH secara real-time dari journalctl.
  • THRESHOLD : 3 kali percobaan gagal login, lalu IP langsung diblokir.
  • BLOCK_TIME : IP diblokir selama 120 detik (2 menit) saja. Ini adalah waktu pemblokiran yang singkat.
  • DETECTION_TIME : Pemantauan 1800 detik (30 menit). Jika dalam 30 menit ada 3 percobaan gagal, IP diblokir.

Configuration Firewall

netfilter/iptables

Configuration firewall dengan bash script

IPv4

#!/bin/bash
clear

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -p tcp --dport NOMOR_PORT_SSH -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -j sshguard
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo netfilter-persistent save
sudo netfilter-persistent reload
sudo iptables -L

IPv6

#!/bin/bash
clear

sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -s ::1/128 -j ACCEPT
sudo ip6tables -A INPUT -p icmp -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 51234 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -j sshguard
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo netfilter-persistent save
sudo netfilter-persistent reload
sudo ip6tables -L

Jika firewall digabungkan dengan cloudflare dan menggunakan file bash script untuk configuration.

IPv4

#!/bin/bash
clear

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -p tcp --dport NOMOR_PORT_SSH -j ACCEPT
sudo iptables -A INPUT -j sshguard
for cfip in `curl https://www.cloudflare.com/ips-v4/`; do sudo iptables -A INPU>
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo netfilter-persistent save
sudo netfilter-persistent reload
sudo iptables -L

IPv6

#!/bin/bash
clear

sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -s ::1/128 -j ACCEPT
sudo ip6tables -A INPUT -p icmp -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport NOMOR_PORT_SSH -j ACCEPT
sudo iptables -A INPUT -j sshguard
for cfip in `curl https://www.cloudflare.com/ips-v6/`; do sudo ip6tables -A INPUT -s $cfip -m comment --comment 'Cloudflare IP' -j ACCEPT; done
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo netfilter-persistent save
sudo netfilter-persistent reload
sudo ip6tables -L

Bash script clear rule configuration firewall

#!/bin/bash
clear

sudo iptables -P INPUT ACCEPT
sudo ip6tables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo ip6tables -P FORWARD ACCEPT
sudo iptables -F
sudo ip6tables -F
sudo netfilter-persistent save
sudo netfilter-persistent reload
echo "========================="
echo "RULES IPTABLES IPv4"
echo "========================="
sudo iptables -L
echo ""
echo "========================="
echo "RULES IPTABLES IPv6"
echo "========================="
sudo ip6tables -L

Setelah melakukan configuration, lakukan restart service SSHGuard.

sudo systemctl restart sshguard

Pengujian

Untuk melakukan pengujian SSHGuard lakukan login ssh dengan username dan password yang berbeda sebanyak 3 kali. Ketika sudah mencapai THRESHOLD secara otomatis sumber ip public terblokir selama 120 detik atau 2 menit.

sudo journalctl -af -u sshguard
Monitoring Log SSHGuard
Monitoring Log SSHGuard
sudo tail -f /var/log/auth.log | grep ssh
Monitoring Log Auth
Monitoring Log Auth