今年最後のエントリは今更感のあるsshのセキュリティについて.
最近になって,とあるIPから頻繁にsshへユーザ名を変えながらのアクセスがあるようになり,連日auth.logがそのログで埋まってしまうようになりました.
このまま放置しておくとログ確認するのも面倒だし,何より不安なので,今更ながらsshのセキュリティ強化をすることにしました.
今回導入するのは,denyhostsというツールで,これはauth.logを監視し,設定した回数ログインに失敗すると,そのホストを自動的にdenyホストとして登録し,以降の接続を拒否してくれます.
導入はportsから
$ sudo portmaster security/denyhosts
設定ファイルは,/usr/local/etc/denyhosts.conf
です.
# ログインログファイル SECURE_LOG = /var/log/auth.log # denyホストを登録するファイル名 HOSTS_DENY = /etc/hosts.deniedssh # 登録したdenyホストの有効期限 PURGE_DENY = 1d # denyホスト登録解除の制限回数 PURGE_THRESHOLD = 1 # deny登録するサービス名 BLOCK_SERVICE = sshd # 登録のないユーザの認証試行許可回数 DENY_THRESHOLD_INVALID = 3 # 登録のあるユーザの認証試行許可回数 DENY_THRESHOLD_VALID = 3 # rootの認証試行許可回数 DENY_THRESHOLD_ROOT = 1 # ホスト名を解決するかどうか HOSTNAME_LOOKUP=NO # ログファイルの送信先 ADMIN_EMAIL = [email protected]
HOSTS_DENY
で指定したファイルが存在していない場合は事前に作っておいてやります.でないと起動時にエラーが出ます.
# touch /etc/hosts.deniedssh
denyhostsによって登録されるdenyホストは,このファイルに記録されていくことになります.
このファイルを読み込むように/etc/hosts.allow
を書き換えてやる必要があります.
sshd : 10.0.0.0/255.255.255.0 : allow sshd : /etc/hosts.deniedssh : deny sshd : ALL : allow
ローカルだけは,何かの間違いでdenyホストに登録されてしまっても大丈夫なようにしてあります.
FreeBSD標準のhosts.allow
の場合,一番頭に
ALL : ALL : allow
の記述があります.
hosts.allow
は上から順に評価していき,マッチした段階で評価が終わってしまうのでこのままでは結局すべてのホストが許可されることになります.
そこで,この行をコメントアウトしてやる必要があります.
さらに,その少し下に以下のような行もあります.
ALL : PARANOID : RFC931 20 : deny
これは,DNS spoofing攻撃に対する対策のようで,DNSの正引き結果と逆引き結果が一致しないホストをすべてブロックします.
が,現在ではそのようなホストは珍しくなく,正規のユーザまで弾いてしまうようになってしまうためこの行もコメントアウトしました.
/etc/rc.conf
にdenyhostsを登録して設定はおしまいです.
denyhosts_enable="YES"
$ sudo service denyhosts start