注) tinyhoneypotと組合せて使用する必要はもうなさそうです。
fail2banは不正アクセス履歴のあるIPアドレスを拒絶するファイヤーウォールです。設定ファイルの項目を見直すことで、より細かいフィルタリングができます。
tinyhoneypotはTCP/IP各ポートを監視し、アクセス元の詳細を記録します。
xinetdによりtinyhoneypotが動作、tinyhoneypotによる指定ポートを巧みに操作します。
まず、上記ソフトをインストールします。
sudo apt-get install tinyhoneypot fail2ban xinetd
設定
SSHの標準ポート番号を以下のコマンドで書換えます。
sudo sed -i.orig ‘s/Port 22/Port 2201/m’ /etc/ssh/sshd_config
/etc/ssh/sshd_configのSSHポートは22から2201に書換えられ、オリジナルは /etc/ssh/sshd_config.origとして保存されます。
SSHを再起動し、SSHのポート番号が変更されているかどうか確認して下さい。
sudo service ssh restart
sudo netstat -lptn | grep ssh
tcp 0 0 0.0.0.0:2201 0.0.0.0:* LISTEN 4313/sshd
tcp6 0 0 :::2201 :::* LISTEN 4313/sshd
xinetdの設定ファイルを作成、tinyhoneypotを起動しTCPのポート番号22を開放します。
sudo cp -v /usr/share/doc/tinyhoneypot/examples/xinetd.d/thp-pasv /etc/xinetd.d/
/etc/xinetd.d/thp-pasv を次のように編集します:
sudo pico /etc/xinetd.d/thp-pasv
# default: on
# description: thp-ftpd calls the generic thpsvcs with param "ftp",
# resulting in an ftpd emulation.
service thp-pasv
{
type = UNLISTED
socket_type = stream
protocol = tcp
port = 22
wait = no
user = thpot
server = /usr/sbin/thpot
server_args = nullresp
nice = 10
disable = no
instances = 1
per_source = 1
}
xinetdを再起動してポート番号22が開放されているか確認します。
sudo service xinetd restart
sudo netstat -lptn | grep xinetd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4567/xinetd
tinyhoneypotの動作確認
他のPCからSSHアクセスを試みます。
attacker@hackerpc:~$ ssh 192.168.88.212
何も表示されないので[Ctrl + C]を押して終了します。
アクセスログを確認します。
sudo cat /var/log/thpot/captures
Feb 29 13:02:10 SID=56D4334221165.nullresp PID=4837 SRC=192.168.88.242 SPT=47187 ET=00:00:11 BYTES=39
次のfail2banでこのログを参照することにより、SRCのIPアドレスからのアクセスを拒否します。
fail2banの設定
sudo cd /etc/fail2ban/
sudo cp -v jail.conf jail.local
jail.confは編集しないで下さい。jail.localにより設定事項を調整します。
[sshd]のセクションを以下のようにします。 2201は /etc/ssh/sshd_config で変更したポート番号です。
jail.localのjailセクションの箇所に入力して下さい。
[ssh]
enabled = true
port = 2201
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
次の[thp-ssh]セクションを追加します。fail2banがtinyhoneypotのログファイルを参照し、特定IPアドレスのアクセスを拒否する設定です。
[thp-ssh]
enabled = true
port = all
filter = thpot
logpath = /var/log/thpot/captures
banaction = iptables-allports
maxretry = 3
findtime = 1800
bantime = 99999
fail2banがログの中のアクセス元を特定するため、フィルターファイルが必要となります。以下作成します。
sudo pico /etc/fail2ban/filter.d/thpot.local
[Definition]
failregex = SRC=<HOST>
ignoreregex =
次に、fail2banを再起動して以下の動作確認をするのですが、ここでfail2banのロケール問題が発生するかもしれません。(サーバロケールが日本語の場合など)サーバロケールが英語であれば何も問題がないのですが、タイムスタンプが日本語だとログを読み取ってくれません。そこでロケールのLC_TIMEのフォーマットをPOSIXにします。
https://help.ubuntu.com/community/Locale
sudo pico /etc/default/locale
LANG=ja_JP.UTF-8
LC_TIME=POSIX
とし、サーバを再起動して下さい。
ロケールの見直しが不要であれば、fail2banを再起動します。
sudo service fail2ban restart
var/log/fail2ban.logを確認します。
2016-02-29 13:54:06,915 fail2ban.jail [6102]: INFO Creating new jail 'thp-ssh'
2016-02-29 13:54:06,915 fail2ban.jail [6102]: INFO Jail 'thp-ssh' uses pyinotify
2016-02-29 13:54:06,920 fail2ban.jail [6102]: INFO Initiated 'pyinotify' backend
2016-02-29 13:54:06,922 fail2ban.filter [6102]: INFO Added logfile = /var/log/thpot/captures
2016-02-29 13:54:06,923 fail2ban.filter [6102]: INFO Set maxRetry = 1
2016-02-29 13:54:06,925 fail2ban.filter [6102]: INFO Set findtime = 1800
2016-02-29 13:54:06,926 fail2ban.actions[6102]: INFO Set banTime = 99999
2016-02-29 13:54:06,934 fail2ban.jail [6102]: INFO Jail 'ssh' started
2016-02-29 13:54:06,940 fail2ban.jail [6102]: INFO Jail 'thp-ssh' started
必要であれば以下有効時間の設定を見直してみて下さい。
findtime = 1800
bantime = 99999
iptablesのルールを確認します。
sudo iptables-save
# Generated by iptables-save v1.4.21 on Mon Feb 29 14:05:17 2016
*filter
:INPUT ACCEPT [2:64]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:fail2ban-ssh - [0:0]
:fail2ban-thp-ssh - [0:0]
-A INPUT -p tcp -j fail2ban-thp-ssh
-A INPUT -p tcp -m multiport --dports 2201 -j fail2ban-ssh
-A fail2ban-ssh -j RETURN
-A fail2ban-thp-ssh -j RETURN
COMMIT
# Completed on Mon Feb 29 14:05:17 2016
他のPCから拒否されるか実際に確認してみます。
ssh 192.168.88.212
^C
ssh 192.168.88.212
ssh: connect to host 192.168.88.212 port 22: Connection refused
最初のコマンドでは何も起こりません。[Ctrl+C]で終了します。次のssh接続で拒否されるメッセージが表示されます。
iptablesのルールをもう一度確認します。
sudo iptables-save
# Generated by iptables-save v1.4.21 on Mon Feb 29 14:10:53 2016
*filter
:INPUT ACCEPT [4:542]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:88]
:fail2ban-ssh - [0:0]
:fail2ban-thp-ssh - [0:0]
-A INPUT -p tcp -j fail2ban-thp-ssh
-A INPUT -p tcp -m multiport --dports 2201 -j fail2ban-ssh
-A fail2ban-ssh -j RETURN
-A fail2ban-thp-ssh -s 192.168.88.242/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-thp-ssh -j RETURN
COMMIT
# Completed on Mon Feb 29 14:10:53 2016
アクセス元PCのIPアドレスが拒否されています。