本サイトは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を更新してから投稿すればよいです。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。