Fail2Banを試す

VPSサーバーのアクセス失敗ログを見てみると、大量のアクセスログがあったため、このようなブルートフォース攻撃への対抗策としてFail2Banを導入してみた時の備忘録。

不正アクセスログの確認

そもそも、VPSサーバーに対して不正アクセスログが大量にあることをどう確認するの?というお話。lastbコマンドは、アクセスに失敗したユーザーを一覧化して表示させるため、これで見ると分かりやすいでしょう。

# lastb
ubuntu   ssh:notty    200.237.128.234  Thu Jun  8 11:59 - 11:59  (00:00)
jorge    ssh:notty    43.128.229.157   Thu Jun  8 11:59 - 11:59  (00:00)
ros      ssh:notty    152.228.180.220  Thu Jun  8 11:59 - 11:59  (00:00)
ubuntu   ssh:notty    196.28.248.220   Thu Jun  8 11:58 - 11:58  (00:00)
dev      ssh:notty    188.166.232.219  Thu Jun  8 11:58 - 11:58  (00:00)
barman   ssh:notty    200.237.128.234  Thu Jun  8 11:58 - 11:58  (00:00)
recordin ssh:notty    218.150.246.42   Thu Jun  8 11:57 - 11:57  (00:00)
admin    ssh:notty    62.122.184.125   Thu Jun  8 11:57 - 11:57  (00:00)
weather  ssh:notty    196.28.248.220   Thu Jun  8 11:57 - 11:57  (00:00)
nuraini  ssh:notty    152.228.180.220  Thu Jun  8 11:56 - 11:56  (00:00)
ram      ssh:notty    223.113.121.94   Thu Jun  8 11:56 - 11:56  (00:00)
csle     ssh:notty    196.28.248.220   Thu Jun  8 11:56 - 11:56  (00:00)
ubuntu   ssh:notty    152.228.180.220  Thu Jun  8 11:55 - 11:55  (00:00)
admin1   ssh:notty    188.166.232.219  Thu Jun  8 11:54 - 11:54  (00:00)
roger    ssh:notty    152.228.180.220  Thu Jun  8 11:54 - 11:54  (00:00)
reporter ssh:notty    43.128.229.157   Thu Jun  8 11:54 - 11:54  (00:00)

…1分に3,4回くらい平均してアタックされてます^^;

アクセス失敗ログを確認して、上記のアタッカーのIPアドレスを塞ぎたいのが今回やりたいことです。

Fail2Banとは

一言で言うと、不正アクセスを予防するためのセキュリティ監視ソフトです。ログファイルに記録される内容を監視して、何度も認証に失敗しているログを見つけるとファイアーウォールを自動的に調整して接続元からの不正アクセスを禁止します。

参考:fail2banの使い方

Vagrant 2ノードで環境構築

以下、使ったVagrantfile

2ノードで環境を構築しました。server2にFail2Banをセットアップし、server1から連続でSSHアクセスを試みてみます。

Vagrant.configure("2") do |config|

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 1
    vb.memory = 2048
  end

  script = <<SCRIPT
echo "192.168.56.44 server1" >> /etc/hosts
echo "192.168.56.45 server2" >> /etc/hosts
SCRIPT

  config.vm.define "server1" do |server1|
    server1.vm.box = "generic/rocky8"
    server1.vm.hostname = "server1"
    server1.vm.network "private_network", ip: "192.168.56.44"
    server1.vm.synced_folder "./shared", "/vagrant"
    server1.vm.provision  :shell, :inline => script
  end

  config.vm.define "server2" do |server2|
    server2.vm.box = "generic/rocky8"
    server2.vm.hostname = "server2"
    server2.vm.network "private_network", ip: "192.168.56.45"
    server2.vm.synced_folder "./shared", "/vagrant"
    server2.vm.provision  :shell, :inline => script
  end

end

Fail2Banセットアップ

# dnf update
# dnf install epel-release
# dnf install fail2ban
# cat <<EOF >/etc/fail2ban/jail.local
[sshd]
enabled = true
bantime = 600
findtime = 10
maxretry = 1
EOF
# fail2ban-client start
Server ready
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

攻撃検証

$ ssh vagrant@server2
vagrant@server2's password:
Permission denied, please try again.
vagrant@server2's password:
Permission denied, please try again.
vagrant@server2's password:
vagrant@server2: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

$ ssh vagrant@server2
ssh: connect to host server2 port 22: Connection refused

パスワードが聞かれずに、Connection refusedとなりました。

server2にログインしてfail2banの状態を確認してみます。

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     3
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.56.44

Banned IP listに追加されています。

※なお、今回の検証では、パスワード認証にて検証を行いましたが、公開鍵認証の場合はBanに追加されませんでした。公開鍵認証の場合は、fail2banで言うところの「ログイン失敗」に当たらないということでしょうか。

また、DoS攻撃に対してもfail2banは使えるそうなので、こちらの設定を今度の機会に設定していきたいと思います。