Processing math: 100%

highlight.pack.js

2014年5月3日土曜日

Ubuntu で日本以外からのSSHアクセスを拒否する (legacy version)

ssh への不正アクセスを見ると結構な数が海外からだったりします。 というわけで、海外からの ssh へのアクセスを禁止して、 精神の安寧を保ちましょう。

最新APIを利用し、データベースの自動更新も行う場合は GeoIP2 ver. を御覧ください。

国の判定に、 geoip を使用した python スクリプトを利用し、 hosts_options が提供する aclexec (debian系列限定らしい) を利用して、実際に海外からの ssh アクセスを遮断します。

スクリプトの依存パッケージをインストール

apt を使って依存するパッケージをインストールします。

sudo apt-get install python-geoip

スクリプトの配置

python スクリプトは、 GeoIPでSSHに接続できる国を制限する のものをベースに多少改変させていただきました。 コードは以下のとおりです。

#!/usr/bin/python
import os, sys, traceback
import GeoIP
ALLOW = 1
DENY = 0
when_error = ALLOW
def rule(code):
if code == "JP": return ALLOW
if code == None: return ALLOW
return DENY
exitcode = when_error
try:
log = os.popen("logger -t geoip/check -p daemon.notice", "w")
logerr = os.popen("logger -t geoip/check -p daemon.err", "w")
sys.stdout = log
sys.stderr = logerr
if len(sys.argv) != 2:
sys.stderr.write("Usage: %s ipaddress\n" % sys.argv0
)
sys.exit(0)
addr = sys.argv1
gi = GeoIP.new(GeoIP.GEOIP_STANDARD)
code = gi.country_code_by_addr(addr)
exitcode = rule(code)
print "%s %s %s" % (addr, code, exitcode == ALLOW and "allow" or "deny")
except SystemExit:
pass
except:
traceback.print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)
sys.exit(exitcode)
view raw check-legacy hosted with ❤ by GitHub

上記のコードを /opt/geossh/check-legacy と配置し、

sudo chmod +x /opt/geossh/check-legacy
で、実行可能にしてあげます。

スクリプトの動作確認

/opt/geossh/check-legacy 127.0.0.1; echo $?
などのように適当なIPアドレスを引数として渡して実行し、リターンコードを見て動作を確認して下さい。 もし、日本ならば 1 を返し、それ以外の国の場合は 0 を返すようになっています。

現在自分が使っているグローバルIPアドレスを入力した時に 1 を返すことを確認するのを 忘れないようにしてください。

hosts.deny の設定

以下の設定を、 /etc/hosts.deny に加えてください。

sshd: ALL: aclexec /opt/geossh/check-legacy %a

この方法では、 hosts.deny でさらに国内の特定のホストからのアクセスも制限するといったことも出来ます。

よい ssh ライフを!!

0 件のコメント:

コメントを投稿