server-memo.net

denyhostsでSSHの不正アタック対策

   

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

その後、接続可能になっているか実際に確認を行ってください。

 - SSH