Linux SSH 鍵認証の設定方法:ed25519 鍵でログインしパスワード認証を無効化
グローバル IPv4 を持つサーバーは、公開から数分で SSH のブルートフォース攻撃を受け始めます。狙われるのはパスワードログインです。このガイドでは、ed25519 鍵による Linux SSH 鍵認証を設定し、締め出されることなく SSH のパスワード認証を無効化する手順を説明します。対象は Debian 11/12、Ubuntu 20.04/22.04/24.04、CentOS 7、Rocky Linux / AlmaLinux 8・9 で、ヨハネスブルグ・モスクワ・東京・ソウルの JUSTG クラウドサーバーでも専用サーバーでも同じように使えます。
ステップ1:手元の PC で ed25519 の SSH 鍵ペアを作成
鍵は接続元の PC で作成し、サーバー上では作りません。ed25519 は鍵が短く高速で、現行の OpenSSH はすべて対応しています。パスフレーズを設定しておけば、ノート PC を紛失しても秘密鍵は守られます。ssh-agent を使えば入力はセッションごとに一度で済みます。
# On your own computer (Linux, macOS, or Windows 10/11 PowerShell)
ssh-keygen -t ed25519 -C "laptop-2026"
# Press Enter to accept ~/.ssh/id_ed25519, then set a passphrase
id_ed25519(秘密鍵:絶対に共有しない)と id_ed25519.pub(公開鍵:サーバーへ配置する)の 2 ファイルができます。
ステップ2:公開鍵をサーバーへコピー
Linux や macOS では ssh-copy-id が最も簡単です。現在のパスワードで最後にもう一度ログインし、サーバーの ~/.ssh/authorized_keys に鍵を追記します。
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
# Custom port example:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 [email protected]
Windows には ssh-copy-id が同梱されていないため、PowerShell からパイプで送ります。
# Windows PowerShell (ssh-copy-id is not included on Windows)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
ステップ3:手動で鍵を登録し authorized_keys の権限を修正
自分で貼り付けたい場合や VNC コンソールで作業する場合は、手動でファイルを作成します。ディレクトリやファイルが他ユーザーから書き込み可能だと、OpenSSH は authorized_keys を黙って無視します。権限は鍵そのものと同じくらい重要です。
# On the server, as the user that will log in
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys # paste ONE key per line, then save
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$(id -un)":"$(id -gn)" ~/.ssh
# CentOS / Rocky / AlmaLinux with SELinux enforcing:
restorecon -Rv ~/.ssh
ssh-ed25519 で始まる 1 行のままにしてください。エディタやチャットアプリが挿入した改行は、貼り付けた鍵が拒否される最も多い原因です。ステップ4:設定変更の前に SSH 鍵ログインをテスト
新しいターミナルを開き、鍵認証だけを強制して接続します。パスフレーズ以外のパスワードを聞かれずにログインできれば成功です。
ssh -i ~/.ssh/id_ed25519 -o PasswordAuthentication=no [email protected]
ステップ5:sshd_config で SSH パスワード認証を無効化
最近のディストリビューションは、メイン設定の先頭にある Include で /etc/ssh/sshd_config.d/*.conf を読み込みます。sshd は各オプションについて最初に読んだ値を採用するため、50-cloud-init.conf などにある PasswordAuthentication yes が、sshd_config 後半の変更を上書きしてしまうことがあります。名前順で最初に来る drop-in ファイルを作れば確実です。
# Check that the drop-in directory is included
grep -i '^Include' /etc/ssh/sshd_config
# Create a drop-in that sorts first (sshd keeps the FIRST value it reads)
cat > /etc/ssh/sshd_config.d/01-key-only.conf <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
EOF
# Look for files that still turn passwords back on (e.g. 50-cloud-init.conf)
grep -ri 'PasswordAuthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
sshd_config.d がない CentOS 7 などでは、同じ 4 行を /etc/ssh/sshd_config に直接書き、前方にある PasswordAuthentication yes をコメントアウトします。PermitRootLogin prohibit-password は root を鍵ログインのみ許可する設定です。普段 sudo ユーザーで入るなら no にしても構いません。
ステップ6:SSH 設定を検証してサービスをリロード
# Validate syntax first - no output means OK
sshd -t
# Show the effective values
sshd -T | grep -Ei 'passwordauthentication|pubkeyauthentication|permitrootlogin|kbdinteractive'
# Debian / Ubuntu
systemctl reload ssh
# CentOS / Rocky / AlmaLinux
systemctl reload sshd
reload では現在のセッションは切れませんが、テストはまだ半分です。
ステップ7:最初のセッションを閉じる前に 2 つ目のセッションで確認
# From a NEW terminal on your computer
ssh [email protected]
# Must be refused:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password [email protected]
# Expected: Permission denied (publickey).
失敗した場合は、開いたままの最初のセッションで drop-in ファイルを直して再度リロードします。すでに接続できない場合は、JUSTG クライアントエリア → 製品とサービス → 対象の VPS → 管理パネルから VNC コンソールを使って修正してください。見つからない場合はチケットでお問い合わせください。
よくある質問
SSH 鍵は RSA より ed25519 の方が良いですか?
新しく作るなら ed25519 をおすすめします。鍵が短く、ハンドシェイクも速く、十分な強度があります。ed25519 非対応の古いシステムに接続する場合のみ RSA 4096 を使ってください。
設定したのにパスワードを聞かれます。
sshd -T | grep -i passwordauthentication を実行し、yes と表示されるなら、sshd_config.d 内の別ファイルが先に読まれています。また /var/log/auth.log(Debian/Ubuntu)や /var/log/secure(Rocky/AlmaLinux)に ~/.ssh の「bad ownership or modes」が出ていないか確認してください。
同じ鍵を複数の JUSTG サーバーで使えますか?
使えます。各サーバーに同じ公開鍵を ssh-copy-id でコピーしてください。秘密鍵は自分の端末だけに保管し、紛失した端末の鍵は authorized_keys から該当行を削除して無効化します。
それでも SSH 鍵でログインできない場合は、https://www.justg.com/submitticket.php からチケットを送信してください。JUSTG テクニカルサポートが対応いたします。