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 Allow from env=PassCountry Include conf/extra/allow_fb_ip ←★ここ追加
# 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 [/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
以上、見ていただいてありがとうございました。