phpMyAdmin のスキャンを H2O でブロックする

概要

H2O を使って Web サービスを構築していますが、phpMyAdmin の脆弱性を狙ったアクセスが毎日やってきます。

github.com

f:id:yuu2634:20171212231116p:plain

phpMyAdmin は使用していないため特に問題ないのですが、存在しないパスを毎回読みに行く処理は無駄ですので、今回は H2O 側でブロックしてみます。


判定方法

まずはアクセスログからヒントを探ってみます。

188.13.xxx.yyy - - [26/Nov/2017:12:41:51 +0900] "HEAD /mysql/admin/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:52 +0900] "HEAD /mysql/dbadmin/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:52 +0900] "HEAD /mysql/sqlmanager/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:53 +0900] "HEAD /mysql/mysqlmanager/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:53 +0900] "HEAD /phpmyadmin/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:54 +0900] "HEAD /phpMyadmin/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:55 +0900] "HEAD /phpMyAdmin/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:55 +0900] "HEAD /phpmyAdmin/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:56 +0900] "HEAD /phpmyadmin2/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:57 +0900] "HEAD /phpmyadmin3/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"
188.13.xxx.yyy - - [26/Nov/2017:12:41:57 +0900] "HEAD /phpmyadmin4/ HTTP/1.1" 404 0 "-" "Mozilla/5.0 Jorgee"

User-Agent がすべて Mozilla/5.0 Jorgee となっていますね。

他サイトの事例を見ても、このユーザエージェントをキーに弾くことが多いようです。


設定適用

H2O には mruby が組み込まれているため、リクエスト処理やアクセス制御に mruby のコードを使用することができます。

Access Control - Configure - H2O - the optimized HTTP/2 server

User-Agent が Mozilla/5.0 Jorgee と完全一致する場合のみ、アクセスを拒否しています。


動作確認

H2O を reload した後、curl から確認してみます。

$ curl -I -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) (略) Chrome/62.0.3202.94" https://spla2.yuu
26.com
HTTP/1.1 200 OK
(後略)

$ curl -I -H "User-Agent: Mozilla/5.0 Jorgee" https://spla2.yuu26.com
HTTP/1.1 403 OK
(後略)

「403 Forbidden」ではなく「403 OK」なのが若干気になりますが、RFC 2616 によると文字列部分は任意の内容でいいそうなので、一旦よしとします。


まとめ

  • phpMyAdmin への脆弱性スキャンを H2O で拒否しました
  • User-Agent が全て Mozilla/5.0 Jorgee となっていたため UA で判定しました
  • レスポンスコードの後ろに続く文字は任意に変更していいらしいです

「403 Forbidden」と返す方法は、後日調べて追記したいと思います。