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なども同じ方法で国別に制限をかけることが可能。

*1:brute force対策としてはパスワードでのログインを禁止するのがベストだが、いろんな事情で禁止できないケースもある。またiptables -m recentで一定時間内に接続試行できる回数を制限するのも有効。