Posted by & filed under server.


今年最後のエントリは今更感のある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 = foo@example.com

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