denyhostsとは
「denyhosts」は不正ログインの形跡をチェックして、該当する接続元のIPアドレスを「/etc/hosts.deny」に自動的に登録して、接続を自動的に遮断してくれます。
今回はCentOS7の環境に「denyhosts」を使ってSSHへの不正アタック対策を行う手順を説明していきます。
インストール
「yum」を使ってインストールすることが出来るのですが、その際EPELリポジトリを使用するのでEPELリポジトリを追加して使用できるように設定しておく必要があります。
EPELリポジトリ追加
「EPEL」リポジトリの追加はとても簡単です。
# yum -y install epel-release
「EPEL」リポジトリの追加直後は自動的にリポジトリを使用するように設定されているため、明示的に指定しなければ使用できないよう設定をしておきます。
# cp -p /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo_yyyymmdd # vi /etc/yum.repos.d/epel.repo
変更箇所は下記通りとなります。
変更前 enabled=1 変更後 enabled=0
※詳しい手順はこちらのページで解説してあります。
denyhostsインストール
準備が出来たら「yum」で「denyhosts」のインストールを行います。
# yum --enablerepo=epel install denyhosts
設定
「denyhosts」の設定ファイルは「/etc/denyhosts.conf」となりますので、このファイルを編集して設定を行っていきます。
# cp -p /etc/denyhosts.conf /etc/denyhosts.conf_yyyymmdd # vi /etc/denyhosts.conf
色々な設定があるのですが、今回はとりあえず基本的な設定として下記項目を編集していきます。
項目 | 設定内容 |
---|---|
PURGE_DENY | 接続拒否時間の設定 |
PURGE_THRESHOLD | 接続拒否自動解除回数 |
BLOCK_SERVICE | 接続拒否をするサービス |
DENY_THRESHOLD_INVALID | サーバに存在しないユーザでのログイン失敗の監視 |
DENY_THRESHOLD_VALID | サーバに存在するユーザでのログイン失敗の監視 |
DENY_THRESHOLD_ROOT root | ユーザでのログイン失敗の監視 |
ADMIN_EMAIL | メール通知設定 |
SMTP_HOST | メールサーバホスト設定 |
SMTP_PORT | メールサーバポート番号設定 |
SMTP_FROM | メールの差出人設定 |
SMTP_SUBJECT | メールタイトル設定 |
DAEMON_SLEEP | denyhostsデーモン接続遮断を判断する間隔 |
DAEMON_PURGE | denyhostsデーモンが遮断解除のチェックを行う間隔 |
※メール通知を行わないのであればメール関連の設定は必要ありません。
PURGE_DENY
接続を遮断する期間の設定を行います。期間は「数字」+「単位」で設定できます。
- m (分)
- h (時間)
- d (日)
- w (週)
- y (年)
「CentOS7」のデフォルト設定は4週間(4w)となっていましたが、自分で制限に引っかかったときに悲しい思いをするので、今回は1時間で解除されるように変更しました。
PURGE_DENY = 1h
下記のように時間を指定しなかった場合は、永久に自動解除されませんのでご注意を…
PURGE_DENY =
PURGE_THRESHOLD
接続拒否の設定を自動的に解除する回数を設定します。
初期設定では「0」に設定されていて自動解除の回数に制限はなく、何度でも「PURGE_DENY」で設定した期間が経過すると接続拒否の設定を解除してくれます。
何度も攻撃を受けるのは嫌なので、接続拒否の自動解除は2回までとしそれ以後は自動的に接続遮断の解除を行わないように設定します。
PURGE_THRESHOLD = 2
この回数を超えた場合は別のIPアドレスから接続するかコンソールからログインして、手動で解除する必要があるので注意してください。
BLOCK_SERVICE
接続拒否をするサービスを指定します。
初期設定で「sshd」と設定されているはずなので確認しておいてください。
BLOCK_SERVICE = sshd
DENY_THRESHOLD_INVALID
サーバに存在しないユーザでログインした場合に接続を拒否するまでの回数を設定します。
初期設定が5回だったのでそのままにしておきます。
DENY_THRESHOLD_INVALID = 5
DENY_THRESHOLD_VALID
サーバに存在しているユーザでログインを失敗した場合に接続を拒否するまでの回数を設定します。
初期設定は10回と回数が多めなので、今回は5回に変更してみます。
DENY_THRESHOLD_VALID = 5
DENY_THRESHOLD_ROOT
rootユーザでログインしようとして失敗した場合に接続を拒否するまでの回数を設定します。
DENY_THRESHOLD_ROOT = 1
ADMIN_EMAIL
メール通知を行うメールアドレスを設定します。
ADMIN_EMAIL = 通知先メールアドレス
複数指定する場合は「,」で区切ってメールアドレスを指定してください。
ADMIN_EMAIL = foo@bar.com, bar@foo.com, etc@foobar.com
ローカルのユーザに送信したい場合はユーザ名を設定します。
SMTP_HOST
メールを送信するために使用するSMTPサーバの設定を行います。
初期設定では自サーバ(localhost)に設定されています。
SMTP_HOST = localhost
SMTP_PORT
SMTPサーバに接続する際に使用するポート番号を設定します。
SMTP_PORT = 25
SMTP_FROM
メール通知を行う際の「From:」欄を設定します。
SMTP_FROM = 送信元メールアドレス
SMTP_SUBJECT
メールの件名(Subject)を設定します。
特にこだわりが無ければそのままで良いでしょう
SMTP_SUBJECT = DenyHosts Report from $[HOSTNAME]
DAEMON_SLEEP
通信を遮断するかどうかチェックする間隔を設定します。
初期設定は「30s」(30秒)に設定されているので、たとえば「DENY_THRESHOLD_VALID = 5」とかのルールに該当した場合でも即時遮断されるのではなく、次回のチェック時に通信が遮断されるということです。
DAEMON_SLEEP = 30s
DAEMON_PURGE
遮断解除のチェックを行う間隔を設定します。
ここで設定されている間隔で自動解除を行うか確認するため、「DAEMON_PURGE = 1h」(1時間)と設定されている場合は「PURGE_DENY = 10m」(10分)と設定されている場合でも1時間ごとにしかチェックを行わないため、最大1時間ほど解除までの時間がかかることもあるため、この項目は「PURGE_DENY」と同じか短い値を設定しておいたほうが良いでしょう。
今回はチェックの間隔を5分に設定しておきます。
DAEMON_PURGE = 5m
denyhosts起動
設定が終わりましたら「denyhosts」を起動させましょう。
CentOS7の場合
# systemctl start denyhosts
CentOS6までの場合
# /etc/init.d/denyhosts start
自動起動設定
自動起動の設定も忘れずに行いましょう。
CentOS7の場合
# systemctl enable denyhosts
CentOS6までの場合
# chkconfig denyhosts on
動作テスト
「denyhosts」を起動しましたら、故意にログインを失敗させて実際に遮断されるかを確認してみましょう。
テストを行う場合は、「PURGE_DENY」「DAEMON_SLEEP」「DAEMON_PURGE」の値を短く設定しておいたほうが、実際の挙動を確認しやすくなるでしょう。
設定を変更した場合は「denyhosts」を再起動して、設定を反映させてください。
テスト時の注意点
SSHでしか接続できないサーバでテストを行う場合は、まずSSHでログインして接続を確保しておいてください。
設定に不具合があった場合、接続遮断が自動的に解除されず最悪SSHでサーバに接続することが出来なくなる可能性がありますが、すでに接続された接続は遮断されないので、そこから手動で接続遮断の設定を解除することが出来ます。
denyhosts解除方法
「denyhosts」によって登録された接続を遮断するIPアドレスの設定を、すぐに手動で解除する方法です。
denyhosts停止
まず最初に「denyhosts」を停止します。
CentOS7の場合
# systemctl stop denyhosts
CentOS6までの場合
# /etc/init.d/denyhosts stop
IPアドレス削除
下記のファイルから対象のIPアドレスを削除します。
- /etc/hosts.deny
- /var/lib/denyhosts/hosts
- /var/lib/denyhosts/hosts-restricted
- /var/lib/denyhosts/hosts-root
- /var/lib/denyhosts/hosts-valid
- /var/lib/denyhosts/users-valid
※「/var/lib/denyhosts」の部分は「/etc/denyhosts.conf」の「WORK_DIR」で設定されているディレクトリとなります。(初期設定では「/var/lib/denyhosts」)
denyhosts起動
IPアドレスの削除が終わったら、「denyhosts」を起動します。
CentOS7の場合
# systemctl start denyhosts
CentOS6までの場合
# /etc/init.d/denyhosts start
その後、接続可能になっているか実際に確認を行ってください。
コメント