facebookのIPがmod_geoipで拒否される対応

こんにちは。プラットフォームの小宮です。

apacheのmod_geoipモジュールで海外を拒否してみたところ、
Facebookの画像が表示されないということで対応しました。

・whoisが必要だが入ってなかったので他の入ってるサーバでパッケージ名を調べて導入

[shell]$ which whois
/usr/bin/whois
# rpm -qf /usr/bin/whois
jwhois-3.2.2-1

# yum install jwhois
Installed:
jwhois.x86_64 0:4.0-19.el6
# which whois
/usr/bin/whois[/shell]

・fb公式で許可リスト取得方法を確認
以下のコマンドで定期的に更新リストを取得せよと公式に書いてある。
App Security – Facebook開発者

[shell]# whois -h whois.radb.net — ‘-i origin AS32934’ | grep ^route:|awk ‘{print $2}’
204.15.20.0/22
69.63.176.0/20
~略~
69.63.184.0/21
66.220.144.0/20
69.63.176.0/20[/shell]
※65ブロックくらいだった。手作業はあり得ないので何とか自動化を試みる。

・設定追加方法の検討
この辺に追記できるか考えてみる。
[shell]# cat /etc/cron.monthly/geoip
#!/bin/bash
wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
mv -f GeoIP.dat /usr/share/GeoIP/GeoIP.dat[/shell]

datはバイナリなので自分で追記は困難。軽くググってもそんなことしてる人いない。
[shell]# file /usr/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIP.dat: data[/shell]

apacheのAllow from等で設定するしかなさそうな模様

SetEnvIfでいけないか調べてみる参考:
ApacheのAllow, Denyディレクティブでand条件したい – (ひ)メモ

SetEnvIf Remote_Addr でPassCountryというenvにしとけばいいかもしれないと思ったが
Remote_AddrにCIDERが指定できるか微妙。たぶんできない。
apache – Redirect a range of IPs using RewriteCond – Stack Overflow

もしくは
Includeは、
「 Include によって挿入された設定は 挿入しているファイルの Include ディレクティブの位置にあったかのように扱われます。」
とセクションのマージ方法に書いてあった。
セクションの設定 – Apache HTTP サーバ
なのでAllow from を書いたファイルを別にして適宜必要な位置で読み込む感じにするのが現実的と考えられる。

/etc/cron.monthly/geoipに以下を追記する方向で。

[shell]whois -h whois.radb.net — ‘-i origin AS32934’ | grep ^route:|awk ‘{print $2}’|sed -e ‘s/^/Allow from /g’ > /etc/httpd/conf/extra/allow_fb_ip[/shell]

でAllow from env=PassCountryの下に
[shell]Include conf/extra/allow_fb_ip[/shell]
と書くことにする。

・設定追加
[shell]# cp -p /etc/httpd/conf/extra/*****.com.conf{,.date +%Y%m%d}
# vi /etc/httpd/conf/extra/*****.com.conf
<Directory "/home/***-web/public_html">
AllowOverride All
Order deny,allow
Deny from all
<IfModule mod_geoip.c>
GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE JP PassCountry
</IfModule>
Allow from env=PassCountry
Include conf/extra/allow_fb_ip ←★ここ追加
</Directory>

# diff /etc/httpd/conf/extra/*****.com.conf{,.date +%Y%m%d}
# apachectl configtest
Syntax OK
# apachectl graceful
# netstat -lnpt
# tail -f /var/log/httpd/20131108_access_log
# tail -f /var/log/httpd/20131108_error_log[/shell]

関係ありそうなログはない。
他も同様に設定を行う。

geoipに関しては、他に以下のconfigがある
[shell]# cat /etc/httpd/conf.d/geoip.conf
LoadModule geoip_module modules/mod_geoip.so

<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>[/shell]

FBの画像が表示できたかは開発側に確認してもらって大丈夫だった模様。

/etc/cron.*はcentos6からanacronによりランダムになってるらしいけど
anacronは止めてた気がするのでcrontabに書くことにする

[shell]# mv /etc/cron.monthly/geoip /opt/bin/

# crontab -e
## geoip database update
3 0 * * * /opt/bin/geoip[/shell]
(最初月次にしてたけど日次にしてという要望があり修正しました)
OSSはアルミニウムの翼で飛ぶ: RHEL6 (7)cronとanacron

以上、見ていただいてありがとうございました。

おすすめ記事