43 views
【1】問題発生
年に数回発生する恒例イベントのようになっている AWSからの過剰アクセス問題…
またまた発生した。
共用サーバの CPU使用率が上がり、私のアカウントに使用制限がかかってしまうから大問題なのだ。
Amazon様が悪いのではない。
Amazon AWS上で BOTを動かして無差別クローリングしまくっている人が悪い のだ。
私が公開している情報など意味の薄い物ばかりなのに、なぜそんな物まで漁るのか?
やめてほしい。
【2】対策
AWSからのアクセスを HTTPサーバで全遮断 する。
共用サーバなので root権限がないため、.htaccessで制御可能な範囲で対策する。
【3】やってみる
Step 1 : Amazonが公開している IPアドレス一覧を取得する。
curl コマンドで httpリクエストを発行し、Amazonが公開している IPアドレス一覧の JSONファイルをダウンロードする。
$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json > ip-ranges.json
ダウンロードしたデータの中身を見てみる。こんな感じで(↓)JSONデータが入っている。
prefixes[].ip_prefix に IPアドレスの情報が格納されている。
$ less ip-ranges.json
{
"syncToken": "1776118025",
"createDate": "2026-04-13-22-07-05",
"prefixes": [
{
"ip_prefix": "3.4.12.4/32",
"region": "eu-west-1",
"service": "AMAZON",
"network_border_group": "eu-west-1"
},
{
"ip_prefix": "3.5.140.0/22",
"region": "ap-northeast-2",
"service": "AMAZON",
"network_border_group": "ap-northeast-2"
},
{
"ip_prefix": "15.190.244.0/22",
"region": "ap-east-2",
"service": "AMAZON",
"network_border_group": "ap-east-2"
},
Step 2 : IPアドレス情報だけを抽出する。
jq コマンドを使う。
jqコマンドは、JSONデータに対して grep + awk + sed ができる便利コマンドだ。
$ less ip-ranges.json | jq '.prefixes[].ip_prefix'
"3.4.12.4/32"
"3.5.140.0/22"
"15.190.244.0/22"
"15.230.15.29/32"
"15.230.15.76/31"
"15.230.221.0/24"
"15.248.168.0/21"
"23.254.120.0/21"
"35.180.0.0/16"
"51.85.0.0/16"
"52.93.153.170/32"
"52.93.178.234/32"
"52.93.244.0/24"
"52.94.76.0/22"
"52.95.36.0/22"
"52.219.170.0/23"
"69.107.10.200/29"
"99.83.109.0/24"
抽出したテキストの前後に " が付いているので、r オプションでこれを除去する。
| r | raw output, クォートなし(=普通の文字列)で出力する。 |
$ less ip-ranges.json | jq -r '.prefixes[].ip_prefix'
3.4.12.4/32
3.5.140.0/22
15.190.244.0/22
15.230.15.29/32
15.230.15.76/31
15.230.221.0/24
15.248.168.0/21
23.254.120.0/21
35.180.0.0/16
51.85.0.0/16
52.93.153.170/32
52.93.178.234/32
52.93.244.0/24
52.94.76.0/22
52.95.36.0/22
52.219.170.0/23
69.107.10.200/29
99.83.109.0/24
Step 3 : .htaccessに貼り付けられるように文字列を連結する。
以下のフォーマットで出力させる。ついでに IPアドレス値でソートし、uniq コマンドで重複を削除する。
Require not ip {IPアドレス}
$ less ip-ranges.json | jq -r '.prefixes[].ip_prefix | "Require not ip " + .' | sort | uniq Require not ip 100.20.0.0/14 Require not ip 100.24.0.0/13 Require not ip 100.27.238.0/23 Require not ip 100.28.206.0/24 Require not ip 100.28.208.0/23 Require not ip 100.48.0.0/12 Require not ip 100.48.54.0/23 Require not ip 100.49.198.0/23 Require not ip 100.52.164.0/23 Require not ip 100.54.84.0/23 Require not ip 100.55.128.0/23 Require not ip 103.13.188.0/24 Require not ip 103.13.189.0/24 Require not ip 103.246.148.0/23
Step 4 : .htaccessに埋め込む。
<RequireAll>
Require all granted
Require not ip 100.20.0.0/14
Require not ip 100.24.0.0/13
Require not ip 100.27.238.0/23
Require not ip 100.28.206.0/24
Require not ip 100.28.208.0/23
Require not ip 100.48.0.0/12
# 以降、上記コマンドで生成されたテキストをここに入れる。
</RequireAll>
【4】応用
実運用時には、HTTPリクエスト受信の度にこれをやっていたらレスポンスが重くなる。
よって…
HTMLから付随的にロードされる画像ファイル、cssファイル、JSファイルなどのリクエストに対しては、このフィルターをスキップすることにする。
.htaccess 内で以下のように書けばよい。
<If "%{REQUEST_URI} !~ m#(?i)\.(jpg|jpeg|png|gif|svg|ico|webp|css|js|html|htm|pdf)(\?.*)?$#">
<RequireAll>
Require all granted
Require not ip 100.20.0.0/14
Require not ip 100.24.0.0/13
Require not ip 100.27.238.0/23
Require not ip 100.28.206.0/24
Require not ip 100.28.208.0/23
Require not ip 100.48.0.0/12
# 以降、上記コマンドで生成されたテキストをここに入れる。
</RequireAll>
</If>
【5】注意点
Amazonが公開する IPリストは随時更新されるとのこと。
たまに diffして更新されていれば .htaccess を書き換えないと…
もし root 権限があれば?
root権限があれば Apacheで以下のように NGリストファイルを include すればよいだけなのだが…
今回は共用サーバ上の話なのだ。残念…
<Directory /var/www/html>
AllowOverride All
</Directory>
Include /var/www/html/aws-block.conf