fail2ban を導入 - Drafts で fail2ban を導入した。ブラックリストを中心とした運用だが接続者が少ないサーバなので無駄が多い。からといって、管理できる人も少ないので、出張中に入れないとなると問題になる。
というわけで、以下のような仕組みを考えた。
- あるパスワード付のページにアクセス、アクセスに応じてIPアドレスがあるファイルに吐き出される。
- Yo を使ってサーバーにあるスクリプトを実行させるとそのIPアドレスを読み取って iptables に ssh の許可を追加する
- 公開鍵認証で接続
良く使う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チェーンは先に作っておかなければならない