サーバ内のsecureログをなんとなく確認してたら、見慣れないのIPがssh接続を試みた形跡が出力されていました。しかも秒単位で。怖いですね。

Jan 10 12:38:33 isamike sshd[3692]: Received disconnect from 40.78.158.75: 11: Bye Bye
Jan 10 12:38:34 isamike sshd[3697]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=40.78.158.75  user=root
Jan 10 12:38:37 isamike sshd[3697]: Failed password for root from 40.78.158.75 port 1144 ssh2
Jan 10 12:38:37 isamike sshd[3698]: Received disconnect from 40.78.158.75: 11: Bye Bye
Jan 10 12:38:38 isamike sshd[3706]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=40.78.158.75  user=root
Jan 10 12:38:40 isamike sshd[3706]: Failed password for root from 40.78.158.75 port 1168 ssh2
Jan 10 12:38:41 isamike sshd[3707]: Received disconnect from 40.78.158.75: 11: Bye Bye
Jan 10 12:38:42 isamike sshd[3716]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=40.78.158.75  user=root
Jan 10 12:38:44 isamike sshd[3716]: Failed password for root from 40.78.158.75 port 1169 ssh2
Jan 10 12:38:44 isamike sshd[3718]: Received disconnect from 40.78.158.75: 11: Bye Bye
Jan 10 12:38:45 isamike sshd[3721]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=40.78.158.75  user=root
Jan 10 12:38:48 isamike sshd[3721]: Failed password for root from 40.78.158.75 port 1170 ssh2
Jan 10 12:38:48 isamike sshd[3723]: Received disconnect from 40.78.158.75: 11: Bye Bye

セキュリティ対策をしていないサーバは3日以内に不正アクセスされる、という噂はあながち間違いではないように思います。

このサーバはroot直ログインは禁止しているので上記に関しては問題無いのですが、apacheやメールログでも不正アクセスを試みている形跡がいくつかありました。不正アクセスが成功しなくても、秒単位のアクセスはサーバの負荷に繋がるので、対策しなくてはいけないようです。

webで調べたところ、fail2banが良さそうです。ログをチェックして、設定したフィルタにマッチしたIPをiptablesで拒否するものです。早速使ってみます。

インストール

epelパッケージ内にあるとのこと。

うちのサーバ(さくらVPS、CentOS 6.7)では既にインストールされていました。

# rpm -Uhv --test http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Preparing...                ########################################### [100%]
        package epel-release-6-8.noarch is already installed
#

yumでインストール

yum install --enablerepo=epel fail2ban

バージョンは0.9.3-1でした。

設定

/etc/fail2banディレクトリが作成され、配下にファイルがあります。

まずはfail2ban.confで全体の設定。

# diff -u fail2ban.conf.a16011301 fail2ban.conf
--- fail2ban.conf.a16011301     2015-10-18 00:29:52.000000000 +0900
+++ fail2ban.conf       2016-01-13 15:13:40.055675321 +0900
@@ -32,7 +32,8 @@
 #         (e.g. /etc/logrotate.d/fail2ban on Debian systems)
 # Values: [ STDOUT | STDERR | SYSLOG | FILE ]  Default: STDERR
 #
-logtarget = SYSLOG
+#logtarget = SYSLOG ←★コメントアウト
+logtarget = /var/log/fail2ban/fail2ban.log ←★ログをfail2ban.logに出力するようにする

 # Option: syslogsocket
 # Notes: Set the syslog socket file. Only used when logtarget is SYSLOG
#

次に動作設定を行ないます。jail.confで動作を設定し、filter.d配下のファイルでフィルターを設定する感じです。

動作の一括設定。fail2ban.confの上の方変更箇所だけ。

# diff -u jail.conf.a16011301 jail.conf
--- jail.conf.a16011301 2015-10-18 00:29:52.000000000 +0900
+++ jail.conf   2016-01-13 15:57:27.648701879 +0900
@@ -56,14 +56,14 @@
 ignorecommand =

 # "bantime" is the number of seconds that a host is banned.
-bantime  = 600
+bantime  =  3600 ←★banする時間(秒)

 # A host is banned if it has generated "maxretry" during the last "findtime"
 # seconds.
-findtime  = 600
+findtime  = 3600 ←★findtime中にmaxretryに達したらban。

 # "maxretry" is the number of failures before a host get banned.
-maxretry = 5
+maxretry = 3 ←★findtime中にmaxretryに達したらban

 # "backend" specifies the backend used to get files modification.
 # Available options are "pyinotify", "gamin", "polling", "systemd" and "auto".
