著者はCode.orgを選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

Secure Shell(SSH)は、ネットワークサービスを安全に運用するための暗号化ネットワークプロトコルです。 これは通常、コンピュータシステムのリモートコントロールまたはファイルの転送に使用されます。 SSHがパブリックインターネットに公開されると、セキュリティ上の問題になります。 たとえば、ブルートフォース方式でパスワードを推測しようとするボットを見つけることができます。

PyFilter は、サーバーへの不正なログインリクエストをすべて除外し、送信されるログインリクエストが多すぎる場合はそれらをブロックすることを目的としています。 これは、ログファイルを読み取り、ユーザーが構成可能な時間内に失敗した要求が同じIPアドレスからのものであるかどうかを確認することで機能します。 次に、失敗した試行をキャプチャする回数が多すぎる場合は、ファイアウォールにルールを追加して、サーバーに接続する機能を拒否します。

このチュートリアルでは、SSHリクエストをブロックするようにPyFilterをインストールして構成します。 次に、PyFilterをサービスとしてインストールし、オプションでサーバー間の禁止同期を構成します。これは、複数のサーバーが禁止IPアドレスのリストを共有できるようにする機能であり、PyFilterがIPアドレスに関する位置データを記録できるようにします。 最後に、IPアドレスの禁止を解除する方法について説明します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu16.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
  • Python 3は、Ubuntu16.04にデフォルトですでにインストールされています。
  • sudo apt-get install python3-pipとともにインストールされたPIP。
  • (オプション)ステップ4 でPyFilterのクロスサーバー禁止同期機能を構成する場合は、 Ubuntu16.04にRedisをインストールする方法に従ってRedisをインストールします。

ステップ1—PyFilterのダウンロードと構成

Githubからリポジトリのクローンを作成してPyFilterをダウンロードします。 ホームディレクトリに切り替えて、リポジトリのクローンを作成します。

  1. cd ~
  2. git clone https://github.com/Jason2605/PyFilter.git

これにより、PyFilterというディレクトリが作成されます。 このフォルダを/usr/localフォルダに移動します。

  1. sudo mv PyFilter /usr/local/PyFilter

次に、/usr/local/PyFilterディレクトリに移動します。

  1. cd /usr/local/PyFilter

次に、構成ファイルを作成する必要があります。 PyFilterには、Config/config.default.jsonにあるデフォルトの構成ファイルが付属しています。 デフォルトのファイルを直接編集するのではなく、これをコピーして、コピーしたバージョンを編集します。 このようにして、問題が発生した場合に比較するデフォルトの構成ファイルがあります。

デフォルトの構成ファイルをコピーします。

  1. sudo cp Config/config.default.json Config/config.json

lessコマンドを使用して、構成ファイルの内容を表示できます。

  1. less Config/config.json

デフォルト設定では、リクエストは最後のリクエストから5秒以内である必要があり、それは5回発生する必要があり、十分に実行できます。 PyFilterを実行して、動作することを確認しましょう。

ステップ2—PyFilterを実行する

PyFilterのダウンロードには、run.shというスクリプトが含まれています。このスクリプトを使用してPyFilterを起動する必要があります。

まず、スクリプトのアクセス許可を変更して実行可能にします。

  1. sudo chmod +x run.sh

権限が付与されたら、スクリプトを実行してPyFilterを起動します。

  1. ./run.sh

PyFilterはログの監視を開始し、イベントが発生すると出力が表示されます。

Output
No file to check within rule: Mysql No file to check within rule: Apache No file to check within rule: Nginx Checking Ssh logs

デフォルトでは、PyFilterは、前回の失敗したリクエストから5秒以内に発生する5つ以上の失敗したリクエストを行うIPを禁止します。 これは、PyFilter構成ファイルで変更できます。

これらの結果は、/usr/local/PyFilter/Logディレクトリにも記録されます。

IPが禁止を正当化する制限に達すると、次のような出力が表示されます。

Output
2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.

:禁止したために誤ってドロップレットからロックアウトされた場合は、チュートリアルDigitalOceanコンソールを使用してドロップレットにアクセスする方法に戻ることができます。 次に、ステップ6 の手順に従って、禁止されたIPを削除します。

PyFilterを閉じるには、CTRL+Cを押します。

次に、PyFilterをサービスとしてインストールして、自動的に実行されるようにします。

ステップ3—PyFilterのサービスを作成する

PyFilterが機能することがわかったので、サーバーを再起動するたびに開始されるように、サービスとして実行するように構成しましょう。

PyFilterディレクトリ内に、install.shというスクリプトがあります。このスクリプトは、PyFilterのサービスを作成し、システムの起動時に実行できるようにします。

スクリプトを変更して、実行できるようにします。

  1. sudo chmod +x install.sh

次に、スクリプトを起動します。

  1. ./install.sh

インストールが成功したことを示す次の出力が表示されます。

Output
Service created and enabled, check the status of it by using "sudo systemctl status PyFilter"

それでは、すべてが正しく実行されていることを確認するために、それを実行しましょう。

  1. sudo systemctl status PyFilter

この出力が表示され、サービスがactiveであることが示されます。

