最近各所でセキュリティインシデントが起こっているので、セキュリティ強化が求められている。もちろん外から SSH できるようなサーバには公開鍵認証しか許していないが、それでもアクセス制限などをしておいた方がイイかもしれないと思い、調べてみた。
本当に問題のあるアクセスは来ているか
/var/log/auth.log
を tail -n 100 /var/log/auth.log | grep "POSSIBLE BREAK-IN ATTEMPT"
みたいなコマンドで覗いてみるとけっこうよろしくないアクセスが来ている。もちろん突破されているようなログは見当たらなかった。
使うツール
denyhosts というのがある*1。でもいろいろ更新がストップしていて、セキュリティ対策に使うのには望ましくなさそう。そこで、Fail2ban を使うことにした*2
jail.conf の設定変更は jail.local に設定する(2018/04/13 追記)
Ubuntu を 18.04 に upgrade したら fail2ban が起動に失敗していた。 sudo service fail2ban status
のエラーログなどを見ていると、どうも jail.conf の設定を引き継いで upgrade したのだが、jail.conf の仕様自体が3年前からは変わっていて、conf 自体をそのまま引き継ぐと設定項目の変化に追従できずに起動失敗しているようなのだ。一個一個確認もしたのだが、そもそも fail2ban にはこういう事態を避ける機構が備わっている。
つまり、
# Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.:
と最新のjail.confには書かれている。 そのため、以下「時間の設定」と「ホワイトリスト」については jail.local ファイルに
[DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not # ban a host which matches an address in this list. Several addresses can be # defined using space separator. ignoreip = 127.0.0.1/8 10.0.0.0/8 # "bantime" is the number of seconds that a host is banned. bantime = -1 # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 86400 maxretry = 3
と書き込んでいる。(さらにdestemail もここに一応書き込んでいる) 参考: Proper fail2ban configuration - GitHub Wiki
それでもいろんな設定の引継ぎの問題から、基本的にはupgrade時に設定を引き継いで、適宜最新のconfファイルをgithubあたりから取ってきて上書きする方法で良いと思う。
時間の設定
/etc/fail2ban/jail.conf
に禁止する時間 bantime や試行回数をカウントする時間 findtime が設定されているが、デフォルトは 600 秒と非常に短いので、前者を -1 後者を 86400 にした。-1 にすることで永久 ban になるようだ(参考: Permanent block of IP after n retries using fail2ban - Server Fault)
ホワイトリスト
/etc/fail2ban/jail.conf
に
ignoreip = 127.0.0.1/8
と初めから設定されているのでスペース区切りで追加する。うちの場合はプライベートネットワーク "10.0.0.0/8" を追加した。
ブラックリスト
こちらは少々面倒だが、How to make fail2ban bans persistent | zach.seifts.us にその方法が書いてある。/etc/fail2ban/ip.blacklist
に IPを列挙し、fail2ban に自動的に追加してもらうと共に、fail2ban 起動時に中身を読み込んで IP tables に禁止を書き込む仕様になっている。結果的に永続化も可能になる。
一応ここにも書いておくと、/etc/fail2ban/action.d/iptables-multiport.conf
の actionban と actionstart に
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP echo <ip> >> /etc/fail2ban/ip.blacklist
actionstart = iptables -N fail2ban-<name> iptables -A fail2ban-<name> -j RETURN iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-<name> cat /etc/fail2ban/ip.blacklist | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done
のような形で1行ずつ追加する。
/etc/fail2ban/ip.blacklist
に余計な空行を入れたらエラーになったのでそこは注意。
ルールの追加
もともと /var/log/auth.log
を覗いた時に、"reverse mapping checking getaddrinfo ..." というログイン試行っぽいのが気になったわけだが、デフォルトではそれは無視されている。そこでルールを追加する。
/etc/fail2ban/filter.d/sshd.conf
の failregex に
^%(__prefix_line)sreverse mapping checking getaddrinfo .* \[<HOST>\] failed - POSSIBLE BREAK-IN ATTEMPT!\s*$
の一行を追加するだけだ。これを含めて、fail2banでSSH攻撃対策を強化する(filter.d/sshd.confを編集する) | 本日も乙に詳しいことが書いてある。
各種コマンド
sudo apt-get install fail2ban
インストールsudo service fail2ban restart
再起動sudo iptables -nL
iptables を確認。"Chain fail2ban-ssh" の下にルールが追加されるtail -n 100 /var/log/fail2ban.log
fail2ban のログを100行確認tail -n 100 /var/log/auth.log
sshd などのログを100行確認wc -l /etc/fail2ban/ip.blacklist
ブロックしている ip アドレスの数を表示。経過観察に。grep Accepted /var/log/auth.log
成功したものを列挙する。予期しない成功があったりするとまずい。grep Accepted /var/log/auth.log | awk '{print $1 " " $2 " " $3 "\t" $9 "\t" $11}'
これをログしておけばいい感じ。
経過観察
1週間経ってブロックしたアドレスは 81 件でした。初めの2日でかなりブロックされた後は落ち着いた感じです。
上が IPアドレスから割当国を調べるDNSサービス を利用して調べた国のリストですが中国、ブラジル、オランダ、アメリカ、…けっこう多様性に満ちています。でも国内からは無いですね。つまり、使用者が国内だけなら国レベルでとりあえずはじいてしまうのも有効かも。
Todo
- はじき出されたときにどうやって無効化するか調べる。denyhosts の場合は大変そうだった。参考:denyhosts が優秀すぎて自分の ssh 接続がはじき出されたので、何とか接続しなおせるようにがんばりました! | oki2a24 →
fail2ban-client set JAIL unbanip MYIP
なんかが使えそう(参考: firewall - How to Unban an IP properly with Fail2Ban - Server Fault) - StoneDotのいろいろ: Denyhosts が Ubuntu 14.04 LTS で削除されたようなので Fail2ban に乗り換えてみた にあるように jail.conf ではなく、jail.local に記述を移すべき
- ログインに成功したユーザとその IP 範囲を知りたい。
*1:管理者/sshd への攻撃を撃退 - 武内@筑波大、SSHブルートフォース攻撃が増加、SANSが紹介した対策をやってみる(そ - ksaitoの日記、Welcome to DenyHosts
*2:StoneDotのいろいろ: Denyhosts が Ubuntu 14.04 LTS で削除されたようなので Fail2ban に乗り換えてみた、fail2banをインストールしてサーバへの不正攻撃を防ぐ | 本日も乙、他のディストリでも使えるように iptables をいじる仕様になっている。Ubuntu の場合は、ufw があるけれども、特に衝突して問題になることは無いということで、気にせず使っている。参考: security - potential ufw and fail2ban conflicts - Ask Ubuntu