apacheのログを転用してipsetを更新

前にこっちの記事でshorewallを利用してiptablesをipsetと連携させる話を書きました。

shorewallのルールにipsetのセットを指定する


今回は、そこにApacheを連携させて接続元IP制限の簡易的な認証システムを提案します。

どうしてそんな変なことを思いついたかというと、ipsetのmanを見ていてこの部分が気になったからです。

– If a dash is specified as command, then ipset enters a simple interactive
mode and the commands are read from the standard input. The interactive
mode can be finished by entering the pseudo-command quit.

コマンドの代わりにダッシュ「-」を指定すると、標準入力から読んで実行してくれるんだそうです。これは利用するしかない。

そしてWebサーバで常にroot権限で起動しているサービス、それはApache。そう、Apacheの親プロセスは80番ポートを開く関係上rootですし、ログの出力は諸般の事情からroot権限で行われているのです。Apacheのログ出力ではプログラムを起動して標準入力に流し込む機能があるので、今回はそこにipsetを設定します。こんな感じ

CustomLog "|/usr/sbin/ipset -" "add sshok %a -!" env=sshokuser

これで、環境変数にsshokuserが設定されている場合はログとして「add sshok IPアドレス -!」というコマンドがipsetへ流し込まれます。それでsshokセットに接続元IPが追加されるという仕組み。

もちろん、無制限で環境変数を設定していたら意味がありません。BASIC認証でもかけて、ランダムなURLにしておきましょう。

<Directory /path/to/doc_root/sshok/>
        AuthType Basic
        AuthName "Secret Zone"
        AuthUserFile /path/to/httpd/htpasswd.sshok
        Require valid-user
        RewriteEngine on
        Rewritecond %{REMOTE_USER} tezuka
        RewriteRule ^randomefile.html$ - [E=sshokuser:1]
</Directory>

意味が分からない人は勉強してね。これでBASIC認証を抜けてランダムなURLへアクセスした人にだけsshokuserという環境変数が設定されるはずです。その環境変数が設定されていると、さっきのCustomLogが反応して、接続元IPがSSH接続を許可される、という仕組みです。

そんな感じで、ipsetはなかなか楽しませてくれそうです。