DenyHosts で ssh ブルートフォースアタック対策

提供:maruko2 Note.
移動: 案内, 検索
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-2.6.tar.gz

  1. ソースコードを解凍・展開しインストール
  2. [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 をデーモンとして動作させるスクリプト)がインストールされる。

  3. 設定ファイル denyhosts.cfg を Mac OS X 用に編集
  4. 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 共通
    
  5. daemon-control を Mac OS X 用に編集
  6. daemon-control-dist を daemon-control という名前にコピーして使う。

    DENYHOSTS_BIN = "/System/Library/Frameworks/Python.framework/Versions/2.3/bin/denyhosts.py"
    DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
    
  7. Mac OS X には、デフォルトで /etc/host.deny /etc/hosts.allow ファイルがないので作っておく
  8. [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 の例

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 = で追加することもできる。

参考ページ

LINEで送る このエントリーをはてなブックマークに追加
個人用ツール
名前空間
変種
表示
操作
案内
ツールボックス

注目のページ

このサイトのはてなブックマーク数