Alibaba Cloud UbuntuサーバへのSSH接続を監視するPyFilterクライアントのインストールと設定

このチュートリアルでは、`Alibaba Cloud`上で`SSH（Secure Socket Shell）`接続を監視するためのPyFilterクライアントの設定方法を説明します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/using-pyfilter-on-alibaba-cloud-to-filter-ssh-login-attempts_595825)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#チュートリアルの要件
このチュートリアルの必須要件は以下の通りです。

- Ubuntu 18.04を実行しているAlibaba Cloud [ECS](https://www.alibabacloud.com/ja/product/ecs)インスタンス。[このチュートリアル](https://www.alibabacloud.com/blog/how-to-set-up-your-first-ubuntu-16-04-server-on-alibaba-cloud_593747?spm=a2c65.11461447.0.0.61797d1294HOzw)では、Ubuntu 18.04サーバをAlibaba Cloud上に設定する方法を紹介しています。
- Python 3
- PIP
- サーバー間の同期のためにUbuntuサーバーにRedisをインストールしました。

#PyFilter クライアントのダウンロードと設定
GitHubリポジトリからPyFilterをgit cloneするところから始めます。マシンのテンポラリディレクトリにリポジトリを保存します。

以下のコマンドで`/tmp`ディレクトリに変更します。

```
cd /tmp
```
ここでgit cloneコマンドを実行します。

```
git clone https://github.com/Jason2605/PyFilter.git
```
プロセスは、ホームディレクトリにPyFilterという新しいディレクトリを作成します。以下のコマンドを実行して、ダウンロードを確認してください。

```
ls
```
以下のスニペットは、前のコマンドの出力を示しています。

```
PyFilter
Other files and directories
```
次に、以下のようにPyFilterを`/usr/local`に移動します。

```
sudo mv PyFilter /usr/local/PyFilter
```
また、以下のコマンドを実行して`/usr/local/PyFilter`ディレクトリに変更します。

```
cd /usr/local/PyFilter
```
次に、PyFilter の作業ファイルを設定します。すでに `Config/config.default.json` にアクセス可能なデフォルト設定ファイルを持っているので、これを作業用設定ファイルのベースとして使用します。デフォルトのファイルを保持することは必須ではありませんが、ミスを避けるためには重要です。

```
cd Config
sudo cp config.default.json config.json
```
エディタを使用して、設定ファイルの内容を表示および編集します。

```
sudo nano config.json
```
以下のスニペットは、このチュートリアルで特に興味深いRedisセクションを示しています。

```
  "redis": {
    "host": "127.0.0.1",
    "password": null,
    "database": 0,
    "sync_bans": {
      "active": true,
      "name": "1",
      "check_time": 600
    }
```
Redisをインストールして、後続のセグメントで上記の部分を修正してみましょう。

#Redisのインストール
Redisは、システムへのアクセスを試みる自動化されたボットをブロックします。以下のコマンドを実行して、サーバにRedisをインストールします。

```
sudo apt install python3-pip
pip3 install redis
```
以下のスニペットは、前のコマンドの出力を示しています。

```
Installing collected packages: redis
Successfully installed redis-3.2.1
```
ここでRedisの`config.json`を編集します。以下のコマンドを実行して、エディタでファイルを開きます。

```
sudo nano config.json
```
以下のように、ファイルに必要な変更を加えてください。

````
Config.json
{
  "settings": {
    "database": "redis",


  "redis": {
    "host": "127.0.0.1",
    "password": null,
    "database": 0,
    "sync_bans": {
      "active": true,
      "name": "hostname",
      "check_time": 600
    }
  },
```

Redis パラメータは、Pyfilter が Redis サーバーに接続できるようにします。通常、Redisはサーバインスタンス間で禁止されたIPアドレスを同期させるために非常に重要です。sync_bansパラメータは、禁止リストをすべてのサーバに共有しますが、システムは一意の名前を持つ必要があり、そうでない場合は同期に失敗します。

変更を保存してエディタを終了します。次はPyFilterを実行してみましょう。

#PyFilter クライアントの起動
ここで、run.shスクリプトまたはrun.pyスクリプトメソッドを使用してクライアントを起動します。このチュートリアルでは、以下のようなpythonファイルを使用してみましょう。

```
sudo python3 run.py
```
以下のスニペットは、クライアントが起動したときのログファイルの出力を示しています。

出力

```
No file to check within rule: Mysql
No file to check within rule: Apache
No file to check within rule: Nginx
Checking Ssh logs
IP: 58.242.83.35 has been blacklisted and the firewall rules have been updated.                                                                                         Acquired 5 bad connections via ssh.
IP: 168.227.56.242 has been blacklisted and the firewall rules have been updated                                                                                        . Acquired 5 bad connections via ssh.
IP: 103.28.57.86 has been blacklisted and the firewall rules have been updated.                                                                                         Acquired 5 bad connections via ssh.
IP: 51.158.69.8 has been blacklisted and the firewall rules have been updated. Acquired 5 bad connections via ssh.
Saving newly blacklisted IP's!
```
PyFilter クライアントは、失敗してから 5 秒後にリクエストをしようとすると、IP アドレスを禁止します。ただし、設定ファイルには必ずそのような設定を変更するオプションがあります。先に進むためには、自動で動くPyFilterサービスが必要です。では、次のステップで同じサービスをインストールしてみましょう。

#PyFilter サービスの作成
PyFilter クライアントの実行に成功したら、サーバが再起動したときに自動的に実行されるようにサービスを設定してみましょう。

PyFilter ディレクトリのファイルには、クライアントの起動やサービスの作成を支援する run.sh と install.sh スクリプトが含まれています。

まず、以下のコマンドを実行して、両方のスクリプトのパーミッションを修正して実行可能にします。

```
sudo chmod +x run.sh
sudo chmod +x install.sh
```
以下のコマンドを実行すると、`run.sh`スクリプトの内容が表示されます。

```
nano run.sh
```
以下のスニペットは、前のコマンドの出力を示しています。

```
#!/usr/bin/env bash

sudo python3 run.py
```
先ほどのようにクライアントを起動するスクリプトであることに注意してください。

再度、以下のコマンドを実行してinstall.shスクリプトを検査します。

```
nano install.sh
```
以下のスニペットは、前のコマンドの出力を示しています。

```
#!/usr/bin/env bash

if ! [ -f "/etc/systemd/system/PyFilter.service" ]
then
    sudo python3 create_service.py
    sudo mv PyFilter.service /etc/systemd/system/PyFilter.service
    sudo chmod +x run.sh
    sudo systemctl daemon-reload
    sudo systemctl start PyFilter
    sudo systemctl enable PyFilter
    echo Service created and enabled, check the status of it by using \"sudo systemctl status PyFilter\"
else
    echo Service already created.
    echo Check the status of it by using \"sudo systemctl status PyFilter\"
fi
```
スクリプトを起動すると、一連のコマンドが実行され、システム内に PyFilter サービスが作成されます。

以下のコマンドで起動します。

```
./install.sh
```
スクリプトの実行に成功すると、以下のような出力が得られます。

出力

```
Service created and enabled, check the status of it by using "sudo systemctl status PyFilter"
```
全てが順調に動いているようです。

以下のコマンドを実行して、ステータスチェックを実行します。

```
sudo systemctl status PyFilter
```

上記のコマンドを実行すると、以下のような出力が得られます。

```
- PyFilter.service - PyFilter
   Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled)
   Active: <^>active^> (running) since Wed 2019-05-01 07:50:38 UTC; 38min ago
 Main PID: 12474 (bash)
   CGroup: /system.slice/PyFilter.service
           \A9\C0\A9\A412474 bash /usr/local/PyFilter/run.sh
           \A9\C0\A9\A412475 sudo python3 run.py
           \A9\B8\A9\A412478 python3 run.py
```

すべてが正常に動作しているかどうかを確認するために、ステータスチェックをスキップしないようにしてください。ここでは、エラーの一例を紹介します。

```
- PyFilter.service - PyFilter
   Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2019-05-01 07:50:38 UTC; 38min ago
  Process: 12474 ExecStart=/usr/local/PyFilter/run.sh (code=exited, status=1/FAILURE)
 Main PID: 12474 (code=exited, status=1/FAILURE)

May 01 07:50:38 Tuts sudo[12475]: pam_unix(sudo:session): session opened for user root by (uid=0)
May 01 07:50:38 Tuts run.sh[12474]: Traceback (most recent call last):
May 01 07:50:38 Tuts run.sh[12474]:   File "run.py", line 4, in <module>
May 01 07:50:38 Tuts run.sh[12474]:     p = PyFilter()
May 01 07:50:38 Tuts run.sh[12474]:   File "/usr/local/PyFilter/pyFilter/py_filter.py", line 22, in __init__
May 01 07:50:38 Tuts run.sh[12474]:     with open(file_path, "r") as config:
May 01 07:50:38 Tuts run.sh[12474]: FileNotFoundError: [Errno 2] No such file or directory: 'Config/config.json'
May 01 07:50:38 Tuts sudo[12475]: pam_unix(sudo:session): session closed for user root
May 01 07:50:38 Tuts systemd[1]: PyFilter.service: Main process exited, code=exited, status=1/FAILURE
May 01 07:50:38 Tuts systemd[1]: PyFilter.service: Failed with result 'exit-code'.
```

エラーが発生した場合は、クライアントを再インストールし、上記のハイライトされた手順に従ってください。

#IPアドレスの使用禁止
PyFilter があなたのサーバから締め出す可能性があるので、IP アドレスの禁止を解除する方法を知っておくことは非常に重要です。そのような場合は、コンソールからログインし、禁止されているIPを手動で削除します。禁止されたIPの情報を保存しているファイルは `- /usr/local/PyFilter/Config/blacklist.v4` です。また、`/usr/local/PyFilter/Config/blacklist.v6`というファイルには、IPルールに関する情報が格納されています。

次のコマンドを実行して、禁止された IPS のリストを取得します。

```
cd /usr/local/PyFilter/Config
sudo nano blacklist.v4
```
次のスニペットは、禁止されたIPを示しています。

```
# Generated by iptables-save v1.6.1 on Wed May  1 08:20:22 2019
*filter
:INPUT ACCEPT [49:4006]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50:5180]
-A INPUT -s 51.158.69.8/32 -j DROP
-A INPUT -s 104.248.140.212/32 -j DROP
-A INPUT -s 149.202.55.176/32 -j DROP
-A INPUT -s 112.161.29.50/32 -j DROP
-A INPUT -s 58.242.83.38/32 -j DROP
-A INPUT -s 128.199.230.16/32 -j DROP
-A INPUT -s 58.163.88.42/32 -j DROP
-A INPUT -s 76.79.74.58/32 -j DROP
-A INPUT -s 106.51.54.198/32 -j DROP
-A INPUT -s 180.151.8.180/32 -j DROP
-A INPUT -s 109.207.159.178/32 -j DROP
-A INPUT -s 120.29.156.251/32 -j DROP
-A INPUT -s 148.70.11.143/32 -j DROP
-A INPUT -s 179.110.29.67/32 -j DROP
-A INPUT -s 118.89.229.244/32 -j DROP
-A INPUT -s 193.112.174.67/32 -j DROP
-A INPUT -s 134.175.154.182/32 -j DROP
-A INPUT -s 36.103.243.247/32 -j DROP
-A INPUT -s 103.28.57.86/32 -j DROP
-A INPUT -s 168.227.56.242/32 -j DROP
-A INPUT -s 58.242.83.35/32 -j DROP
COMMIT
# Completed on Wed May  1 08:20:22 2019
```
以下に示すように、エディタで関連するブラックリストファイルにアクセスして、ブロックされたIPアドレスの使用禁止を解除します。

```
sudo nano blacklist.v4
# Generated by iptables-save v1.6.1 on Wed May  1 08:20:22 2019
*filter
:INPUT ACCEPT [49:4006]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50:5180]
-A INPUT -s 51.158.69.8/32 -j DROP
-A INPUT -s 104.248.140.212/32 -j DROP
-A INPUT -s 149.202.55.176/32 -j DROP
-A INPUT -s 112.161.29.50/32 -j DROP
-A INPUT -s 58.242.83.38/32 -j DROP
COMMIT
# Completed on Wed May  1 08:20:22 2019
```
ファイルを保存してエディタを終了します。

ここで、以下のコマンドを使用して変更を反映させるためにクライアントを再起動します。

```
sudo systemctl restart PyFilter
```

#IPロケーションデータの収集
また、PyFilterは禁止されたIPから位置情報を収集して、攻撃の場所を分析します。このような情報をログに含めるには、`geoip2`モジュールをインストールする必要があります。

```
pip3 install geoip2
```
次に、以下のコマンドを実行してPyFilterを再起動します。

```
sudo systemctl restart PyFilter
```
これで、禁止されたすべてのIPが以下の出力スニペットのように表示されます。

```
2018-08-14 14518:05 Found IP: 196.4.100.13 from server: my_server. The IP was from Kenya.
```
#結論
このチュートリアルでは、Alibaba Cloud UbuntuサーバへのSSH接続を監視するためのPyFilterクライアントのインストールと設定方法を説明します。PyFilterはシンプルで効果的な機能で知られています。アリババクラウドでは、充実したセキュリティ機能を提供しています。しかし、ユーザーがより良いセキュリティ管理ができるようにするために、PyFilter は正当な IP アドレスとサーバーへのアクセスを許可してはいけない IP アドレスを特定するのに役立ちます。

まだアリババクラウドのアカウントをお持ちでない方は、アカウントにサインアップして、最大1300ドルの価値のある[40以上の製品を無料でお試しください](https://account.alibabacloud.com/register/intl_register.htm?spm=a2c65.11461447.0.0.61797d1294HOzw)。Alibaba Cloudの詳細は[こちら](https://account.alibabacloud.com/register/intl_register.htm?spm=a2c65.11461447.0.0.61797d1294HOzw)をご覧ください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*