前の記事で、このブログを自分の VPS に引っ越しました。その VPS の SSH のログを、立てた初日に見てみたら、こうでした。(((( ;゚Д゚)))
- サーバーを起動してから 約 7 時間
- 存在しないユーザー名でのログインの試しが 132 回
rootでのログインの試しも、たくさん- そのうち 9 つの IP が、自動で締め出されていた
インターネットにサーバーを出すと、こういうものが勝手に来ます。名前も宣伝もしていない、立てたばかりのサーバーにです。
来ていたユーザー名
ログ(journalctl -u ssh)から、試されたユーザー名を数えました。
| ユーザー名 | 回数 |
|---|---|
admin | 24 |
user | 7 |
apache | 4 |
sysadmin・postgres | 3 |
test・newuser・user02 など | 2 |
よくある名前を、片っ端から試しています。人が手で打っているのではなく、インターネット中の IP を順に叩いて回るプログラムです。
でも入れない
このサーバーの SSH は、最初からこうしてあります。
passwordauthentication no # パスワードでは入れないpermitrootlogin no # root では入れないpubkeyauthentication yes # 鍵だけで入れるパスワードを当てに来ても、そもそもパスワードでは入れません。鍵が無ければ、何回試しても入れない。なので、132 回来ても怖くはないです。
それでも、ログが当て試しで埋まるのは気持ちよくないし、相手に何度も試させる理由もありません。そこで働いているのが fail2ban です。
fail2ban がしていること
fail2ban は、ログを見張って、失敗を繰り返す IP をファイアウォールで締め出す道具です。今回の VPS(ConoHa の Debian 13)には、最初から入っていました。
flowchart TB
A[知らない IP] -- SSH のログインの試し --> B[sshd]
B -- 失敗を書く --> C[ログ]
C -- 見張る --> D[fail2ban]
D -- 10 分に 5 回失敗したら締め出す --> E[nftables]
E -. 次からは届かない .-> A設定は「10 分に 5 回失敗したら、1 日締め出す」でした。それで、初日だけで 9 つの IP が締め出されていたわけです。
自分も締め出されていた
ここで白状すると、締め出された IP の中に自分も入っていました。(;´Д`)
サーバーを立てたとき、「パスワードや root で入れないこと」を確かめたくて、わざとログインを失敗させたのです。何回か。いつもと違う回線から。
当然、fail2ban から見れば、それは当て試しと同じです。その回線の IP が 1 日締め出され、私は「なぜか SSH がつながらない」と悩むことになりました。最初は「途中の回線で止められている」と思い込み、まちがった見立てまで記録に書いていました。
学んだこと:
- 確かめるために、わざとログインを失敗させない
- 設定を確かめたいなら、サーバーの中で
sudo sshd -Tを見れば、今効いている設定が全部出る - 「つながらない」ときは、まずサーバー自身が止めていないかを見る(
sudo fail2ban-client status sshdで、締め出し中の IP の一覧が出る)
守りを少し足した
せっかくなので、少しだけ守りを足しました。
1. 繰り返し来る相手ほど長く締め出す
1 日締め出しても、明けたらまた来ます。そこで、fail2ban の bantime.increment を有効にしました。2 回目は 2 日、3 回目は 4 日…と倍になり、上限は 4 週間です。
[sshd]bantime.increment = truebantime.maxtime = 4wただし、これだけでは効きません。fail2ban は締め出しの記録を、既定では 1 日で消してしまうので、2 回目かどうかを覚えていられないのです。記録を残す期間も合わせて延ばしました。
[Definition]dbpurgeage = 4wsudo fail2ban-client -t で設定を検査してから再起動しました。再起動しても、締め出し中の 9 つはそのまま残っていました。
2. 使っていない口を閉じる
待っている口(ポート)を一覧にしたら(sudo ss -tulpn)、SSH・Web のほかに、5355 番が開いていました。LLMNR という、同じネットワークの中で名前を解決する仕組みです。ファイアウォールで捨てているので外からは届きませんが、使っていないので止めました。使わないものは閉じる。
[Resolve]LLMNR=noMulticastDNS=no3. 設定を git で残す
サーバーの設定(ファイアウォール・fail2ban・nginx)を、手元のリポジトリに写して git で残すようにしました。変えたら写してコミットする。壊したときに、前の設定に戻せます。
まとめ
- サーバーを公開すると、数時間で知らない誰かがログインを試しに来る
- 鍵だけで入れるようにしておけば、何回来ても入れない
- fail2ban は、繰り返す相手をファイアウォールで締め出してくれる。自分も締め出されるので、わざと失敗させない
- 繰り返す相手には
bantime.increment。ただし記録を残す期間(dbpurgeage)も延ばす - 使わない口は閉じる。設定は git に残す
インターネットの片隅にも、ノックの音は絶えず届きます。ドアに鍵をかけて、のぞき穴から眺めるくらいがちょうどいい。(`・ω・´)ゞ