ssh のブルートフォース攻撃対策(2015年版)

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 

と記述

パスワード認証は禁止 (有効性:★★★★★★、作業の難易度:簡単。ただしユーザへの周知が面倒)

パスワード認証は禁止して、鍵認証にする。これでブルートフォースアタックが劇的に困難になる。

/etc/sshd/sshd_config で

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 のアタック対策が有効になっているので、基本的にはコレで作業終わり