最近、話題になっているDDos攻撃やブルートフォースアタックによる不正アクセス・サービスダウンの被害をよく聞きます。今日、サーバーのログをみると毎日大量のSSHアタックがあったため急遽導入してみました。
今回は無料で導入できるfail2banというソフトウェアで設定したいと思います。
fail2banは単体では使用せず、ファイアウォールソフト(iptablesやfirewalld)ともに使用します。
今回は、firewalldと連携してSSHログインの不正アタックを例に説明します。
fail2banのライセンスは?
GPLv2+で、いわゆる一般的なオープンソースのフリーソフトウェアです。
ユースケース
- SSHサーバーにn回ログインに失敗したらそのIPを一定時間ブロックしたい
- WEBサーバーへのDosアタックを検知してIPをブロックする
- ベーシック認証にn回数失敗したらそのIPを一定時間ブロックしたい
- FTPサーバー(実はまだ業界ではあたり前に使われてる)の認証失敗でIPをブロック
上記以外でも、ログから正規表現でパターンにマッチする単位時間あたりの回数で検知できるものには任意コマンドを実行することができます。ゆくゆくはBan(遮断)して、Slackへの通知なども考えてみます。
環境
- CentOS7(今回は、AlibabaクラウドのECS仮想サーバーを利用)
- SSHポート公開済みサーバー
- ファイアウォールはfirewalld
■ epel-releaseリポジトリをインストールしていない場合、先にインストールする
$ sudo yum install epel-release
出力例
読み込んだプラグイン:fastestmirror
base | 3.6 kB 00:00:00
epel | 4.3 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/3): epel/x86_64/updateinfo | 795 kB 00:00:00
(2/3): updates/7/x86_64/primary_db | 4.8 MB 00:00:00
(3/3): epel/x86_64/primary_db | 4.7 MB 00:00:00
Loading mirror speeds from cached hostfile
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-9 を インストール
--> 依存性解決を終了しました。
(略)
インストール:
epel-release.noarch 0:7-9
完了しました!
■ Centos7へfail2ban、systemd、firewalldをインストール
$ sudo yum install fail2ban fail2ban-systemd firewalld
出力例
読み込んだプラグイン:fastestmirror
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
パッケージ firewalld-0.4.3.2-8.1.el7_3.2.noarch はインストール済みか最新バージョンです
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ fail2ban.noarch 0:0.9.6-3.el7 を インストール
--> 依存性の処理をしています: fail2ban-server = 0.9.6-3.el7 のパッケージ: fail2ban-0.9.6-3.el7.noarch
--> 依存性の処理をしています: fail2ban-sendmail = 0.9.6-3.el7 のパッケージ: fail2ban-0.9.6-3.el7.noarch
--> 依存性の処理をしています: fail2ban-firewalld = 0.9.6-3.el7 のパッケージ: fail2ban-0.9.6-3.el7.noarch
---> パッケージ fail2ban-systemd.noarch 0:0.9.6-3.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ fail2ban-firewalld.noarch 0:0.9.6-3.el7 を インストール
---> パッケージ fail2ban-sendmail.noarch 0:0.9.6-3.el7 を インストール
---> パッケージ fail2ban-server.noarch 0:0.9.6-3.el7 を インストール
--> 依存性の処理をしています: systemd-python のパッケージ: fail2ban-server-0.9.6-3.el7.noarch
--> トランザクションの確認を実行しています。
---> パッケージ systemd-python.x86_64 0:219-30.el7_3.8 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
(略)
インストール:
fail2ban.noarch 0:0.9.6-3.el7 fail2ban-systemd.noarch 0:0.9.6-3.el7
依存性関連をインストールしました:
fail2ban-firewalld.noarch 0:0.9.6-3.el7 fail2ban-sendmail.noarch 0:0.9.6-3.el7 fail2ban-server.noarch 0:0.9.6-3.el7 systemd-python.x86_64 0:219-30.el7_3.8
完了しました!
fail2banの設定
■ 設定ファイル "jail.conf" をコピーする
$ sudo cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/jail.local
■ コピーしたjail.localファイルを編集する
$ sudo vim /etc/fail2ban/jail.d/jail.local
■ 以下のように修正
[sshd] #コメントアウトを外す
enabled = true #コメントアウトを外す
# banaction = iptables-multiport #iptablesを使わないのでコメントアウト
banaction = firewallcmd-ipset #firewalldを使うので1行追加
■ サービスを自動的に再起動しても起動させる
$ sudo systemctl enable fail2ban
出力例
Created symlink from /etc/systemd/system/multi-user.target.wants/fail2ban.service to /usr/lib/systemd/system/fail2ban.service.
$ sudo systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
■ サービスの起動
$ systemctl start firewalld
$ systemctl start fail2ban
単位時間あたりの回数を指定
sshd について、300 秒以内に 3 回不正アクセスを行なった IP Address を 600 秒間(デフォルト) banするようにします。
常習犯(recidive)については、1日以内(デフォルト)に 3回 BAN になった IP Address を 1 週間(デフォルト) banで設定した。
$ sudo vim /etc/fail2ban/jail.d/jail.local
# "bantime" is the number of seconds that a host is banned.
bantime = 300
# "maxretry" is the number of failures before a host get banned.
maxretry = 3
[recidive]
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime = 604800 ; 1 week
findtime = 86400 ; 1 day
banされるか試す
と、そうこうしているうちにすでにbanされた模様。VS(ベトナム)からのアタック。
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 3
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
■ とりあえずサーバーをexitで抜けてローカルからsshを3回間違えたのちssh接続すると22ポートが拒否された
➜ /tmp ssh testuser@[サーバーのIPアドレス]
ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused
あとはbanされたらメールを送ったり、Slackで通知したり、
そして自動に永久banするなど自動化できればいいのですが今回はここまで。
※ 個人的にfail2banはシンプルで強度の高いセキュアが構築できるのですが、なんせ使い勝手があまりよくない。
OSだとかバージョンとかに依存しちゃうんで、もっと使いやすくなれば普及すると思うんですがね。。。