@@ -94,7 +94,7 @@
 #        but it will be logged as a warning.
 # no:    if a hostname is encountered, will not be used for banning,
 #        but it will be logged as info.
-usedns = warn
+usedns = no ←ホスト名のものをbanするか。とりあえずnoにしてみました。

 # "logencoding" specifies the encoding of the log files handled by the jail
 #   This is used to decode the lines from the log file.

動作の個別設定。fail2ban.confの下の方。今回はsshd。個別に数値を設定したいものはここに記載します。とりあえずsshdの設定を有効にします。

# JAILS
#

#
# SSH servers
#

[sshd]
enabled  = true ←★追加で有効化。
port    = ssh
logpath = /var/log/secure

あと、postfix-saslとdovecotも有効にします。postfix-saslは、なんか2時間に1回アクセスしてくるログがあったので、findtimeを43200秒(12時間)に設定してみます。ここら辺はログを見て調整が必要みたいですね。

プロセス起動。自動起動は最初からonでした。

># /etc/init.d/fail2ban start
Starting fail2ban:                                         [  OK  ]
#

# /etc/init.d/fail2ban start
Starting fail2ban:                                         [  OK  ]
# /etc/init.d/fail2ban status
fail2ban-server (pid  5445) is running...
Status
|- Number of jail:      3 ←★有効にした項目数
`- Jail list:   dovecot, postfix-sasl, sshd ←★有効にした項目
# chkconfig --list fail2ban
fail2ban        0:off   1:off   2:off   3:on    4:on    5:on    6:off
#

あと、設定項目を見直していたら、複数回banされたIPを長期banにする項目「recidive」も用意されていましたので、設定してみました。

以下は、【/var/log/fail2ban/fail2ban.log】を見て、一日の間に2回banされたら、一週間banするというものです。

[recidive]
enabled  = true
logpath  = /var/log/fail2ban/fail2ban.log 
banaction = iptables-allports 
bantime  = 604800  ; 1 week 
findtime = 86400   ; 1 day 
maxretry = 2

とりあえず様子を見ます。

後日

iptablesを見てみると、「recidive」の項にbanされたIPがありました。

Chain f2b-recidive (1 references)
target     prot opt source               destination
REJECT     all  --  222.82.212.75        0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  24.121.225.29        0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  200.87.139.157       0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  182.74.90.5          0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  198.74.100.10        0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  116.246.27.153       0.0.0.0/0           reject-with icmp-port-unreachable
REJECT     all  --  185.130.5.240        0.0.0.0/0           reject-with icmp-port-unreachable</pre>

banの際、どんな感じで動作していたのか見たいので、222.82.212.75がban時された時のfail2banのログを見てみます。

<pre class="lang:vim decode:true " ># cat /var/log/fail2ban/fail2ban.log |grep 222.82.212.75
2016-01-20 01:27:45,318 fail2ban.filter         [5977]: INFO    [sshd] Found 222.82.212.75
2016-01-20 01:27:45,326 fail2ban.filter         [5977]: INFO    [sshd] Found 222.82.212.75
2016-01-20 01:27:47,151 fail2ban.filter         [5977]: INFO    [sshd] Found 222.82.212.75
2016-01-20 01:27:47,871 fail2ban.actions        [5977]: NOTICE  [sshd] Ban 222.82.212.75
2016-01-20 01:27:47,878 fail2ban.filter         [5977]: INFO    [recidive] Found 222.82.212.75
2016-01-20 02:27:48,355 fail2ban.actions        [5977]: NOTICE  [sshd] Unban 222.82.212.75
2016-01-20 02:36:32,015 fail2ban.filter         [5977]: INFO    [sshd] Found 222.82.212.75
2016-01-20 02:36:32,024 fail2ban.filter         [5977]: INFO    [sshd] Found 222.82.212.75
2016-01-20 02:36:33,746 fail2ban.filter         [5977]: INFO    [sshd] Found 222.82.212.75
2016-01-20 02:36:34,197 fail2ban.actions        [5977]: NOTICE  [sshd] Ban 222.82.212.75
2016-01-20 02:36:34,200 fail2ban.filter         [5977]: INFO    [recidive] Found 222.82.212.75
2016-01-20 02:36:34,992 fail2ban.actions        [5977]: NOTICE  [recidive] Ban 222.82.212.75
2016-01-20 03:36:34,629 fail2ban.actions        [5977]: NOTICE  [sshd] Unban 222.82.212.75
#

[sshd]で3回引っかかってban。[sshd]で2回banで[recidive]に引っかかってban。うまく動作しているようです。

ひとまず以上で設定完了ですが、apache関連のフィルタ設定がまだなので、引き続き設定していこうと思います。