海外からのスパムアタックを防ぐために対象フォルダの「.htaccess」をカスタマイズして日本国内IPアドレスのみ閲覧可能にしました

この記事は約8分で読めます。

海外IPアドレスをブロックWEBサイトに設置したメルマガシステム(ACmailer)に海外からの不正なアクセスが増えています。いくつかのサイトで確認しました。オリンピック開催年は不正なアクセスが増加する傾向があるので要注意です。
エックスサーバーやさくらインターネットだと海外IPブロックというWAF機能があるのでさほどでもないのですが、バリュードメイン/コアサーバーにはWAFがないためか、かなりのアタックがあります。そこで、海外からのスパムアタックを防ぐためにメルマガのシステムが入っている対象フォルダにある「.htaccess」をカスタマイズして日本国内IPアドレスのみ閲覧可能にしました。これで海外IPアドレスからのアタックをある程度抑止できます。

海外IPアドレスからの閲覧を許可しない設定にする

メルマガに不正登録された海外ドメインのメール

ACmailerには、「ダブルオプトイン機能」があるので、ダブルオプトイン機能を使っておけばいきなり海外アドレスメールが登録されることはありません。

無料メルマガシステムの「ACmailer」はGmailの迷惑メール対策でver4.1.0にアップデートされています
無料メルマガシステムの「ACmailer」を利用していて、2月以降に送ったメルマガが届かない...という場合はシステムのアップデートをしましょう。 「ACmailer」は1月にver4.1.0が発表されています。このバージョンでは、主にGmailの迷惑メール対策がされています。Googleは2024年2月以降に迷惑メール対策を強化しているため、それまで届いていたメールが届かないということが多数起き...
メルマガ登録画面から不正に連続登録するスパムが起きた場合の対処方法はダブルオプトイン機能が有効です
メールマガジン(いわゆるメルマガ)を運営していると、不正な連続登録を受けることがあります。攻撃者がハッキング先サイトを探すさいにも実施されるようです。 登録されるメールアドレスは存在しないドメインやアドレスだったり、不正に取得した他人のアドレスだったりします。 このようなアタックを受けたら、メルマガ運営者はシステム側でなんらかの防御対策をしたほうがいいです。

そこで、ACmailerに不正登録された海外ドメインのメールアドレスがないかどうかを確認します。

この実例はすべて海外ドメインのメールでした。海外の日本人が登録したということもありえますが実際にはほぼスパムでしょう。「ダブルオプトイン機能」をオンにすると「仮登録データ一覧」というところにメルマガ登録しようとしたメールアドレスが格納されますが、このサイトでは2200件以上ありました。

上記の10件は、「ダブルオプトイン機能」をすり抜けて不正登録されたものだと思われます。

このサイトのレンタルサーバーはバリュードメイン/コアサーバーですので、海外IPアドレスのブロック機能がコントロールパネルにはありません。

そこで、メールマガのフォルダに設置してある「.htaccess」をカスタマイズして、海外からのアクセスを許可しない設定にしました。

設置した「.htaccess」の内容

設置したのは以下ののような内容の「.htaccess」です。

<RequireAll>
Require all granted
# Allow from local network (optional)
Require ip 192.168.0.0/16
# Deny from all other countries
# For example, deny all IPs not in Japan
# Japan IP ranges (example ranges, adjust as needed)
<RequireAny>
Require ip 1.0.16.0/20
Require ip 1.0.64.0/18
# (add more ranges as needed)
</RequireAny>
</RequireAll>
#end

この「.htaccess」の解説を日本語にしました

この「.htaccess」をもう少しカスタマイズすることにしました。

・コメント行の解説を日本語にしました
・Require ip 192.168.0.0/16の行を削除しました。

Require ip 192.168.0.0/16という内容は、社内LANからのアクセスを許可するという意味なので、削除しました。

<RequireAll>
Require all granted
# 他のすべての国からのアクセスを拒否
# 例えば、日本以外のすべてのIPを拒否
# 日本のIP範囲(例としていくつかの範囲、必要に応じて調整)
<RequireAny>
Require ip 1.0.16.0/20
Require ip 1.0.64.0/18
# (必要に応じて他の範囲を追加)
</RequireAny>
</RequireAll>
#end

10時間以上経過した段階で、不正なメールアドレス登録も「仮登録データ一覧」の登録も0になりました。とりあえず機能しているようでよかったです。

日本のIPアドレスをもっとカバーするようにしました

さて、動作テストがうまくいったので、あらためて上記の設定のままで日本国内のIPアドレスがちゃんとカバーできているかどうかを調べました。

調査するサイトは以下のとおりです。

Japan IP Address Ranges
Complete list of IP address ranges in Japan. The data source is IP2Location DB1 LITE database.
Full List Of IP Ranges - IPInfo.io
Quickly browse through all public IPv4 addresses by selecting an IP range below, or alternatively browse IP ranges by country.

この段階でChatGPTに投げて、「.htaccess」をさらにカスタマイズしました。

上記の画像にある内容を少し修正して以下の内容にしました。

<RequireAll>
Require all granted
# 日本以外の国からのアクセスを拒否
# 日本のIP範囲(例としていくつかの範囲、必要に応じて調整)
<RequireAny>
Require ip 1.0.16.0/20
Require ip 1.0.64.0/18
Require ip 1.1.64.0/18
Require ip 1.21.0.0/16
Require ip 1.33.0.0/16
Require ip 1.66.0.0/16
Require ip 1.72.0.0/16
Require ip 1.73.0.0/16
Require ip 1.75.0.0/16
Require ip 1.76.0.0/16
Require ip 1.78.0.0/16
Require ip 1.79.0.0/16
# (必要に応じて他の範囲を追加)
</RequireAny>
</RequireAll>
#end

この「.htaccess」で運用してみることにします。

補足:CIDR(サイダー)表記について

CIDR(Classless Inter-Domain Routing)は、IPアドレスの範囲を効率的に表現するための方式です。以下に、CIDR表記の意味と、その範囲がどのように計算されるかをステップバイステップで解説します。

CIDR表記の基本

CIDR表記は、IPアドレスとサブネットマスクを一体化して表現します。例えば、1.0.16.0/20 という形式です。ここで、

  • 1.0.16.0 はネットワークアドレス
  • /20 はサブネットマスクのビット長(プレフィックス長)

ステップ1: IPアドレスの理解

まず、IPアドレス 1.0.16.0 をバイナリ形式に変換します。

rust

1.0.16.0 の各オクテットをバイナリに変換すると:
1 -> 00000001
0 -> 00000000
16 -> 00010000
0 -> 00000000
つまり、1.0.16.0 は:
00000001.00000000.00010000.00000000

ステップ2: サブネットマスクの適用

/20 というサブネットマスクは、上位20ビットがネットワーク部分で、残りの12ビットがホスト部分を表します。

ネットワーク部分(20ビット):

00000001.00000000.0001

ホスト部分(12ビット)は全て0です。

ステップ3: 範囲の計算

ネットワーク部分を固定して、ホスト部分の範囲を計算します。ホスト部分の12ビットは、0 から 111111111111 まで(10進数で0から4095)です。

  1. 開始アドレス(ネットワークアドレス)
    • 全てのホストビットが0の場合、1.0.16.0 です。
  2. 終了アドレス(ブロードキャストアドレス)
    • 全てのホストビットが1の場合、1.0.31.255 です。

    計算の詳細:

    • 最後の12ビットを全て1にすると、最上位20ビットに最下位12ビットを追加して計算します。

    ruby

    00000001.00000000.00011111.11111111
    ->
    1.0.31.255

結論

1.0.16.0/20 の範囲は、1.0.16.0 から 1.0.31.255 までのIPアドレスをカバーします。

追加情報

サブネットマスクのプレフィックス長が大きいほど、ネットワーク部分が増え、ホスト部分が減ります。たとえば、/24 ならばホストビットは8ビット(256アドレス)、/16 ならばホストビットは16ビット(65536アドレス)となります。

このように、CIDR表記を使うことで、効率的にIPアドレスの範囲を指定することができます。

上記の「.htaccess」にはサイダー表記が使われています。

「.htaccess」にIPv6のサイダー情報を追加可能

なお、この「.htaccess」はIPV4の設定しかしてありません。その場合のIPV6のアクセスがどうなるかですが、通常Apacheは特定のアクセス制限が設定されていないIPアドレスからのアクセスを許可します。そのため、IPv6の制限が.htaccessファイルに記述されていない場合、IPv6アドレスからのアクセスは許可されるはずです。

いずれ、IPV6の追記が必要になるかもしれませんね。

ちなみに、日本国内のIPV6のアクセスを許可する場合は以下のような記述になります。

<RequireAll>
Require all denied
# 日本のIPv6アドレス範囲を許可(例としていくつかの範囲を記載、必要に応じて追加)
<RequireAny>
Require ip 2400:8500::/32
Require ip 2402:6b00::/32
Require ip 2404:7a80::/32
Require ip 2406:da00::/32
Require ip 2407:c800::/32
Require ip 2408:4000::/32
# (必要に応じて他の範囲を追加)
</RequireAny>
</RequireAll>

だんだん複雑になっていきますね。
できればこのようなことはサーバー側で対応してほしいものです。