GeoIPでSSHに接続できる国を制限する
自分たちの管理するシステムは日本国内からしかログインしないので、国外からのSSH接続を拒否するのは理に適っている*1。
Debianベースのシステムでは/etc/hosts.allowでaclexecオプションを使うことにより、外部コマンドを実行してアクセス可否を判定することができる。今回はこれを使ってGeoIPデータベースで接続元の国を判別する方法を実装してみた。
まずはGeoIPデータベースのアップデートから。フリーのデータベースは月に1度更新されるらしい。このスクリプトをcronで毎日実行し、更新されていたら取得する。(スクリプトと同じディレクトリに保存される)
/etc/hosts.allowは以下のように設定する
ALL: 無条件に許可するIPがあればここに記述 sshd: ALL: aclexec /usr/local/geoip/check %a
/etc/hosts.denyは以下のようにして、許可されなかった接続を拒否する。
sshd: ALL
aclexecで読んでいるスクリプトはこれ。
rule関数でルールを決める。ここでは日本と判定不能なケースを許可している。
どちらのスクリプトもsyslogにログを出力する。
ftpdなども同じ方法で国別に制限をかけることが可能。