iptablesのownerモジュールでクローラを安全に運用する話

RSSリーダーとかブックマークサービスとかアクセス統計サービスとかを作っていると、クローラの運用は必須。クローラは保護したいから、当然DMZに設置する。でもクローラがDMZ内にある他のホストにアクセスできちゃうとまずいわけで。

で、クローラからのアクセス先を制限する方法として、自分はいままで、squid なのでプロキシを立てて、クローラは必ずプロキシを使うように設定し、かつ、プロキシの設定で DMZ 内へのアクセスを弾くようにしていた。でも DNS Pinning 系の攻撃とかも考えて設定するのは面倒なわけで。

もっと楽な方法がないのかなと irc で聞いたら、id:hirose31 さんが iptables の owner モジュールでできるよ、と教えてくれた。ありがとうございます。

たとえばクローラを uid:crawler で動かすなら、

# sbin/iptables -A OUTPUT -m owner --uid-owner crawler -d 10.0.0.0/8 -j REJECT --reject-with icmp-host-prohibited

のように設定すれば、クローラ (正確にはuid:crawlerで動くプロセス) から 10.0.0.0/8 へはアクセス不可能になる。実際に試してみると、こんな感じ。

$ telnet 10.xx.xx.xx 22
Trying 10.xx.xx.xx...
Connected to 10.xx.xx.xx (10.xx.xx.xx).
Escape character is '^]'.
SSH-2.0-OpenSSH_5.1p1 Debian-6ubuntu2
^]
telnet> quit
Connection closed.
$ sudo -u crawler telnet 10.xx.xx.xx 22
Password: 
Trying 10.xx.xx.xx...
telnet: connect to address 10.xx.xx.xx: No route to host
telnet: Unable to connect to remote host: No route to host
$ 

これは便利!