DenyHosts で ssh ブルートフォースアタック対策
- Web Site
- http://denyhosts.sourceforge.net/
sshd のログファイル(/var/log/secure など)を定期的に読み込み、sshd の認証に失敗した回数がしきい値(設定した回数)をこえると、/etc/hosts.deny にアクセス拒否の設定を書き込む Python スクリプト。
目次 |
Mac OS X 10.3/10.4 にインストールする
python 2.3 以上が必要(Mac OS X インストール済み)
ソースコード からインストールする
- ソースコードを解凍・展開しインストール
- 設定ファイル denyhosts.cfg を Mac OS X 用に編集
- daemon-control を Mac OS X 用に編集
- Mac OS X には、デフォルトで /etc/host.deny /etc/hosts.allow ファイルがないので作っておく
[shell]$ tar xzf DenyHosts-2.6.tar.gz [shell]$ cd DenyHosts-2.6 [shell]$ sudo python setup.py install
/usr/share/denyhosts/ に、denyhosts.cfg-dist(設定ファイル)と daemon-control-dist(DenyHosts をデーモンとして動作させるスクリプト)がインストールされる。
denyhosts.cfg-dist を denyhosts.cfg という名前にコピーして使う。
denyhosts.cfg に Mac OS X の設定例が書かれているが、それとは違う設定にする。 |
SECURE_LOG = /var/log/system.log ← Mac OS X 10.3 の場合 SECURE_LOG = /var/log/secure.log ← Mac OS X 10.4 の場合 LOCK_FILE = /var/run/denyhosts.pid ← Mac OS X 10.3/10.4 共通 DAEMON_LOG = /var/log/denyhosts.log ← Mac OS X 10.3/10.4 共通
daemon-control-dist を daemon-control という名前にコピーして使う。
DENYHOSTS_BIN = "/System/Library/Frameworks/Python.framework/Versions/2.3/bin/denyhosts.py" DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
[shell]$ sudo touch /etc/{hosts.deny,hosts.allow}
インストール完了。
デーモンとして起動
[shell]$ sudo /usr/share/denyhosts/daemon-control start
ログが大きいと少し時間がかかるかもしれない。
ログの読み込みが完了すると、デーモンとして起動したままになる。
読み込まれ、解析されたデータは、/usr/share/denyhosts/data/ ディレクトリ内に保存される。
/var/log/denyhosts.log で動作確認
denyhosts.log の内容はこんな感じ。
2007-06-02 14:46:53,749 - denyhosts : INFO DenyHosts launched with the following args: 2007-06-02 14:46:53,751 - denyhosts : INFO /System/Library/Frameworks/Python.framework/Versions/2.3/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg 2007-06-02 14:46:53,752 - prefs : INFO DenyHosts configuration settings: 省略
すでに、ブルートフォースアタックがあった場合は、次のように記録される。
2007-06-04 18:09:52,474 - denyhosts : INFO new denied hosts: ['219.232.237.39']
そして、/etc/hosts.deny に次のような記述が追加され、sshd への接続を拒否するようになる。
sshd: 219.232.237.39
denyhosts.cfg の設定例
# DenyHostsが読み込むログファイルを指定 SECURE_LOG = /var/log/secure.log # hosts.deny ファイルを指定 HOSTS_DENY = /etc/hosts.deny # 拒否するホストを /etc/hosts.deny に登録しておく時間を指定する。(指定した時間を過ぎると、hosts.deny から削除される。) # 空白の場合は、ずっと登録したままにになる。 PURGE_DENY = 3h # 拒否するホストを /etc/hosts.deny から削除する最大回数を指定する。 # この回数を超えると、/etc/hosts.deny に登録されたままになる。 # デフォルト 0 PURGE_THRESHOLD = 2 # hosts.deny に登録するサービス名 BLOCK_SERVICE = sshd # この回数より多くログインに失敗したホストをブロックする。存在しないユーザに適用。 DENY_THRESHOLD_INVALID = 2 # この回数より多くログインに失敗したホストをブロックする。存在するユーザに適用。root は除く。 DENY_THRESHOLD_VALID = 2 # この回数より多くログインに失敗したホストをブロックする。root のみ。 DENY_THRESHOLD_ROOT = 1 # この回数より多くログインに失敗したホストをブロックする。WORK_DIR/restricted-usernames ファイルに書かれている username のみ。 DENY_THRESHOLD_RESTRICTED = 1 WORK_DIR = /usr/share/denyhosts/data # YES に設定している場合、許可されたホストからの疑わしいログインを、疑わしいログインとしてレポートする。 # NO に設定している場合、レポートしない。許可されたホストでない疑わしいログインは、全てレポートする。 SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES HOSTNAME_LOOKUP=NO # Lock ファイルを指定する。 LOCK_FILE = /var/run/denyhosts.pid ############ THESE SETTINGS ARE OPTIONAL ############ ADMIN_EMAIL = SMTP_HOST = SMTP_PORT = 25 SMTP_FROM = DenyHosts <nobody@localhost> SMTP_SUBJECT = DenyHosts Report AGE_RESET_VALID=5d AGE_RESET_ROOT=25d AGE_RESET_RESTRICTED=25d AGE_RESET_INVALID=10d ######### THESE SETTINGS ARE SPECIFIC TO DAEMON MODE ########## # DenyHosts の動作ログ DAEMON_LOG = /var/log/denyhosts.log DAEMON_SLEEP = 30s DAEMON_PURGE = 1h ######### THESE SETTINGS ARE SPECIFIC TO ########## ######### DAEMON SYNCHRONIZATION ##########
起動スクリプト (StartupItems)
/Library/StartupItems/DenyHosts/DenyHosts
#!/bin/sh . /etc/rc.common StartService () { if [ "${DenyHosts:=-NO-}" = "-YES-" ] ; then ConsoleMessage "Starting DenyHosts" /usr/share/denyhosts/daemon-control start >/dev/null 2>&1 fi } StopService () { if [ "${DenyHosts:=-NO-}" = "-YES-" ] ; then ConsoleMessage "Stopping DenyHosts" /usr/share/denyhosts/daemon-control stop >/dev/null 2>&1 fi } RestartService () { if [ "${DenyHosts:=-NO-}" = "-YES-" ] ; then ConsoleMessage "Starting DenyHosts" /usr/share/denyhosts/daemon-control restart >/dev/null 2>&1 fi } RunService "$1"
/Library/StartupItems/DenyHosts/StartupParameters.plist
{ Description = "DenyHosts"; OrderPreference = "Last"; Messages = { start = "Starting DenyHosts"; stop = "Stopping DenyHosts"; }; }
/etc/hostconfig に DenyHosts=-YES- を追加
起動スクリプト (LaunchDaemons)
/Library/LaunchDaemons/DenyHosts.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Disabled</key> <false/> <key>Label</key> <string>DenyHosts</string> <key>OnDemand</key> <false/> <key>ProgramArguments</key> <array> <string>/usr/share/denyhosts/daemon-control</string> <string>start</string> </array> </dict> </plist>
Scientific Linux 6 (RHEL 6) にインストール
epel (Extra Packages for Enterprise Linux) リポジトリでインストールすると楽。
yum install denyhosts
主にインストールされるファイル
/etc/cron.d/denyhosts /etc/denyhosts.conf /etc/logrotate.d/denyhosts /etc/rc.d/init.d/denyhosts /etc/sysconfig/denyhosts /usr/bin/denyhosts-control /usr/bin/denyhosts.py /usr/lib/python2.6/site-packages/DenyHosts/ /usr/share/denyhosts/ /usr/share/doc/denyhosts-2.6/ /var/lib/denyhosts/
パッケージインストール後のデフォルト設定のままで特に問題ないので、起動するだけ。
/etc/init.d/denyhosts start chkconfig denyhosts on
デフォルト設定(/etc/sysconfig/denyhosts)
[表示する]デフォルト設定(/etc/denyhosts.conf)
[表示する]ホワイトリスト (Whitelist)
常に許可するホストのリスト。
- /etc/hosts.allow に、常に許可するアドレスを書いておく。
- DenyHosts により hosts.deny に登録されてしまっても hosts.allow にリストされたアドレスは常に許可される。
/etc/hosts.allow の例
IPアドレス 192.168.1.0〜192.168.1.254 のホストからの sshd への接続を常に許可する。
sshd: 192.168.1.
logrotate している場合どうなるのか
ログを読み込み終わると、data/offset にログの読み込み済みの位置を書き込んで、次回はその位置以降から読み込むようにしている。 ローテートされるログでも問題なく動作する。
2007-06-04 03:15:12,442 - denyhosts : INFO /var/log/system.log has been rotated
ログの読み込みパターン
regex.py に書かれている。
regex.py を [表示する]追加するときは、denyhosts.cfg に SSHD_FORMAT_REGEX = で追加することもできる。