Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

fail2ban を導入

最近各所でセキュリティインシデントが起こっているので、セキュリティ強化が求められている。もちろん外から SSH できるようなサーバには公開鍵認証しか許していないが、それでもアクセス制限などをしておいた方がイイかもしれないと思い、調べてみた。

本当に問題のあるアクセスは来ているか

/var/log/auth.logtail -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日でかなりブロックされた後は落ち着いた感じです。

f:id:cm3ak:20150805090929p:plain

上が IPアドレスから割当国を調べるDNSサービス を利用して調べた国のリストですが中国、ブラジル、オランダ、アメリカ、…けっこう多様性に満ちています。でも国内からは無いですね。つまり、使用者が国内だけなら国レベルでとりあえずはじいてしまうのも有効かも。

Todo