著者は、Write for DOnationsプログラムの一部として200ドルの寄付を受け取るためにCode.orgを選択しました。
前書き
Secure Shell(SSH)は、ネットワークサービスを安全に運用するための暗号化ネットワークプロトコルです。 通常、コンピューターシステムのリモートコントロールやファイルの転送に使用されます。 SSHがパブリックインターネットに公開されると、セキュリティの問題になります。 たとえば、ブルートフォース方式でパスワードを推測しようとするボットが見つかります。
PyFilterは、サーバーへの不正なログイン要求をすべて除外し、送信されるログイン要求が多すぎる場合はそれらをブロックすることを目的としています。 ログファイルを読み取り、ユーザーが構成可能な時間内に同じIPアドレスから失敗した要求が送信されたかどうかを確認することで機能します。 失敗した試行が多すぎる場合、ファイアウォールにルールを追加し、サーバーへの接続を拒否します。
このチュートリアルでは、PyFilterをインストールして設定し、SSHリクエストをブロックします。 次に、PyFilterをサービスとしてインストールし、オプションでクロスサーバー禁止同期を設定します。これは、複数のサーバーが禁止IPアドレスのリストを共有できるようにし、PyFilterがIPアドレスに関する位置データを記録できるようにする機能です 最後に、IPアドレスの禁止を解除する方法を調べます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
sudo非rootユーザーとファイアウォールを含むthe Ubuntu 16.04 initial server setup guideをフォローしてセットアップされた1つのUbuntu16.04サーバー。
-
Python3。Ubuntu16.04にデフォルトですでにインストールされています。
-
sudo apt-get install python3-pip
でインストールされたPIP。 -
(オプション)PyFilterのクロスサーバー禁止同期機能をStep 4で構成する場合は、How to Install Redis on Ubuntu 16.04に従ってRedisをインストールします。
[[step-1 -—- downloading-and-configuring-pyfilter]] ==ステップ1—PyFilterのダウンロードと構成
Githubからリポジトリを複製してPyFilterをダウンロードします。 ホームディレクトリに切り替えて、リポジトリを複製します。
cd ~
git clone https://github.com/Jason2605/PyFilter.git
これにより、PyFilter
というディレクトリが作成されます。 このフォルダーを/usr/local
フォルダーに移動します。
sudo mv PyFilter /usr/local/PyFilter
次に、/usr/local/PyFilter
ディレクトリに移動します。
cd /usr/local/PyFilter
次に、構成ファイルを作成する必要があります。 PyFilterには、Config/config.default.json
にあるデフォルトの構成ファイルが付属しています。 デフォルトのファイルを直接編集するのではなく、これをコピーしてコピーしたバージョンを編集します。 このようにして、何かがうまくいかなかった場合、比較するデフォルトの設定ファイルがあります。
デフォルトの構成ファイルをコピーします。
sudo cp Config/config.default.json Config/config.json
less
コマンドを使用して、構成ファイルの内容を表示できます。
less Config/config.json
デフォルト設定では、要求は最後の要求から5秒以内である必要があり、それは5回発生する必要があります。 PyFilterを実行して、動作を確認しましょう。
[[step-2 -—- running-pyfilter]] ==ステップ2—PyFilterの実行
PyFilterのダウンロードには、PyFilterの起動に使用する必要があるrun.sh
というスクリプトが含まれています。
最初に、スクリプトの権限を変更して実行可能にします。
sudo chmod +x run.sh
許可が与えられたら、スクリプトを実行してPyFilterを起動します。
./run.sh
PyFilterはログの監視を開始し、イベントが発生すると出力が表示されます。
OutputNo 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が禁止を保証する制限に達すると、次のような出力が表示されます。
Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.
[.note]#Note:禁止したために誤ってドロップレットからロックアウトされた場合は、チュートリアルHow To Use the DigitalOcean Console to Access your Dropletに従って戻ることができます。 次に、Step 6の手順に従って、禁止されたIPを削除します。
#
PyFilterを閉じるには、CTRL+C
を押します。
次に、PyFilterをサービスとしてインストールして、自動的に実行されるようにします。
[[step-3 -—- creating-a-service-for-pyfilter]] ==ステップ3—PyFilterのサービスを作成する
PyFilterが機能することがわかったので、サーバーとして再起動するたびに起動するように、サービスとして実行するようにPyFilterを設定しましょう。
PyFilter
ディレクトリ内には、install.sh
というスクリプトがあり、PyFilterのサービスを作成し、システムの起動時に実行できるようにします。
実行できるようにスクリプトを変更します。
sudo chmod +x install.sh
次に、スクリプトを起動します。
./install.sh
次の出力が表示され、インストールが成功したことが示されます。
OutputService created and enabled, check the status of it by using "sudo systemctl status PyFilter"
そのため、すべてを正しく実行するために、それを実行してみましょう。
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を構成する方法を見てみましょう。
[[step-4 -—- configuring-pyfilter-for-cross-server-ban-syncing-optional]] ==ステップ4—クロスサーバー禁止同期用のPyFilterの構成(オプション)
クロスサーバー禁止の同期により、禁止されたIPアドレスをPyFilterを使用して他のすべてのサーバーと同期し、それらを保護し、禁止する資格を満たしていない場合でもそのアドレスを禁止できます。 これは、IPがすでに禁止されているため、他のシステムを標的とする潜在的なボットよりも一歩先を行くことができることを意味します。
前提条件で述べたように、Redisをインストールして構成する必要があります。
また、pip
でインストールできるredis
Pythonモジュールも必要です。
pip3 install redis
次に、SQLiteの代わりにRedisを使用するように構成ファイルを編集します。 テキストエディタでConfig/config.json
ファイルを開きます。
nano Config/config.json
次の行を見つけます。
Config/config.json
"database": "sqlite"
sqlite
をredis
に変更します。
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を再起動してこれらの変更を適用します。
sudo systemctl restart PyFilter
これでPyFilterがインストールされ実行されました。
[[step-5 -—- configuring-pyfilter-to-gather-location-data-about-ip-addresses-optional]] ==ステップ5— IPアドレスに関するロケーションデータを収集するためのPyFilterの構成(オプション)
PyFilterは、禁止されたIPに関する位置データを取得して、攻撃の大部分の発信元に関する統計情報を提供できます。 このオプションモジュールは、この情報をPyFilterのログに追加します。
この機能を使用するには、最初にgeoip2
Pythonモジュールが必要です。これはpip
でインストールできます。
pip3 install geoip2
このモジュールをインストールしたら、PyFilterを再起動して新しいモジュールを認識します。
sudo systemctl restart PyFilter
これで、禁止されたIPアドレスが表示されると、IPに関する追加情報が表示されます。
Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name. The IP was from United Kingdom.
PyFilterは、リクエストの発信元の国を正常に記録しています。
最後に、アドレスの禁止を解除する方法を見てみましょう。
[[step-6 -—- un-banning-ip-addresses]] ==ステップ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アドレスの禁止を解除するには、テキストエディターで関連するブラックリストファイルを開きます。
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を使用したルールの管理の詳細については、How To List and Delete Iptables Firewall Rulesを参照してください。
/usr/local/PyFilter/Config/config.json
ファイル内のホワイトリストに登録されたセクションに特定のIPアドレスを追加することにより、特定のIPアドレスを無視するようにPyFilterに指示することもできます。
結論
これで、PyFilterがインストールされ、SSH接続を監視できました。
構成ファイルの各セクションの詳細と、MySQLやApacheなどの他のサービスの監視を構成する方法については、PyFilter site.を確認してください。