Ubuntu14.04でFail2Banを使用してSSHを保護する方法
序章
SSHを介したサーバーへの接続は非常に安全ですが、SSHデーモン自体は、正しく機能するためにインターネットに公開する必要があるサービスです。 これにはいくつかの固有のリスクが伴い、加害者になる可能性のある人に攻撃のベクトルを作成します。
ネットワークに公開されているサービスはすべて、このように潜在的なターゲットになります。 これらのサービスのアプリケーションログに注意を払うと、ユーザーとボットによるブルートフォース攻撃を表す、体系的なログイン試行が繰り返されることがよくあります。
fail2ban と呼ばれるサービスは、事前定義された失敗したログイン試行回数に基づいてiptables
ファイアウォール構成を自動的に変更できるルールを作成することにより、この問題を軽減できます。 これにより、サーバーはユーザーの介入なしに不正なアクセスの試みに応答できるようになります。
このガイドでは、Ubuntu14.04サーバーにfail2banをインストールして使用する方法について説明します。
Ubuntu14.04にFail2Banをインストールします
Ubuntuパッケージングチームがデフォルトのリポジトリにパッケージを保持しているため、このツールのインストールプロセスは簡単です。
まず、ローカルパッケージインデックスを更新する必要があります。次に、apt
を使用してパッケージをダウンロードしてインストールできます。
- sudo apt-get update
- sudo apt-get install fail2ban
ご覧のとおり、インストールは簡単です。 これで、自分で使用するためのユーティリティの構成を開始できます。
サービス設定を使用してFail2Banを構成します
fail2banサービスは、その構成ファイルを/etc/fail2ban
ディレクトリーに保持します。 jail.conf
というデフォルトのファイルがあります。
このファイルはパッケージのアップグレードによって変更できるため、このファイルをその場で編集するのではなく、安全に変更できるようにコピーする必要があります。 これらの2つのファイルが正常に連携するためには、オーバーライドする設定のみをjail.local
ファイルに含めるのが最善です。 すべてのデフォルトオプションは、jail.conf
ファイルから取得されます。
jail.local
ファイルにはデフォルトからの逸脱のみを含める必要がありますが、既存のjail.conf
ファイルに基づいてjail.local
ファイルを作成する方が簡単です。 そのため、jail.local
ファイルのベースとして、内容をコメントアウトしたファイルをコピーします。 これを行うには、次のように入力します。
- awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
ファイルがコピーされたら、元のjail.conf
ファイルを開いて、デフォルトでどのように設定されているかを確認できます。
- sudo nano /etc/fail2ban/jail.conf
このファイルには、調整したい設定がいくつかあります。 [DEFAULT]
セクションの下にある設定は、サービス自体のセクションでオーバーライドされない、fail2banが有効になっているすべてのサービスに適用されます。
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8
. . .
ignoreip
設定は、fail2banが無視する送信元アドレスを構成します。 デフォルトでは、ローカルマシンからのトラフィックを禁止しないように構成されています。 jail.local
ファイルにignoreip
設定の[DEFAULT]
セクションを追加することで、無視するアドレスを追加できます。 ディレクティブの最後にスペースで区切ってアドレスを追加することにより、アドレスを追加できます。
[DEFAULT]
. . .
bantime = 600
. . .
bantime
パラメーターは、クライアントが正しく認証に失敗したときにクライアントが禁止される時間を設定します。 これは秒単位で測定されます。 デフォルトでは、これは600秒または10分に設定されています。
[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .
注意したい次の2つのパラメーターは、findtime
とmaxretry
です。 これらは連携して、クライアントが禁止されるべき非合法なユーザーであることが判明する条件を確立します。
maxretry
変数は、クライアントが禁止される前にfindtime
で定義された時間枠内に認証する必要がある試行回数を設定します。 デフォルト設定では、fail2banサービスは、10分以内に3回ログインに失敗したクライアントを禁止します。
[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .
電子メールアラートを構成する場合は、destemail
、sendername
、およびmta
の設定を評価する必要があります。 destemail
パラメーターは、禁止メッセージを受信する必要がある電子メールアドレスを設定します。 sendername
は、電子メールの「差出人」フィールドの値を設定します。 mta
パラメーターは、メールの送信に使用されるメールサービスを構成します。 繰り返しますが、これらをjail.local
ファイルの[DEFAULT]
ヘッダーの下に追加し、調整する場合は適切な値に設定します。
[DEFAULT]
. . .
action = $(action_)s
. . .
このパラメーターは、fail2banが禁止を開始するときに実行するアクションを構成します。 値action_
は、このパラメーターの直前のファイルで定義されています。 デフォルトのアクションは、禁止時間が経過するまで、問題のあるホストからのトラフィックを拒否するようにファイアウォールを構成することです。
電子メールアラートを設定する場合は、action
アイテムをjail.local
ファイルに追加またはコメント解除し、その値をaction_
からaction_mw
に変更します。 電子メールに関連するログ行を含める場合は、action_mwl
に変更できます。 メールアラートを使用する場合は、適切なメール設定が構成されていることを確認してください。
個々の刑務所の設定
最後に、個々のサービスを処理する構成ファイルの部分に到達します。 これらは、[ssh]
などのセクションヘッダーで指定されます。
これらの各セクションは、jail.local
のヘッダーのコメントを解除し、enabled
行を「true」に変更することで有効にできます。
[jail_to_enable]
. . .
enabled = true
. . .
デフォルトでは、SSHサービスは有効になっており、その他はすべて無効になっています。
これらのセクションは、[DEFAULT]
セクションで設定された値をベースとして使用し、必要に応じて変更することで機能します。 値を上書きする場合は、適切なサービスのセクションをjail.local
に追加し、その値を変更することで上書きできます。
ここで設定される他の設定は、ログの行が認証の失敗を示すかどうかを決定するために使用されるfilter
と、その特定のサービスのログがどこにあるかをfail2banに通知するlogpath
です。位置した。
filter
値は、実際には/etc/fail2ban/filter.d
ディレクトリにあるファイルへの参照であり、その.conf
拡張子は削除されています。 これらのファイルには、ログの行が認証試行の失敗であるかどうかを判別する正規表現が含まれています。 これらのファイルはかなり複雑であり、事前定義された設定が適切な行とよく一致しているため、このガイドではこれらのファイルについて詳しく説明しません。
ただし、そのディレクトリを調べると、使用可能なフィルタの種類を確認できます。
- ls /etc/fail2ban/filter.d
使用しているサービスに関連していると思われるファイルが表示された場合は、テキストエディタで開く必要があります。 ほとんどのファイルはかなりよくコメントされており、少なくともスクリプトがどのタイプの状態を防ぐように設計されているかを知ることができるはずです。 これらのフィルターのほとんどは、jail.conf
ファイルに適切な(無効にされた)セクションがあり、必要に応じてjail.local
ファイルで有効にできます。
たとえば、Nginxを使用してWebサイトにサービスを提供していると偽って、パスワードで保護されたサイトの一部がログイン試行で非難されていることに気づきます。 nginx-http-auth.conf
ファイルを使用して、/var/log/nginx/error.log
ファイル内のこの状態をチェックするようにfail2banに指示できます。
これは実際には、/etc/fail2ban/jail.conf
ファイルの[nginx-http-auth]
というセクションですでに設定されています。 jail.local
ファイルのセクションのコメントを解除し、enabled
パラメーターを反転して、サービスを保護する必要があります。
. . .
[nginx-http-auth]
enabled = true
. . .
これを有効にする場合は、fail2banサービスを再起動して、ルールが正しく構築されていることを確認する必要があります。
すべてを一緒に入れて
fail2banの背後にある基本的な考え方を理解したので、基本的なセットアップを実行してみましょう。
上記で説明したように、SSHとNginxの自動禁止ポリシーを構成します。 IPが禁止されたときにfail2banからメールで連絡してもらいたい。
まず、関連するすべてのソフトウェアをインストールしましょう。
まだお持ちでない場合は、ログを監視するため、nginxが必要です。また、通知をメールで送信するにはsendmailが必要です。 また、iptables-persistent
を取得して、サーバーが起動時にファイアウォールルールを自動的に設定できるようにします。 これらはUbuntuのデフォルトリポジトリから取得できます。
- sudo apt-get update
- sudo apt-get install nginx sendmail iptables-persistent
fail2ban
サービスを一時停止して、追加されたルールなしでベースファイアウォールを確立できるようにします。
- sudo service fail2ban stop
ベースファイアウォールを確立する
それが終了したら、デフォルトのファイアウォールを実装する必要があります。 ここでUbuntu14.04でiptablesファイアウォールを構成する方法を学ぶことができます。 このガイドでは、基本的なファイアウォールを作成します。
確立された接続、サーバー自体によって生成されたトラフィック、SSHおよびWebサーバーポート宛てのトラフィックを許可するように指示します。 他のすべてのトラフィックをドロップします。 次のように入力して、この基本的なファイアウォールを設定できます。
- sudo iptables -A INPUT -i lo -j ACCEPT
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
- sudo iptables -A INPUT -j DROP
これらのコマンドは、上記のポリシーを実装します。 次のように入力すると、現在のファイアウォールルールを確認できます。
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
次のように入力することで、ファイアウォールを保存して、再起動後も存続できるようにすることができます。
- sudo dpkg-reconfigure iptables-persistent
その後、fail2ban
を再起動して、ラッピングルールを実装できます。
- sudo service fail2ban start
次のように入力すると、現在のファイアウォールルールを確認できます。
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-ssh -j RETURN
チェーンごとにデフォルトのポリシーがあり、次に確立した5つの基本ルールがあります。 赤で示されているのは、fail2banによってデフォルトの構造が設定されていることです。これは、SSH禁止ポリシーがデフォルトですでに実装されているためです。 fail2ban
は、最初の禁止が実装されるまで構造を追加しない場合があるため、これらは最初に表示される場合と表示されない場合があります。
Fail2ban構成の調整
次に、必要な設定を使用してfail2banを構成する必要があります。 jail.local
ファイルを開きます。
- sudo nano /etc/fail2ban/jail.local
ここで、より厳しい禁止時間を設定できます。 [DEFAULT]
の見出しを見つけてコメントを外します。 デフォルトの見出しの下で、bantime
設定を変更して、サービスがクライアントを30分間禁止するようにします。
[DEFAULT]
. . .
bantime = 1800
. . .
また、アラートの電子メール情報を構成する必要があります。 まず、destemail
パラメータを見つけます。これも、[DEFAULT]
の見出しの下にあるはずです。 これらのメッセージを収集するために使用する電子メールアドレスを入力します。
[DEFAULT]
. . .
destemail = [email protected]
. . .
必要に応じて、sendername
を別の値に設定できます。 ただし、メールサービスを使用して簡単にフィルタリングできる値があると便利です。そうしないと、さまざまな場所からの試行が頻繁に中断されると、通常の受信トレイにアラートが殺到する可能性があります。
下に移動して、action
パラメーターを電子メールを送信するアクションの1つに調整する必要があります。 選択肢は、禁止を開始してから問題のあるホストに関する「whois」レポートを電子メールで送信するaction_mw
か、上記を実行するだけでなく関連するログ行を電子メールで送信するaction_mwl
のいずれかです。
action_mwl
を選択するのは、ログ行が問題のトラブルシューティングと詳細情報の収集に役立つためです。
[DEFAULT]
. . .
action = %(action_mwl)s
. . .
SSHセクションに移り、禁止が確立される前に許可されるべき失敗した試行の量を調整したい場合は、maxretry
エントリを編集できます。 「22」以外のポートを使用している場合は、port
パラメーターを適切に調整する必要があります。 前に述べたように、このサービスはすでに有効になっているため、変更する必要はありません。
次に、nginx-http-auth
セクションを検索します。 ヘッダーのコメントを解除し、enabled
パラメーターを「true」に変更します。
. . .
[nginx-http-auth]
enabled = true
. . .
Webサーバーが非標準ポートで動作している場合、またはデフォルトのエラーログパスを移動した場合を除いて、このセクションで行う必要があるのはこれだけです。
Fail2banサービスの再起動
終了したら、ファイルを保存して閉じます。
次に、fail2banサービスを開始または再起動します。 場合によっては、サービスを完全にシャットダウンしてから再開する方がよい場合があります。
- sudo service fail2ban stop
これで、次のように入力して再起動できます。
- sudo service fail2ban start
すべてのファイアウォールルールが設定されるまでに少し時間がかかる場合があります。 そのタイプの最初の禁止が開始されるまで、ルールが追加されない場合があります。 ただし、しばらくすると、次のように入力して新しいルールを確認できます。
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -j RETURN
赤い線は、fail2banポリシーによって作成されたものです。 現在、トラフィックを新しいほぼ空のチェーンに転送し、トラフィックをINPUTチェーンに戻しています。
ただし、これらの新しいチェーンには、禁止ルールが追加されます。
禁止ポリシーのテスト
fail2banサーバーにログインする必要のない別のサーバーから、2番目のサーバーを禁止することでルールをテストできます。
2番目のサーバーにログインした後、fail2banサーバーにSSHで接続してみてください。 たとえば、存在しない名前を使用して接続を試みることができます。
- ssh blah@fail2ban_server_IP
パスワードプロンプトにランダムな文字を入力します。 これを数回繰り返します。 ある時点で、fail2banサーバーはPermission denied
メッセージで応答を停止します。 これは、2番目のサーバーがfail2banサーバーから禁止されたことを示します。
fail2banサーバーで、iptablesをもう一度確認すると、新しいルールを確認できます。
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN
強調表示された行でわかるように、構成に新しいルールがあり、2番目のサーバーのIPアドレスからのSSHポートへのトラフィックを拒否します。 設定したアカウントでの禁止についてのメールも受け取っているはずです。
結論
これで、サービスの基本的な禁止ポリシーを構成できるようになります。 Fail2banはセットアップが非常に簡単で、認証を使用するあらゆる種類のサービスを保護するための優れた方法です。
fail2banの仕組みについて詳しく知りたい場合は、fail2banのルールとファイルの仕組みに関するチュートリアルを確認してください。
fail2banを使用して他のサービスを保護する方法については、次のリンクを試してください。