SSHでサーバーにログインする際、パスワード認証をそのまま使い続けているケースは少なくありません。しかしパスワード認証は、ブルートフォース攻撃(総当たり)やパスワードリスト攻撃の標的になりやすく、インターネットに公開されたサーバーでは継続的なリスクにさらされています。
この記事では、パスワード認証を廃止して鍵認証に切り替える一連の手順を解説します。鍵ペアの生成から公開鍵の登録、設定ファイルの変更、動作確認、よくあるつまずきまでを1本でまとめています。
なぜパスワード認証をやめるべきか
インターネットに公開されたサーバーのSSH(22番ポート)には、常に不正ログイン試行が届いています。攻撃者は既知のパスワードパターンを機械的に試し続けるため、単純なパスワードはもちろん、ある程度複雑なパスワードでもいつかは突破されるリスクがあります。
鍵認証は「手元の秘密鍵とサーバー側の公開鍵がペアで一致する」ことで認証が成立する仕組みです。秘密鍵が手元にない限りログイン自体が不可能になるため、パスワード総当たり攻撃のリスクをほぼ排除できます。多くのLinuxディストリビューションの公式ドキュメントでも、鍵認証への移行が推奨されています。
鍵ペアを作成する
鍵ペアはSSH接続元(手元のPCや作業用サーバー)で生成します。接続先のサーバーでは行いません。
アルゴリズムの選択
現在よく使われるのはEd25519とRSAです。Ed25519は鍵長が短く高速で、現在の標準的な選択肢です。古いOpenSSH(バージョン6.4以前)との互換性が必要な場合はRSA(4096bit)を選択します。
# Ed25519(推奨)
ssh-keygen -t ed25519 -C "任意のコメント"
# RSA(古い環境との互換が必要な場合)
ssh-keygen -t rsa -b 4096 -C "任意のコメント"
コマンドを実行すると、保存先ファイル名とパスフレーズの入力を求められます。保存先はデフォルト(~/.ssh/id_ed25519など)のままEnterで問題ありません。パスフレーズを設定しておくと、万が一秘密鍵ファイルが流出した際の被害を抑えられます。
生成が完了すると、~/.ssh/に以下の2ファイルが作成されます。
id_ed25519:秘密鍵(絶対に外部に出さない)id_ed25519.pub:公開鍵(サーバーへ登録するもの)
公開鍵をサーバーへ登録する
ssh-copy-idを使う方法
最も手軽な方法です。まだパスワード認証が有効な状態で実行するため、パスワードを求められます。
ssh-copy-id -i ~/.ssh/id_ed25519.pub ユーザー名@サーバーIPアドレス
このコマンドはサーバーの~/.ssh/authorized_keysに公開鍵を追記します。
手動で登録する方法
ssh-copy-idが使えない環境では、パスワードでサーバーにログインした後、次の手順で手動登録できます。
# サーバー側で実行
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "公開鍵の内容(ssh-ed25519 AAAA...から始まる1行)" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
公開鍵の内容は、手元でcat ~/.ssh/id_ed25519.pubを実行して確認できます。ssh-ed25519 AAAA...から始まる1行を丸ごとコピーして貼り付けます。
パスワード認証を無効にする
この手順に進む前に、鍵認証でログインできることを必ず確認してください。パスワード認証を無効化した後にログインできなくなると、コンソールからの復旧作業が必要になります。
設定ファイルはほとんどのディストリビューションで/etc/ssh/sshd_configにあります。
sudo nano /etc/ssh/sshd_config
以下の項目を確認・変更します。コメントアウト(行頭の#)が残っている場合は削除してください。
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
変更後、設定ファイルの構文を確認してからsshdを再起動します。
sudo sshd -t
sudo systemctl restart sshd
sshd -tでエラーが出た場合は設定を見直してください。エラーがなければsystemctl restart sshdを実行します。
切り替え後に動作を確認する
現在のSSHセッションは切断しないまま、別のターミナルやウィンドウから新しい接続を試みます。これにより、問題があっても既存セッションから設定を修正できます。
# 新しいターミナルで実行(-v オプションで詳細ログを表示)
ssh -v ユーザー名@サーバーIPアドレス
-vオプションを付けると認証の流れが表示され、どの鍵が使われているかがわかります。
パスワード認証が無効になっていることは次のコマンドで確認できます。
ssh -o PreferredAuthentications=password ユーザー名@サーバーIPアドレス
Permission denied (publickey)と表示されれば、パスワード認証が正しく無効化されています。
よくあるつまずきと対処法
鍵認証に失敗して「Permission denied (publickey)」が出る
原因の多くはファイルのパーミッション設定です。次のコマンドで確認できます。
ls -la ~/.ssh/
~/.ssh/は700、authorized_keysは600、ホームディレクトリ自体は755以下である必要があります。パーミッションが緩すぎると、SSHデーモンがセキュリティ上の理由でその鍵を無視します。サーバー側の認証ログは次のコマンドで確認できます。
sudo journalctl -u sshd --since "10 minutes ago"
設定変更が反映されない
Ubuntu 22.04以降など一部のディストリビューションでは、/etc/ssh/sshd_config.d/ディレクトリ内のファイルが上書き設定として機能します。50-cloud-init.confなどにPasswordAuthentication yesが残っている場合、メインの設定が上書きされることがあります。次のコマンドで/etc/ssh/以下のすべての設定ファイルを横断して確認できます。
grep -r PasswordAuthentication /etc/ssh/
競合する設定が見つかった場合は、そのファイルも修正してからsshdを再起動してください。
複数の端末から接続する場合
自宅PC・会社PC・作業サーバーなど複数の端末から接続する場合は、それぞれで鍵ペアを生成して、全員分の公開鍵をauthorized_keysに追記します。1行1鍵の形式で複数行書き込めます。端末ごとに鍵を分けておくと、特定の端末だけアクセスを取り消すときにauthorized_keysから該当行を削除するだけで対応できます。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
