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.local
既存のファイルに基づく jail.conf
ファイル。 そのため、内容をコメントアウトして、そのファイルをコピーします。 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
. . .
The ignoreip
設定は、fail2banが無視する送信元アドレスを構成します。 デフォルトでは、ローカルマシンからのトラフィックを禁止しないように構成されています。 を追加することにより、無視するアドレスを追加できます [DEFAULT]
セクションと ignoreip
その下に設定する jail.local
ファイル。 ディレクティブの最後にスペースで区切ってアドレスを追加することにより、アドレスを追加できます。
[DEFAULT]
. . .
bantime = 600
. . .
The bantime
パラメータは、クライアントが正しく認証に失敗したときにクライアントが禁止される時間の長さを設定します。 これは秒単位で測定されます。 デフォルトでは、これは600秒または10分に設定されています。
[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .
注意したい次の2つのパラメータは findtime
と maxretry
. これらは連携して、クライアントが禁止されるべき不正なユーザーであることが判明する条件を確立します。
The maxretry
変数は、クライアントが次のように定義された時間枠内に認証する必要がある試行回数を設定します。 findtime
、禁止される前に。 デフォルト設定では、fail2banサービスは、10分以内に3回ログインに失敗したクライアントを禁止します。
[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .
あなたは評価したいと思うでしょう destemail
, sendername
、 と mta
電子メールアラートを構成する場合の設定。 The destemail
パラメータは、禁止メッセージを受信する必要がある電子メールアドレスを設定します。 The sendername
電子メールの「From」フィールドの値を設定します。 The mta
パラメータは、メールの送信に使用されるメールサービスを設定します。 繰り返しますが、これらをに追加します jail.local
ファイル、下 [DEFAULT]
ヘッダーを調整し、調整する場合は適切な値に設定します。
[DEFAULT]
. . .
action = $(action_)s
. . .
このパラメーターは、fail2banが禁止を開始するときに実行するアクションを構成します。 値 action_
このパラメータの直前のファイルで定義されています。 デフォルトのアクションは、禁止時間が経過するまで、問題のあるホストからのトラフィックを拒否するようにファイアウォールを構成することです。
電子メールアラートを構成する場合は、 action
アイテムへ jail.local
ファイルし、その値をから変更します action_
に action_mw
. 電子メールに関連するログ行を含める場合は、次のように変更できます。 action_mwl
. メールアラートを使用する場合は、適切なメール設定が構成されていることを確認してください。
個々の刑務所の設定
最後に、個々のサービスを処理する構成ファイルの部分に到達します。 これらは、次のようなセクションヘッダーによって指定されます。 [ssh]
.
これらの各セクションは、のヘッダーのコメントを解除することで有効にできます。 jail.local
と変更 enabled
「真」である行:
[jail_to_enable]
. . .
enabled = true
. . .
デフォルトでは、SSHサービスは有効になっており、その他はすべて無効になっています。
これらのセクションは、で設定された値を使用して機能します [DEFAULT]
基礎としてセクションを作成し、必要に応じて変更します。 値をオーバーライドする場合は、適切なサービスのセクションをに追加することでオーバーライドできます。 jail.local
そしてその値を変更します。
ここで設定される他のいくつかの設定は filter
これは、ログの行が認証の失敗を示しているかどうかを判断するために使用されます。 logpath
これは、その特定のサービスのログがどこにあるかをfail2banに通知します。
The filter
値は実際にはにあるファイルへの参照です /etc/fail2ban/filter.d
ディレクトリ、その .conf
拡張機能が削除されました。 これらのファイルには、ログの行が認証の試みに失敗したかどうかを判断する正規表現が含まれています。 これらのファイルはかなり複雑であり、事前定義された設定が適切な行とよく一致するため、このガイドではこれらのファイルについて詳しく説明しません。
ただし、そのディレクトリを調べると、使用可能なフィルタの種類を確認できます。
- ls /etc/fail2ban/filter.d
使用しているサービスに関連していると思われるファイルが表示された場合は、テキストエディタで開く必要があります。 ほとんどのファイルはかなりよくコメントされており、少なくともスクリプトがどのタイプの状態を防ぐように設計されているかを知ることができるはずです。 これらのフィルターのほとんどには、適切な(無効にされた)セクションがあります。 jail.conf
で有効にできるファイル jail.local
必要に応じてファイル。
たとえば、Nginxを使用してWebサイトにサービスを提供していると偽って、パスワードで保護されたサイトの一部がログイン試行で非難されていることに気づきます。 fail2banに使用するように指示できます nginx-http-auth.conf
内でこの状態をチェックするファイル /var/log/nginx/error.log
ファイル。
これは実際にはすでにと呼ばれるセクションで設定されています [nginx-http-auth]
私たちの中で /etc/fail2ban/jail.conf
ファイル。 のセクションのコメントを外す必要があります 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つへのパラメータ。 選択肢は action_mw
これにより、禁止が開始され、問題のあるホストに関する「whois」レポートが電子メールで送信されます。 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を使用して他のサービスを保護する方法については、次のリンクを試してください。