Linux SSH 鍵認証の設定方法:ed25519 鍵でログインしパスワード認証を無効化

10 分で読めます 7 回閲覧 0
目次

グローバル 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 つ目のセッションで確認

今の SSH ウィンドウはまだ閉じないでください。別のターミナルで再ログインし、鍵でログインでき、パスワードのみの接続が拒否されることを確認してから切断します。
# 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 テクニカルサポートが対応いたします。

この回答は役に立ちましたか?

関連チュートリアル

root@vps: ~ $ openssl rand -base64 18$ passwd root$ ss -tlnp | grep ':2222' || echo "port 2222 is… Linuxサーバー Linux VPS で SSH ポート番号と root パスワードを安全に変更する方法 Linux の SSH ポート変更と root パスワード変更を、SELinux・ファイアウォール・Ubuntu ssh.socket・VNC 復旧まで解説。 12 分で読めます 1 チュートリアルを読む root@vps: ~ $ ss -tulpn$ sshd -T | grep -i '^port'$ nohup sh -c 'sleep 600; ufw disable' >/dev/nu… Linuxサーバー Linux ファイアウォール設定:VPS で UFW と firewalld を使う方法(IPv6 対応) UFW / firewalld で Linux ファイアウォールを設定。SSH 優先許可、Web ポート、送信元 IP 制限、IPv6、締め出し時の復旧まで。 12 分で読めます 2 チュートリアルを読む root@vps: ~ $ free -h$ swapon --show$ df -h / Linuxサーバー Linux VPS にスワップ領域を追加する方法(512MB・1GB の小容量プラン向け) 小容量 Linux VPS にスワップを追加。fallocate / dd でスワップファイル作成、fstab 登録、swappiness 調整まで。 8 分で読めます 2 チュートリアルを読む root@vps: ~ $ df -hT$ df -i$ du -xh --max-depth=1 / 2>/dev/null | sort -h … Linuxサーバー Linux のディスク容量不足:VPS で空き容量を調べて解放する方法 Linux のディスクがいっぱいなら df・du・ncdu で原因を特定し、ジャーナル・キャッシュ・Docker・ログ・削除済みファイルを解放。 11 分で読めます 2 チュートリアルを読む