Linuxサーバーの初期構築やセキュリティ強化において、最も重要かつ基本となるのが「SSH公開鍵認証(鍵認証)」の設定です。
初期状態のパスワード認証のまま運用を続けると、インターネット経由での総当たり攻撃(ブルートフォース攻撃)や辞書攻撃に晒され、不正アクセスのリスクが跳ね上がります。公開鍵認証に移行し、パスワード認証を完全に無効化することで、第三者による不正侵入を極めて強固に遮断できます。
しかし、設定手順やパーミッション(権限)を誤ると、「Permission denied (publickey) でログインできなくなる」「sshd設定を変更した後にサーバーから締め出される」といった致命的なトラブルに直面することがあります。
この記事では、クライアントPCでの鍵生成(Ed25519推奨)からサーバーへの公開鍵登録、厳格なパーミッション設定、接続テスト、そして sshd_config でのパスワード認証無効化まで、現場で即コピペして使える完全手順を徹底解説します。
【早見表】SSH鍵認証設定の完全フロー チートシート
SSH鍵認証の導入手順と、クライアント側・サーバー側それぞれの実行コマンド一覧です。
| ステップ | 作業内容 | 実行環境 | 主要コマンド / 設定 |
|---|---|---|---|
| Step 1 | 鍵ペアの生成 | クライアントPC | ssh-keygen -t ed25519 -C "comment" |
| Step 2 | 公開鍵の転送・登録 | クライアントPC | ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server |
| Step 3 | パーミッション設定 | サーバー側 | chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys |
| Step 4 | 鍵認証の接続確認 | クライアントPC | ssh -i ~/.ssh/id_ed25519 user@server |
| Step 5 | パスワード認証の無効化 | サーバー側 | /etc/ssh/sshd_config で PasswordAuthentication no |
| Step 6 | 構文確認とsshd再起動 | サーバー側 | sudo sshd -t && sudo systemctl restart ssh |
1. SSH公開鍵認証の仕組みとメリット
SSH公開鍵認証とは、暗号技術における「公開鍵暗号方式」を利用したログイン認証の仕組みです。
ペアとなる2つの鍵を作成し、以下のように役割を分担します。
- 秘密鍵(Private Key): クライアントPC(手元のパソコン)に厳重に保管する鍵。絶対に他人に渡したりサーバーに放置してはいけません。
- 公開鍵(Public Key): ログイン先のリモートサーバー(
~/.ssh/authorized_keys)に配置する鍵。第三者に見られても安全な鍵です。
クライアントが接続を試みると、サーバー側は公開鍵を使ってチャレンジ(暗号データ)を生成し、クライアントが手元の秘密鍵でそれを正しく署名・復号できるかを検証します。通信経路上にパスワードが流れることがなく、秘密鍵を持たない攻撃者はログインできません。
鍵アルゴリズムの選び方(Ed25519 vs RSA)
現在推奨される暗号アルゴリズムは Ed25519 です。
| アルゴリズム | 推奨状況 | 特徴・安全性 | 主な用途 |
|---|---|---|---|
| Ed25519 | 強く推奨(標準) | 高強度・超高速・鍵長が短く管理しやすい(256bit) | 新規構築、モダンなLinux環境(OpenSSH 6.5以降) |
| RSA (4096bit) | 互換性維持 | 歴史が長く互換性が高いが、計算負荷が高く鍵が長い | 古いOS、Ed25519非対応のレガシー機器・アプライアンス |
| ECDSA | 非推奨 | 乱数生成器の脆弱性リスクが指摘されている | 特段の理由がない限り使用を避ける |
| DSA | 廃止(使用不可) | 強度が低く、近年のOpenSSHでは標準で無効化 | 使用禁止 |
特別な理由がない限り、新規に鍵を作成する場合は Ed25519 を選択してください。
2. ステップ1:クライアント側で鍵ペアを生成する(ssh-keygen)
まず、手元のクライアントPC(Mac、Linux、WindowsのWSL/PowerShellなど)で ssh-keygen コマンドを実行し、鍵ペアを生成します。
Ed25519 鍵の生成(推奨)
ssh-keygen -t ed25519 -C "your_email@example.com"
※ -C オプションには、鍵の識別用コメント(メールアドレスやPC名など)を記載します。
RSA 4096bit 鍵の生成(レガシー互換用)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
鍵生成時の対話プロンプトの流れ
コマンドを実行すると、対話形式で保存先とパスフレーズを尋ねられます。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/username/.ssh/id_ed25519): [そのままEnter]
Enter passphrase (empty for no passphrase): [パスフレーズを入力]
Enter same passphrase again: [パスフレーズを再入力]
Your identification has been saved in /Users/username/.ssh/id_ed25519
Your public key has been saved in /Users/username/.ssh/id_ed25519.pub
The key's randomart image is:
+--[ED25519 256]--+
| .o+o.. |
| .+o= |
| ..=.. |
| o + . |
| . S + |
| . . * o |
| . + = + o |
| . o o = o.o |
| . o+E=+ |
+----[SHA256]-----+
- 保存場所: 特別な事情がなければ、デフォルト(
~/.ssh/id_ed25519)のまま Enter を押します。 - パスフレーズ: 秘密鍵自体を暗号化して保護するためのパスワードです。クライアントPCの盗難・紛失時に秘密鍵が悪用されるのを防ぐため、実務では強力なパスフレーズを設定することを推奨します(CI/CD等の完全自動化スクリプトで利用する場合を除く)。
生成されたファイルの確認
ls -la ~/.ssh/id_ed25519*
-rw------- 1 user group 419 Aug 26 18:00 /Users/username/.ssh/id_ed25519
-rw-r--r-- 1 user group 98 Aug 26 18:00 /Users/username/.ssh/id_ed25519.pub
id_ed25519(末尾に.pubがない方)が秘密鍵、id_ed25519.pub(末尾に.pubがある方)が公開鍵です。
3. ステップ2:サーバーへ公開鍵を登録する
生成した公開鍵(~/.ssh/id_ed25519.pub)の内容を、リモートサーバーの ~/.ssh/authorized_keys に登録します。
登録には「方法A:ssh-copy-id を使う方法(推奨)」と「方法B:手動で書き込む方法」があります。
方法A:ssh-copy-id コマンドを使う(最短・確実)
OpenSSH標準の ssh-copy-id コマンド を使用すると、サーバー側の ~/.ssh ディレクトリ作成、パーミッション設定、公開鍵の登録をすべて一発で自動実行してくれます。
# クライアント側で実行
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
SSHポートをデフォルトの22番から変更している場合は、-p オプションを付けます。
# ポート番号が2222の場合
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@server_ip
リモートサーバーのログインパスワードを1回入力すれば、自動的に鍵が転送・登録されます。
方法B:手動で authorized_keys に登録する(ssh-copy-id が使えない場合)
Windows標準のPowerShell環境や、ssh-copy-id コマンドがインストールされていない環境では、以下のいずれかの方法で手動登録します。
パターン1:SSH経由でワンライナー登録(クライアント側で実行)
cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
パターン2:サーバー側で直接ファイル編集
- クライアント側で公開鍵の内容を表示してコピーする:
cat ~/.ssh/id_ed25519.pub - サーバーにログインし、
~/.ssh/authorized_keysの末尾に貼り付けて保存する:mkdir -p ~/.ssh # 既存の鍵を消さないよう必ず「追記(>>)」またはエディタで末尾に追加 echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... your_email@example.com" >> ~/.ssh/authorized_keys
4. ステップ3:サーバー側のパーミッション(権限)を厳格に設定する
SSH鍵認証において最も初心者がつまずきやすいのが「パーミッション(ファイル権限)のエラー」です。
SSHサーバー(sshd)はセキュリティ機構(StrictModes)により、ディレクトリや設定ファイルの権限が緩い(他のユーザーから書き込める可能性がある)場合、鍵認証を自動的に拒否します。
| 対象 | 適切なパーミッション | 意味・注意点 |
|---|---|---|
ユーザーのホーム (~/) |
755 (drwxr-xr-x) または 700 |
グループや他人に書込権限 (777/775) があると拒否される |
SSHディレクトリ (~/.ssh) |
700 (drwx------) |
所有者のみ読取・書込・実行可能 |
登録ファイル (authorized_keys) |
600 (-rw-------) |
所有者のみ読取・書込可能 |
サーバー側で以下のコマンドを実行し、権限を確実に修正しておきましょう。
# サーバー側で実行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 所有者が自分自身になっているかも確認
chown -R $USER:$USER ~/.ssh
5. ステップ4:鍵認証でのSSH接続を確認する(クライアント側)
サーバー側の設定が完了したら、クライアント側から鍵認証を使って正常にログインできるかテストします。
# クライアント側から接続テスト
ssh -i ~/.ssh/id_ed25519 user@server_ip
サーバーのパスワードを要求されず、秘密鍵のパスフレーズを入力(またはパスフレーズなしなら即座)にログインできれば、鍵認証の登録は成功です。
~/.ssh/config を設定して接続を効率化する
毎回 -i ~/.ssh/id_ed25519 やユーザー名、IPアドレスを入力するのは手間がかかります。SSH configファイル(~/.ssh/config) に設定を記述しておけば、ssh myserver という短いエイリアスだけで瞬時に接続できます。
# クライアント側の ~/.ssh/config に追記
Host myserver
HostName 203.0.113.10
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
設定後は、以下のコマンドだけで接続可能です。
ssh myserver
6. ステップ5:パスワード認証を無効化する(sshd_config)
鍵認証でのログインが確認できたら、セキュリティを完成させるためにパスワード認証をサーバー側で完全に禁止します。
【最重要の注意事項】
設定変更作業を行う際は、現在接続しているSSHセッション(ターミナル画面)を絶対に切断しないでください。設定に不備があった場合、別ウィンドウで接続確認が取れるまで現在のセッションからリカバリ(修正)できるようにしておく必要があります。
1. sshd_config のバックアップと編集
SSHサーバーの設定ファイル /etc/ssh/sshd_config を編集します。
# バックアップを取得
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 設定ファイルを編集
sudo nano /etc/ssh/sshd_config
# または sudo vim /etc/ssh/sshd_config
2. 設定項目の変更内容
以下の項目を探し、値を変更します(行頭に # がついている場合は削除して有効化します)。
# 公開鍵認証を有効化
PubkeyAuthentication yes
# パスワード認証を禁止(最重要)
PasswordAuthentication no
# 空パスワードでのログインを禁止
PermitEmptyPasswords no
# チャレンジレスポンス認証を禁止
KbdInteractiveAuthentication no
# rootユーザーの直接パスワードログインを禁止(鍵認証のみ許可、または完全禁止)
PermitRootLogin prohibit-password
※ 近年のUbuntu(22.04以降など)やDebianでは、/etc/ssh/sshd_config.d/*.conf 配下に設定が分割されている場合があります。その場合は /etc/ssh/sshd_config.d/50-cloud-init.conf などのファイルで PasswordAuthentication yes が上書きされていないかも確認してください。
3. 設定ファイルの構文チェック
サービスを再起動する前に、必ず設定ファイルの構文エラーをテストします。
sudo sshd -t
エラーが何も表示されずプロンプトが戻れば、構文は正常です。記述ミスがある場合は行番号とエラー内容が出力されます。
4. SSHサービスの再起動
OSに応じたコマンドで SSH サービスを再起動し、新しい設定を反映させます。
Ubuntu / Debian 系:
sudo systemctl restart ssh
RHEL / AlmaLinux / Rocky Linux / CentOS 系:
sudo systemctl restart sshd
5. 新しいターミナルを開いて動作確認(締め出し防止確認)
現在の接続を維持したまま、クライアントPC側で新しいターミナルウィンドウを開き、接続確認を行います。
- 鍵認証での接続テスト:
ssh -i ~/.ssh/id_ed25519 user@server_ip正常にログインできることを確認します。
- パスワード認証が拒否されることのテスト:
秘密鍵をあえて指定せず、パスワード認証を試みます。ssh -o PubkeyAuthentication=no user@server_ip以下のように
Permission denied (publickey)と表示されて接続が拒否されれば、パスワード無効化は完全に成功です!user@server_ip: Permission denied (publickey).
7. よくあるエラーとトラブルシューティング
SSH鍵認証の設定中・設定後に発生しやすいトラブルと、その解決策です。
トラブル1:Permission denied (publickey) と怒られて入れない
Permission denied エラー が出る場合、以下のチェックリストを順に確認してください。
- パーミッションの不整合:
サーバー側のchmod 700 ~/.sshおよびchmod 600 ~/.ssh/authorized_keysが設定されているか確認。 - ホームディレクトリの権限:
サーバー側の/home/usernameのパーミッションが777や775など他人に書込可能になっていないか確認(chmod 755 /home/usernameに修正)。 - 登録した公開鍵の内容:
authorized_keysにペーストした際、末尾の改行が抜けていたり、途中で勝手に改行が入って1行でなくなっていないか確認。 - SELinuxのブロック(RHEL / AlmaLinux / Rocky Linux):
手動でファイルを作成した場合、SELinuxのコンテキストがずれて読み取り拒否されることがあります。# SELinuxコンテキストの再適用 restorecon -R -v ~/.ssh
トラブル2:デバッグログを出力して原因を特定する
エラー原因が分からない場合は、クライアント側で -vvv オプションを付けて詳細ログを出力します。
ssh -vvv user@server_ip
ログのどの段階(Offering public key、Server accepts key、Next authentication method: password など)で拒否されたかが明確に分かります。
8. 実務運用のベストプラクティス
1. 複数クライアントからのアクセス管理
職場のPCと自宅のPCなど、複数の端末からログインする場合は、端末ごとに個別の鍵ペアを生成し、サーバー側の ~/.ssh/authorized_keys に改行区切りでそれぞれの公開鍵を追加します。
# ~/.ssh/authorized_keys の例
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... work-macbook
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... home-desktop
万が一どちらか1台の端末を紛失した場合でも、該当する公開鍵の行を削除するだけで、他の端末のアクセス権を維持したまま紛失端末のみを即座にアクセス遮断(失効)できます。
2. ssh-agent でパスフレーズ入力を省略する
秘密鍵にパスフレーズを設定すると安全ですが、接続のたびに入力するのは面倒です。ssh-agent を活用すれば、OS起動中やログインセッション中に1回入力するだけでパスフレーズをメモリ上に安全に保持できます。
# ssh-agentの起動と鍵の追加
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
まとめ & 関連リファレンス
SSH公開鍵認証の設定は、Linuxサーバーのセキュリティを確保するための第一歩です。
- 鍵生成: 高強度・高速な
ssh-keygen -t ed25519を推奨 - 登録:
ssh-copy-idで確実・安全に~/.ssh/authorized_keysに配置 - パーミッション:
.sshは700、authorized_keysは600を厳守 - パスワード禁止:
sshd_configでPasswordAuthentication noを設定し、セッションを維持したまま別ウィンドウで接続確認
初期設定を終えたら、続けて SSH configファイルの設定 や SSHポートの変更(22番からの変更) もあわせて実施すると、日々の運用効率とセキュリティをさらに高めることができます。

コメント