読者です 読者をやめる 読者になる 読者になる

Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

iptables で動的ホワイトリストの導入

fail2ban を導入 - Drafts で fail2ban を導入した。ブラックリストを中心とした運用だが接続者が少ないサーバなので無駄が多い。からといって、管理できる人も少ないので、出張中に入れないとなると問題になる。

というわけで、以下のような仕組みを考えた。

  • あるパスワード付のページにアクセス、アクセスに応じてIPアドレスがあるファイルに吐き出される。
  • Yo を使ってサーバーにあるスクリプトを実行させるとそのIPアドレスを読み取って iptablesssh の許可を追加する
  • 公開鍵認証で接続

良く使うIPはもとから /etc/hosts.allow に設定しておく。Ubuntu の場合は iptables が再起動時に無効化されるので注意が必要だが、この運用で追加される一時的なアドレスなら構わないだろう。

IPアドレスの取得は簡単。Python なら os.environ['REMOTE_ADDR'] で取れる*1

あとは fail2ban のブラックリストで書いた cat /etc/fail2ban/ip.blacklist | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done を変化させて、cat hogehoge/ip.whitelist | while read IP; do iptables -A dynamic-whitelist -s $IP -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT; doneを実行する*2

問題は Yo を受ける部分が nginx と python で書いたサービスに依存しているので、サーバをいじらなきゃいけない理由が nginx のフリーズとかの場合、役に立たなくなってしまう。cron と併用するとか工夫した方がイイ。

*1:CGI(Python) IPアドレス取得・表示(os.environ['REMOTE_ADDR'])

*2:dynamic-whitelistチェーンは先に作っておかなければならない