Ubuntu Serverを自宅サーバーにする前にやる初期設定:SSH公開鍵・fail2ban・自動更新

Photo: panumas nikhomkhai / Pexels
Ubuntu Server をミニPCやラズパイに入れて、SSH でつながった。ここで安心して Docker を入れ始めたくなるのですが、先に 30 分だけ初期設定に使っておくと、あとの運用がかなり楽になります。
先に結論です。やることは「鍵でログインできるようにする」→「パスワード認証を止める」→「ufw で口を絞る」→「fail2ban を入れる」→「自動更新を有効にする」の 5 つで、順番を守ることが一番大事です。 順番を間違えると、自分が締め出されます。
そして 2026 年 4 月に出た Ubuntu 26.04 LTS(Resolute Raccoon) では、この 5 つのうち 2 つで「昔の手順がそのままでは効かない」変更が入っています。ここも合わせて整理します。
前提:26.04 で変わったところ
自宅サーバーに入れるなら、サポートが 2031 年 4 月まである 26.04 LTS が素直です(8 月にポイントリリースの 26.04.1 が出ています)。ただし、ネット上の 22.04 / 24.04 向け手順をそのまま使うと引っかかる箇所があります。
| 変わった点 | 影響 |
|---|---|
rsyslog が標準で入らなくなった | /var/log/auth.log が無い。fail2ban の初期設定のままでは動かない |
| iptables から nftables へ | fail2ban の ban 動作を nftables 側に合わせる必要がある |
SSH がソケット起動(ssh.socket) | ポート番号の変更は ssh.service の再起動だけでは反映されない |
sudo が Rust 実装の sudo-rs に | パスワード入力時に * が出るなど見た目が変わる。基本は差し替えのみ |
| OpenSSH 10.2 | 鍵交換がポスト量子(mlkem768x25519-sha256)に対応。DSA は廃止 |
sudo-rs は同じ /etc/sudoers と /etc/sudoers.d/ を読むので、通常の使い方なら意識する必要はありません。ただし sudoreplay などの I/O ログ系と、コマンド引数にワイルドカードを使う sudoers の書き方は未対応とされています。困ったら従来の sudo(sudo.ws に改名されています)へ戻せる作りになっているそうなので、そこまで身構えなくて大丈夫です。
ステップ1:SSH 公開鍵でログインできる状態を作る
必ずここから始めます。 パスワード認証を止めるのは、鍵で入れることを確認したあとです。
手元の PC(Windows なら PowerShell、Mac / Linux ならターミナル)で鍵を作ります。
ssh-keygen -t ed25519 -C "homelab"
RSA ではなく ed25519 を選びます。短くて速く、現在の標準的な選択肢とされています。パスフレーズは付けておくほうが安全です。
作った公開鍵をサーバーへ置きます。Mac / Linux なら 1 行です。
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.50
Windows の OpenSSH には ssh-copy-id が無いので、PowerShell では次のようにします。
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@192.168.1.50 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
置いたら、別のターミナルを新しく開いて鍵だけでログインできるか試します。パスワードを聞かれずにプロンプトが出れば成功です。
ssh user@192.168.1.50
パスフレーズ付きの鍵を毎回打つのが面倒なら、ssh-agent に登録しておきます。物理的な鍵で管理したい場合は、FIDO2 対応のセキュリティキーを使う ed25519-sk という選択肢もあります。
- FIDO2 対応セキュリティキー:
ssh-keygen -t ed25519-skで作ると、キーを挿してタッチしないとログインできない鍵になります。自宅サーバー 1 台なら過剰かもしれませんが、外から入る運用なら効きます
ステップ2:パスワード認証と root ログインを止める
鍵で入れることを確認したら、パスワードの口を閉じます。ここが一番「自分を締め出しやすい」工程なので、今つながっている SSH セッションは閉じずに残したまま作業してください。
Ubuntu の sshd_config は /etc/ssh/sshd_config.d/*.conf を読み込む作りになっているので、本体を直接いじらず、追加ファイルを置くほうが後で戻しやすいです。
sudo nano /etc/ssh/sshd_config.d/99-homelab.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
KbdInteractiveAuthentication も no にするのを忘れないでください。ここが残っていると、パスワード認証を切ったつもりでもキーボード対話で入れてしまうことがあります。
保存したら、再起動の前に構文チェックです。
sudo sshd -t # 何も出なければ OK
sudo systemctl restart ssh
そのうえで、別のターミナルからログインできるか確認します。入れなければ、残してあるセッションで設定を戻せます。
なお、SSH のポート番号を 22 から変える場合は注意が必要です。26.04 はソケット起動なので、ssh.service を再起動しても反映されません。
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
ただ、自宅サーバーでポートを変える必要があるのは、インターネットに直接ポート開放している場合だけです。Tailscale や Cloudflare Tunnel 経由なら、外からは 22 番も見えないので変更するメリットはほとんどありません。
ステップ3:ufw で開いている口を減らす
Ubuntu には ufw が用意されています。デフォルトは無効なので、有効にする前に SSH を許可してから有効化します。逆順にすると即座に締め出されます。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw enable
sudo ufw status verbose
自宅サーバーなら、もう一歩絞ってLAN からだけ許可にするのがおすすめです。
sudo ufw delete allow ssh
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
Tailscale を併用しているなら、tailscale0 インターフェースを丸ごと許可しておくと、外からは Tailscale 経由でのみ入れる構成になります。
sudo ufw allow in on tailscale0
Docker を入れる予定があるなら、先に知っておいてほしいことがあります。Docker はポート公開時に nftables/iptables を直接書き換えるため、ufw のルールを迂回することがあるとされています。 -p 8080:80 のように書いたコンテナが、意図せず LAN 全体から見えることがあります。気になる場合は -p 127.0.0.1:8080:80 のようにバインド先を絞るのが簡単です。
ステップ4:fail2ban は「26.04 の作法」で入れる
パスワード認証を切っていれば総当たりは通りませんが、ログが攻撃で埋まるのは変わりません。fail2ban で弾きます。
ここが 26.04 で一番つまずく箇所です。/var/log/auth.log が無く、firewall も nftables になったため、インストールしただけでは期待通りに動きません。
sudo apt update
sudo apt install fail2ban python3-systemd
python3-systemd を一緒に入れます。これが無いまま systemd バックエンドを指定すると、サービスが起動に失敗します。
設定は jail.conf を直接編集せず、jail.local を作って上書きします。
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
backend = systemd
banaction = nftables[type=multiport]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 192.168.1.0/24 100.64.0.0/10
[sshd]
enabled = true
ポイントは 3 つです。
backend = systemd:ログをファイルではなく journald から読みます。26.04 ではこれが前提ですbanaction = nftables[type=multiport]:古いiptables-multiportのままだと、「ban した」とログに出ているのに実際には通れてしまうことがありますignoreip:自分の LAN と Tailscale の範囲(100.64.0.0/10)を入れておきます。自分を ban する事故を防ぐための保険です
反映して状態を見ます。
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Currently banned と Total banned が表示されれば動いています。数日置いてから見ると、外に公開していなくても意外な数字になっていることがあります。
ちなみに OpenSSH 10.x には PerSourcePenalties という、認証に失敗し続ける接続元へペナルティを課す機能が入りました。鍵認証のみ+LAN 限定の自宅サーバーなら、fail2ban 無しでも実害はほぼ無いはずです。入れるかどうかは「ログを静かにしたいか」で決めて構わないと思います。
ステップ5:自動更新を入れて、再起動の扱いを決める
自宅サーバーで一番放置されがちなのが更新です。26.04 はセキュリティ更新の自動適用が最初から有効になっているとされていますが、確認と調整はしておきます。
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgrades
20auto-upgrades の 2 行が "1" なら、毎日リスト更新と自動適用が走ります。
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
動作の中身は /etc/apt/apt.conf.d/50unattended-upgrades です。自宅サーバーで考えるべきは再起動の扱いで、ここは方針を決めておかないと「カーネル更新が当たっているのに再起動されず、ずっと古いまま」になります。
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";
Unattended-Upgrade::Automatic-Reboot-Time "04:30";
ただし Automatic-Reboot "true" にするのは、再起動後に全部ちゃんと戻ることを確認してからです。 Docker コンテナの restart: unless-stopped、Proxmox の VM 自動起動、NAS のマウント(/etc/fstab)あたりが復帰しないと、朝起きたらサービスだけ止まっている状態になります。一度手で sudo reboot して、戻り方を見てから有効にしてください。
適用状況は次で確認できます。
sudo unattended-upgrade -v --dry-run
ls /var/log/unattended-upgrades/
やらないほうがいいこと
- ufw を有効にしてから SSH を許可する:順番が逆です。その場で切れます
- パスワード認証を切る前にセッションを全部閉じる:戻す手段が無くなります。画面とキーボードを繋げる機種ならまだしも、押し入れのミニPCだと詰みます
- root で常用する:
PermitRootLogin noにしたうえで、通常ユーザー+sudoで運用します - ポート番号の変更を「対策」と考える:22 番を別番号にしてもログが減るだけで、鍵認証ほどの効果はありません
- fail2ban を入れただけで安心する:26.04 では設定を直さないと動いていないことがあります。必ず
fail2ban-client status sshdまで確認します
まとめ
- Ubuntu Server の初期設定は 鍵 → パスワード停止 → ufw → fail2ban → 自動更新 の順。順番が安全性そのものです
- 鍵は ed25519。置いたら、別ターミナルで入れることを確認してからパスワード認証を切ります
- 26.04 は
/var/log/auth.logが無いため、fail2ban はbackend = systemdとpython3-systemdが必須。banactionも nftables に合わせます ignoreipに 自分の LAN と Tailscale の範囲を入れて、自分を ban する事故を防ぎます- ufw は SSH を許可してから有効化。LAN 限定や
tailscale0限定まで絞ると外からの総当たりは届きません - 自動更新は有効に。
Automatic-Rebootは、手動 reboot で全サービスが復帰することを確認してから - SSH のポート変更は
ssh.socketの再起動が必要。ただし Tailscale 経由なら変更する意味は薄いです
この 5 つが終われば、あとは Docker でも Proxmox でも好きに載せられます。逆に、サービスを増やしてからでは「止められないから触れない」状態になりがちです。まだ何も載っていない今が、一番安く設定できるタイミングだと思います。
運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート


