23045
```

    /var/log/nginx/error.log
    
```

を見ると毎日何百行もの知らないIPアドレスから、あるはずのないディレクトリやファイルにアクセスされて困っています。データベースの接頭辞も複雑にしてあるのですが、なぜかアクセスされています。（アクセスできないというエラー）

> 2016/03/12 07:26:21 [error] 909#909: *1528710 FastCGI sent in stderr:  
>  "Primary script unknown" while reading response header from upstream,  
>  client: 1.86.87.12, server:hoge.com  
>  request: "GET /XXXX.php?RequestType=Test HTTP/1.0", upstream:  
>  "fastcgi://unix:/run/php-fpm/php-fpm.sock:" host: hoge.com

全世界に見られているWEBサイトなので、アクセス許可IPを日本のみにするやり方以外で、エラーログに表示された、あるいはXXXX.phpにアクセスしたIPを自動で拒否する方法はありませんでしょうか？
CC BY-SA 3.0
2016-03-12T06:11:23.800
23042
2016-03-14T02:47:13.523
7973
question
nginx
Nginxエラーログに不正アクセスIPを自動でブラックリストに入れたいです。
**不正アクセスIPの定義**

次のどちらかを満たすIPが不正アクセスとします。

a.エラーログに表示されたIP  
b.存在しない任意の.phpにアクセスしたIP

**条件**

アクセスログはありません。

**手順**

1) 存在しない.phpがアクセスされた時にエラーログを残す

```

    location ~ \.php$ {
        fastcgi_intercept_errors on;
    }
    
```

2) エラーログからIPを抽出して/etc/nginx/blacklist.confに保存する。書式は`deny 1.86.87.12;`

```

    grep -h -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' /etc/nginx/blacklist.conf /var/log/error.log | sort | uniq | while read line; do echo "deny $line;"; done> /etc/nginx/blacklist.conf+ && mv /etc/nginx/blacklist.conf+ /etc/nginx/blacklist.conf
    
```

3) nginx.confからincludeする。

```

    location / {
      include /etc/nginx/blacklist.conf;
    }
    
```

4) 先ほどの抽出スクリプトでブラックリストファイルを更新後、`kill -HUP $(cat /run/nginx.pid)` として有効化する。
CC BY-SA 3.0
2016-03-12T06:34:55.710
23045
2016-03-12T21:22:31.350
2016-03-12T21:22:31.350
7837
7837
23042
answer
ブルートフォースアタック避けには有名どころでは[fail2ban](http://www.fail2ban.org/wiki/index.php/Main_Page)というツールがあります。たいていの環境であればパッケージとして提供されている(場合によってはデフォルトでインストールされている)と思います。

他にも同種のツールはいろいろあります。パッケージマネージャで `bruteforce` などのキーワードで検索すれば出てくるんじゃないでしょうか。

* * *

質問を読み直していたら「アクセスログは取っていない」とかとんでもないことが書いてありました。その程度の管理レベルのサーバなのであれば、もっと簡単な方法があります。

```

    error_log /dev/null;
    
```

(そのようなまともに管理されいないサーバはインターネットに接続しないで欲しいところですが)

* * *

[nginxで制限する方法](https://ja.stackoverflow.com/a/23045/5793)は意味がないのでは、とコメントしようと思いましたが説明が必要だと思いますのでこちらに書きます。

まず、この手の「存在しないURLへのアクセス」は実際には「既知の脆弱性があるファイルをしらみつぶしに探すブルートフォースアタック」です。

存在するURLへのアクセスであればエラーログには載らないです。つまり、既知の脆弱性があるファイルが存在しておりそれをピンポイントで狙われた場合攻撃が成立しますので、「存在しないURLへのアクセス」をトリガにしたアクセス制限はセキュリティには何も寄与しません。

存在しないURLへのアクセスをトリガにしたブロックは、「ログが増えて鬱陶しい」対策です。ところが、nginxのアクセス制御で制限してしまうとそのログが載りますので、ログの種類が変わるだけでエントリ数の観点ではログが減りません。

ついでに指摘をしておくと、アプリケーション側のエラーなども含めて1回でも発生すれば無差別にブロックされてしまいますので、正規の利用者も相当ブロックされてしまうと思います。普通は適当な回数エラーになったらブロックします。

* * *

なお、認証まわり(パスワード認証が有効になっているSSHとかPOP3とか)については、ブルートフォース対策はセキュリティ向上に寄与します。
CC BY-SA 3.0
2016-03-13T02:06:25.750
23071
2016-03-14T02:47:13.523
2017-04-13T12:52:39.113
-1
5793
23042
answer