サーバ内の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関連のフィルタ設定がまだなので、引き続き設定していこうと思います。