Output
● PyFilter.service - PyFilter Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled) Active: <^>active^> (running) since Wed 2018-03-21 18:55:35 UTC; 12s ago Main PID: 8383 (bash) CGroup: /system.slice/PyFilter.service ├─8383 bash /usr/local/PyFilter/run.sh ├─8384 sudo python3 run.py └─8387 python3 run.py

エラーが表示された場合は、インストール手順をもう一度確認してください。

次に、禁止されているIPアドレスを他のサーバーと共有するようにPyFilterを構成する方法を見てみましょう。

ステップ4—クロスサーバー禁止同期用のPyFilterの構成(オプション)

クロスサーバー禁止同期を使用すると、禁止されたIPアドレスをPyFilterを使用して他のすべてのサーバーと同期してサーバーを保護し、禁止される資格を満たしていない場合でもそのアドレスを禁止できます。 これは、IPがすでに禁止されているため、他のシステムを標的とする潜在的なボットよりも一歩先を行く可能性があることを意味します。

前提条件に記載されているように、Redisをインストールして構成する必要があります。

redis Pythonモジュールも必要です。これは、pipとともにインストールできます。

  1. pip3 install redis

次に、SQLiteの代わりにRedisを使用するように構成ファイルを編集します。 テキストエディタでConfig/config.jsonファイルを開きます。

  1. nano Config/config.json

次の行を見つけます。

Config / config.json
"database": "sqlite"

sqliteredisに変更します。

Config / config.json
"database": "redis"

次に、Redis接続情報を変更します。 ファイルの次のセクションを見つけます。

Config / config.json
  "redis": {
    "host": "127.0.0.1",
    "password": null,
    "database": 0,
    "sync_bans": {
      "active": true,
      "name": "your_hostname",
      "check_time": 600
    }
  },

このセクションを変更して、Redisサーバーの接続の詳細が含まれるようにします。 次に、sync_bansセクション内で、nameをホスト名に変更します。 この名前は、サーバー間の禁止同期が正しく機能するために、同じRedisサーバーを使用してPyFilterを実行している個々のシステムごとに一意である必要があります。

ファイルを保存して、エディターを終了します。 次に、PyFilterを再起動して、次の変更を適用します。

  1. sudo systemctl restart PyFilter

これで、PyFilterがインストールされて実行されます。

ステップ5— IPアドレスに関するロケーションデータを収集するためのPyFilterの設定(オプション)

PyFilterは、攻撃の大部分がどこから来ているかに関する統計情報を提供するために、禁止されたIPに関する位置データを取得できます。 このオプションのモジュールは、この情報をPyFilterのログに追加します。

この機能を使用するには、最初にgeoip2 Pythonモジュールが必要です。これは、pipとともにインストールできます。

  1. pip3 install geoip2

このモジュールをインストールしたら、PyFilterを再起動して、新しいモジュールを認識します。

  1. sudo systemctl restart PyFilter

これで、禁止されたIPアドレスが表示されると、IPに関する追加情報が表示されます。

Output
2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name. The IP was from United Kingdom.

PyFilterは、リクエストの発信元の国を正常にログに記録するようになりました。

最後に、アドレスの禁止を解除する方法を見てみましょう。

ステップ6—IPアドレスの禁止を解除する

PyFilterは、純粋にiptablesルールを作成することによってIPアドレスを禁止する手段です。 IPを禁止すると、ファイアウォールルールが更新され、ルールのスナップショットがファイル/usr/local/PyFilter/Config/blacklist.v4および/usr/local/PyFilter/Config/blacklist.v6に保存されます。

/usr/local/PyFilter/Config/blacklist.v4で禁止されているいくつかのIPv4アドレスの例を次に示します。

/usr/local/PyFilter/Config/blacklist.v4
# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018
*filter
:INPUT ACCEPT [217:30580]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [249:30796]
-A INPUT -s 203.0.113.13/32 -j DROP
-A INPUT -s 203.0.113.14/32 -j DROP
-A INPUT -s 203.0.113.15/32 -j DROP
COMMIT
# Completed on Thu Mar 22 19:53:04 2018

このIPアドレスの禁止を解除するには、テキストエディタで関連するブラックリストファイルを開きます。

  1. sudo nano /usr/local/PyFilter/Config/blacklist.v4

関連するiptablesルールをファイルから削除します。 この場合、ファイルから203.0.113.13を削除しました。

/usr/local/PyFilter/Config/blacklist.v4
# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018
*filter
:INPUT ACCEPT [217:30580]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [249:30796]
-A INPUT -s 203.0.113.14/32 -j DROP
-A INPUT -s 203.0.113.15/32 -j DROP
COMMIT
# Completed on Thu Mar 22 19:53:04 2018

次に、ファイルを保存してエディターを閉じます。 sudo systemctl restart PyFilterを使用してPyFilterを再起動すると、PyFilterはこのファイルを使用してファイアウォールルールを更新します。

iptablesを使用したルールの管理の詳細については、Iptablesファイアウォールルールを一覧表示および削除する方法を参照してください。

/usr/local/PyFilter/Config/config.jsonファイル内のホワイトリストに登録されたセクションに特定のIPアドレスを追加することにより、特定のIPアドレスを無視するようにPyFilterに指示することもできます。

結論

これで、PyFilterがインストールされ、SSH接続が監視されました。

構成ファイルの各セクションの詳細と、MySQLやApacheなどの他のサービスの監視を構成する方法については、PyFilterサイトを確認してください。