本サイトはWordPressで運営していて、org2blogパッケージを使ってEmacsのorg-modeから投稿しています。
org2blogはxmlrpcを使って投稿するのですが、不正アクセスの温床になっています。
実際、僕も海外から不正アクセスが多発したため、サーバからアクセス制限を喰らい一時的に投稿できませんでした。
対策としては.htaccessに自分のIPアドレス以外からの投稿をできなくることです。
<Files xmlrpc.php> Order Deny,Allow Deny from all Allow from 12.34.56.78 </Files>
これで負荷問題はなくなりましたが、プロバイダ側が自分のIPアドレスを突然変更したため、投稿できなくなりました。
数ヶ月の間をおいて、忘れた頃に変更するので油断なりません。
そこで自分のIPアドレスを求めて.htaccessをスクリプトをcronで動作させることにしました。
#!/usr/bin/env ruby ip = `ifconfig`.scan(/inet ([0-9.]+)/).flatten.find{|ip| ip !~ Regexp.union("192.168.", "127.0.0.1")} htaccess = <<AAA # DO NOT EDIT! Generated by ~/bin/my-ip-address.rb #{Time.now} <Files xmlrpc.php> Order Deny,Allow Deny from all Allow from #{ip} </Files> AAA open("/mnt/server/public_html/.htaccess","w"){|f| f.print htaccess}
IPアドレスはこのように求めています。
$ ifconfig eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 12.34.56.78 netmask 255.255.254.0 broadcast 255.255.255.255 inet6 fe80::96de:80ff:fe77:1ab2 prefixlen 64 scopeid 0x20<link> ether 94:de:80:77:1a:b2 txqueuelen 1000 (イーサネット) RX packets 35830362 bytes 36475910211 (33.9 GiB) RX errors 2 dropped 0 overruns 0 frame 1 TX packets 26679880 bytes 3056052042 (2.8 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 20 memory 0xf0500000-f0520000 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (ローカルループバック) RX packets 823793 bytes 348678215 (332.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 823793 bytes 348678215 (332.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfigの出力が上記のようになっているのでString#scanでIPアドレスを求め、192.168.X.Xや127.0.0.1を除外したものを自分のIPアドレスにしています。
`ifconfig`.scan(/inet ([0-9.]+)/).flatten. find{|ip| ip !~ Regexp.union("192.168.", "127.0.0.1")}
cronを使わない場合は、WordPress投稿前にIPアドレスの変更の有無を確認し、変更があった場合に.htaccessを更新してから投稿すればよいです。
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。