ssh への不正アクセスを見ると結構な数が海外からだったりします。 というわけで、海外からの ssh へのアクセスを禁止して、 精神の安寧を保ちましょう。
最新APIを利用し、データベースの自動更新も行う場合は GeoIP2 ver. を御覧ください。
国の判定に、 geoip を使用した python スクリプトを利用し、 hosts_options が提供する aclexec (debian系列限定らしい) を利用して、実際に海外からの ssh アクセスを遮断します。
スクリプトの依存パッケージをインストール
apt を使って依存するパッケージをインストールします。
sudo apt-get install python-geoip
スクリプトの配置
python スクリプトは、 GeoIPでSSHに接続できる国を制限する のものをベースに多少改変させていただきました。 コードは以下のとおりです。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) | |
上記のコードを /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 件のコメント:
コメントを投稿