ssh のブルートフォースアタック(=総当り攻撃、Brute Force Attack)対策を調べたので、メモ。
特定のユーザのみssh接続を許可 (有効性:★、作業の難易度:簡単)
/etc/sshd/sshd_config に以下の行を書くと、それ以外のユーザは ssh でログインできなくなる
AllowUsers ユーザ名1 ユーザ名2
似た機能に AllowGroups もある
特定のIPアドレスからのみ接続を許可 (有効性:★★★、作業の難易度:簡単)
/etc/hosts.allow に、許可する接続元を書く。
sshd : 192.168.1. sshd : 10.1.2.3 sshd : .example.com
接続元は、ネットワークアドレス、IPアドレス、ドメイン名が使える
/etc/hosts.deny には、一行だけ
ALL:ALL
と記述
パスワード認証は禁止 (有効性:★★★★★★、作業の難易度:簡単。ただしユーザへの周知が面倒)
パスワード認証は禁止して、鍵認証にする。これでブルートフォースアタックが劇的に困難になる。
PasswordAuthentication no
iptableの recent を使う (有効性:★★、作業の難易度:面倒。iptableの設定がわかる人なら簡単)
短時間に大量の接続があると、しばらくの間は接続を遮断する、という設定を行う。
ただし iptablesで設定するので、設定は少々面倒
debian の場合は、まず /etc/iptables.test.rules というファイルを用意して、以下の内容を記述
# Allows SSH with blueforce attacks protection -N SSH_CHECK -A INPUT -p tcp -m state --state NEW --dport 22 -j SSH_CHECK -A SSH_CHECK -m recent --set --name SSH -A SSH_CHECK -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT COMMIT
この例だと、60秒間に4回以上接続があると、その接続元IPからの通信をしばらく遮断する。
設定を iptable に反映させるには root アカウントで
# iptables-restore < /etc/iptables.test.rules
うまく制限できたら、現在のiptablesの設定をファイルに保存しておく
# iptables-save > /etc/iptables.up.rules
この設定が、起動時に自動で反映されるようにするには /etc/network/if-pre-up.d/iptables というファイルを作成して、中身に以下を記述
#/bin/sh /sbin/iptables-restore < /etc/iptables.up.rules
$ sudo chmod +x /etc/network/ip-pre-up.d/iptables
fail2banを使う (有効性:★★、作業の難易度:面倒。知っておくと便利)
fail2ban を使うと、以下の処理が自動的に行われるようになる。
- /var/log 以下のログファイルを監視
- 大量アクセスがあったら、その接続元を弾くrule をiptables に自動追加
sshだけでなく、他のサービスにも使えるので、知っておくと何かと便利。
$ sudo apt-get install fail2ban
設定ファイルを用意
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
動作レポートがメールで届くので管理者のメールアドレスを設定しておく
$ sudo vi /etc/fail2ban/jail.local
自動起動するように設定。
$ sudo systemctl enable fail2ban
デフォルトで ssh のアタック対策が有効になっているので、基本的にはコレで作業終わり