PHPサーバーで、悪質脆弱性スキャナ(Vulnerability Scanner)や悪いボット(Bad Bots)を制裁します。

## 悪質脆弱性スキャナ(Vulnerability Scanner)や悪いボット(Bad Bots)とは

悪質脆弱性スキャナ(Vulnerability Scanner)や悪いボット(Bad Bots)とは、許可なくサーバーを強制的にスキャンするプログラム。通常、このようなスキャナは、大規模かつ規則的な規模でインターネット全体をスキャンします。

![Snipaste_2020-07-06_23-59-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668967/54609342-e9df-9ca2-6ecd-515f20057df8.png)

確かに、安全なサーバー中ではありますが、危害はありません。 しかし、このアクセスログを見るたびに、うっとうしいと思う。



## 制裁準備

今回は、このような悪質な脆弱性スキャナーと戦うために、非常に古いテクニックを使ってみました。

それは、「**GZIP爆弾**」です。

この方法は、少なくとも20年以上前からありましたが、今もなお良い解決策を持っていません。

でも、その原因で、このような悪質脆弱性スキャナを制裁するために、この方法を使うのもいいかもしれない。

そのため、私は具体的に「この方法を使う自分のサーバーを守るが犯罪行為ではないか」と弁護士に尋ねました。 

（関連記事: [《みんなで逮捕されようプロジェクト》](https://github.com/hamukazu/lets-get-arrested/blob/master/README.ja.md) [《消せない画面…不正ＵＲＬ貼り付けた疑いで中１女子ら家宅捜索》](https://www.sanspo.com/geino/news/20190304/tro19030418410013-n1.html)）

それに対する弁護士の答えは、「この場合、このウェブアドレスへのアクセスの人はすでに不正アクセスで、つまりこのアクセスの人は自分が本当の犯罪者です。」というものでした。

法律面の準備が整いましたので、次は技術的な準備に取り掛かりましょう。

## 設定開始

まず、このトラップをデフォルトのホストの中で設定することだけをお勧めします。

何故なら、一般できに、デフォルトのホストの中は何もありません。

そして、普通の悪質脆弱性スキャナはただのデフォルトのホストの中をスキャナする。

**もし、本番環境の設定と私の説明するの環境が違ってあれば、ぜひとも諦めていただきたいと思います。そして、サーバー環境のセキュリティ設定が正しいかどうかを確認してください。**

**そして、もしあなたのサーバーが無制限の転送データ通信量を持っていない場合は、私もそれをお勧めしません。**

以下のすべてが Linux オペレーティングシステム上で動作します。

#### 1. GZIP爆弾ファイルを生成する

    dd if=/dev/zero bs=1M count=10240 | gzip -9 > /root/bomb.gzip

上記のコマンドを使用して、Linuxで10GBサイズのGZIPファイルを生成します。この処理には多少の待ち時間が必要です。

もちろん、私が書いたシェルスクリプトを使って生成することもできます。

ファストモード:

    wget https://raw.githubusercontent.com/DeepSkyFire/BadBotsTraps/master/src/Generate.sh && chmod +x Generate.sh && bash Generate.sh -s 10 -m fast

ノーマルモード:

    wget https://raw.githubusercontent.com/DeepSkyFire/BadBotsTraps/master/src/Generate.sh && chmod +x Generate.sh && bash Generate.sh -s 10 -m normal

そして、生成されたbomb.gzipファイルの名前を変更します。

#### 2. トラップ充填

先に生成したのGZIP爆弾ファイルの名前は「**1ba286020e414afb.gzip**」に変更しました。

続きから、PHPファイルを作成してみましょう。

PHPコード:

    <?php

    $GzipFile = '1ba286020e414afb.gzip'; //先に生成したのGZIP爆弾ファイルの名前。

    header("Content-Encoding: gzip"); 
    header("Content-Type: text/html; charset=utf-8");
    header("Cache-control: no-store"); //CDN環境にキャッシュしないのため、この設定が必要だ。
    header("Content-Length: ".filesize($GzipFile));
    Header("HTTP/1.1 200 OK"); //'HTTP/1.1 404 Not Found'もできる。好きなコードに設定しよう。

    if (ob_get_level()){
        ob_end_clean(); //自分のサーバーを傷つけないように。
    }

    readfile($GzipFile);
    exit;
    ?>

以上、PHPのコントロールファイルが完成しました。名前は「**1ba286020e414afb.php**」にしました。

#### 3. トラップをインストール

「**1ba286020e414afb.php**」と「**1ba286020e414afb.gzip**」この2つのファイルをデフォルトのホストのフォルダに置きます。

そして、nginxの設定ファイル「nginx.conf」を設定する:

    server
         {
            listen 80 default_server reuseport;
            ......
            error_page   404 403   /1ba286020e414afb.php; //このような設定する
            ......
         }

もちろん、Apacheでも設定可能です。デフォルトのホストのフォルダに「**.htaccess**」ファイルを設定する:


    ......
    errorDocument 404 /1ba286020e414afb.php
    errorDocument 403 /1ba286020e414afb.php
    ......

以上、すべての設定全部完成しました。


## 効果は？

今までのテストによると、70％の悪質脆弱性スキャナを1回の訪問したで訪問を停止しています。

しかし、残りの30%はどうでしょうか？ それは後だ。

今日は初めてqiitaに日本語で投稿しました。 何か間違いがあったら教えてください、よろしくお願いします。

上記のコードはすべてGithubにあります：[《Github DeepSkyFire/BadBotsTraps》](https://github.com/DeepSkyFire/BadBotsTraps)

以上です。