(164) AWSからの攻撃再び…

投稿者: | 2026年4月14日

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 オプションでこれを除去する。

rraw 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

アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済
  • 2026-04-19: 4回
  • 2026-04-18: 2回
  • 2026-04-17: 5回
  • 2026-04-16: 5回
  • 2026-04-15: 2回
  • 2026-04-14: 9回
  • 2026-04-13: 0回
  • コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です


    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)