共通の設定基準:SEC-01・SEC-02・SEC-03。ほかのOSでも確認する基準を見る
01 / 管理者と鍵を用意
Ubuntu Server 22.04で、名前付きの管理者アカウント、sudo、障害時に使えるコンソールを準備します。現在のSSH接続を開いたまま作業し、別の端末で新規接続を確認します。SSHパスワード認証を無効にしても、sudoのパスワードは別に必要です。
掲載コマンドのクライアント側検証はDebian 13・OpenSSH 10.0p2のPOSIXシェルで行っています。WindowsのGUI操作は未検証です。以下の ADMIN、SERVER は実際の管理者名とサーバーのアドレスに置き換えます。管理端末で実行し、鍵には必ずパスフレーズを設定してください。秘密鍵は管理端末に保管し、サーバーや公開場所に置きません。
ssh-keygen -t ed25519 -a 64 -f ~/.ssh/server-guide_ed25519
ssh-add ~/.ssh/server-guide_ed25519ssh-agentが動いていない場合は、管理端末で起動してから追加します。既存の鍵を上書きしないでください。
02 / サーバーを確認して鍵を登録
サーバーのホスト鍵は接続先の本人確認用で、管理者の公開鍵とは別です。サーバーの信頼できるコンソールで次の指紋を確認し、初回接続時に管理端末が表示する指紋と別経路で照合します。ネットワークから取得した鍵だけでは本人確認できません。
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub| ファイル | 役割・置き場所 |
|---|---|
server-guide_ed25519 | 管理端末だけに保管する秘密鍵。パスフレーズで保護 |
server-guide_ed25519.pub | サーバーへ登録する管理者の公開鍵 |
~/.ssh/authorized_keys | サーバー側の、ログインを許可する公開鍵一覧 |
管理端末から公開鍵を登録します。既存のログイン方法が必要です。
ssh-copy-id -i ~/.ssh/server-guide_ed25519.pub ADMIN@SERVER
ssh -i ~/.ssh/server-guide_ed25519 -o IdentitiesOnly=yes ADMIN@SERVER新しい接続で sudo -v が成功することを確認します。サーバーで所有者と権限を確認し、必要なら管理者自身で chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys を実行します。
stat -c '%a %U %n' ~/.ssh ~/.ssh/authorized_keys03 / SSH設定と復旧
サーバーで既存の /etc/ssh/sshd_config と /etc/ssh/sshd_config.d/、Includeの位置とMatchを確認します。OpenSSHは多くの設定で最初に得た値を使うため、末尾への追記だけでは有効になるとは限りません。競合がない場合の例です。複数の管理者や自動処理があるサーバーでは、それぞれが公開鍵で接続できることを先に確認してください。以下の制限は、そのサーバーのパスワードのみのSSH接続にも影響します。既存ファイルを上書きせず、先に安全な場所へ設定をバックアップしてください。
BACKUP="/root/server-guide-ssh-$(date +%Y%m%d-%H%M%S)"
sudo install -d -m 700 "$BACKUP" &&
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.d "$BACKUP/"
sudo test ! -e /etc/ssh/sshd_config.d/00-server-guide.conf最後の検査が成功した場合のみ、次の内容でファイルを作成します。
sudo test ! -e /etc/ssh/sshd_config.d/00-server-guide.conf &&
sudo tee /etc/ssh/sshd_config.d/00-server-guide.conf >/dev/null <<'EOF'
PubkeyAuthentication yes
AuthenticationMethods publickey
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
X11Forwarding no
EOF実際の管理者名、接続元のホスト名、サーバーから見える接続元IPに置き換え、構文と適用値を確認してから再読み込みします。Matchがある場合は対象となる接続条件ごとに確認します。host は接続元のホスト名で、laddr はサーバー側アドレスです。22番以外で待ち受けている場合は lport も変更してください。
sudo /usr/sbin/sshd -t &&
sudo /usr/sbin/sshd -T -C user=ADMIN,host=CLIENT_HOSTNAME,addr=ADMIN_IP,laddr=SERVER_IP,lport=22 | grep -E '^(pubkeyauthentication|authenticationmethods|passwordauthentication|kbdinteractiveauthentication|permitrootlogin|permitemptypasswords|x11forwarding) '構文と適用値が意図どおりでなければ再読み込みせず修正します。確認できた場合のみ、sudo /usr/sbin/sshd -t && sudo systemctl reload ssh を実行します。開いたままの接続を保持し、別端末から正しい鍵で新規接続とsudoを確認してください。誤った鍵、パスワード方式、rootの直接接続が拒否されることも確認します。
接続できなくなった場合はコンソールから、この手順で作ったファイルだけを取り除き、構文検査と再読み込みを行います。既存設定も変更した場合はバックアップと照合して復旧します。
sudo rm /etc/ssh/sshd_config.d/00-server-guide.conf
sudo /usr/sbin/sshd -t && sudo systemctl reload ssh04 / 検証結果
Ubuntu Server 22.04.5のQEMU VMと別のDebian 13管理端末で確認しました。暗号化したEd25519鍵を登録し、新規接続と再読み込み中の既存接続を確認。誤鍵、パスワード方式、rootの接続は拒否され、上記の有効値と権限700/600を確認しました。未使用のlxdグループも外しました。
接続はローカルのポート転送経由です。公開インターネットからの到達性やIPv6の検証ではありません。更新後に再起動し、同じ認証と有効設定が維持されることも確認しました。
