Amazon Linux mod_geoip 海外アクセスブロック

linux

本ブログの問い合わせフォームにspam投稿が多いのにいい加減うんざりしてきた。wordpressのpluginでのspam対策とかもあるみたいだけど、無償版でどの程度効果あるのかよくわからないし、問い合わせフォームへのアクセスIP調べてみたらほぼ海外っていうのが分かったのでgeoipでブロックしてやろうと思った。日本語サイトなんて日本人しか見ないだろう。。。
あとはcloudfrontで簡単にアクセス制御ができるみたいだけど、お金の考え方が勉強不足だったので、一旦スルー。またどこかの機会で。

事前確認

  • OS確認
# cat /etc/system-release
Amazon Linux release 2 (Karoo)
  • MW確認(マイナーバージョンは一応伏せときます)
# httpd -v
Server version: Apache/2.4.** ()
# apachectl -M | grep geoip
# ※無い
  • アクセス元のIP確認(問い合わせフォームへPOSTしてるIP)
# cat /var/log/httpd/access.log | grep POST | grep contact | awk '{print $1}' > /tmp/log
  • 海外IPか確認(表示が0件であれば全て海外IP)
# cat /tmp/log | while read line; do geoiplookup $line | grep JP; done

設定

mod_geoipはepelにあるのでそこからインストールする必要がある。特に何も触っていないAmazonLinuxであればyumでインストールしようとしても出てこないため、epelのレポジトリを追加してあげる必要がある。
「/usr/share/GeoIP/GeoIP.dat」があることは前提としている。

  • 以下は不要。失敗例。epel使えるようにするには別のコマンドを使えと。
# yum install epel-release
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
No package epel-release available.
Error: Nothing to do


epel-release is available in Amazon Linux Extra topic "epel"

To use, run
# sudo amazon-linux-extras install epel

Learn more at

Amazon Linux 2 FAQs
  • epelを使えるようにする
# yum repolist | grep epel
amzn2extra-epel/2/x86_64   Amazon Extras repo for epel

# amazon-linux-extras install epel

# yum repolist | grep epel
amzn2extra-epel/2/x86_64   Amazon Extras repo for epel                         1
epel/x86_64                Extra Packages for Enterprise Linux 7 - x8 13,438+227
  • mod_geoipのインストール
# yum search mod_geoip
mod_geoip.x86_64 : GeoIP module for the Apache HTTP Server

# yum install mod_geoip

# apachectl -M | grep geoip
 geoip_module (shared)
  • インストール直後に以下のようにファイルが生成されている
# cat /etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

# cat /etc/httpd/conf.modules.d/10-geoip.conf
LoadModule geoip_module modules/mod_geoip.so
  • 日本だけのIP許可に変更
    • 問い合わせフォームだけに限定
    • 限定させないとGoogleSearchCondoleとか正常bot君のアクセスも全部止めてしまう
# vi /etc/httpd/conf.d/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>

<LocationMatch /contact/>
  SetEnvIf GEOIP_COUNTRY_CODE JP AllowCountry
  Require all denied
  Require env AllowCountry
</LocationMatch>
  • apacheの再起動
# apachectl configtest
# apachectl restart

動作確認

  • 自宅PC、会社PC、スマホなどからアクセスして問題無いこと確認
  • 海外からのアクセスは以下のようなサイトから確認できる

その他

geoipのデータベースは、無償版でもユーザー登録が必要になっただとか。。。知らん間に。。。めんどくさい。ただ、ざっと調べた感じではdatを自動で更新してくれるsystemdがあるような無いような。今度調べてやってみよう。

コメント