【Linux】SSH 鍵認証の設定手順まとめ|ssh-keygen生成・authorized_keys登録・パスワード禁止まで徹底解説

実務レシピ

Linuxサーバーの初期構築やセキュリティ強化において、最も重要かつ基本となるのが「SSH公開鍵認証(鍵認証)」の設定です。

初期状態のパスワード認証のまま運用を続けると、インターネット経由での総当たり攻撃(ブルートフォース攻撃)や辞書攻撃に晒され、不正アクセスのリスクが跳ね上がります。公開鍵認証に移行し、パスワード認証を完全に無効化することで、第三者による不正侵入を極めて強固に遮断できます。

しかし、設定手順やパーミッション(権限)を誤ると、「Permission denied (publickey) でログインできなくなる」「sshd設定を変更した後にサーバーから締め出される」といった致命的なトラブルに直面することがあります。

この記事では、クライアントPCでの鍵生成(Ed25519推奨)からサーバーへの公開鍵登録、厳格なパーミッション設定、接続テスト、そして sshd_config でのパスワード認証無効化まで、現場で即コピペして使える完全手順を徹底解説します。

  1. 【早見表】SSH鍵認証設定の完全フロー チートシート
  2. 1. SSH公開鍵認証の仕組みとメリット
    1. 鍵アルゴリズムの選び方(Ed25519 vs RSA)
  3. 2. ステップ1:クライアント側で鍵ペアを生成する(ssh-keygen)
    1. Ed25519 鍵の生成(推奨)
    2. RSA 4096bit 鍵の生成(レガシー互換用)
    3. 鍵生成時の対話プロンプトの流れ
    4. 生成されたファイルの確認
  4. 3. ステップ2:サーバーへ公開鍵を登録する
    1. 方法A:ssh-copy-id コマンドを使う(最短・確実)
    2. 方法B:手動で authorized_keys に登録する(ssh-copy-id が使えない場合)
  5. 4. ステップ3:サーバー側のパーミッション(権限)を厳格に設定する
  6. 5. ステップ4:鍵認証でのSSH接続を確認する(クライアント側)
    1. ~/.ssh/config を設定して接続を効率化する
  7. 6. ステップ5:パスワード認証を無効化する(sshd_config)
    1. 1. sshd_config のバックアップと編集
    2. 2. 設定項目の変更内容
    3. 3. 設定ファイルの構文チェック
    4. 4. SSHサービスの再起動
    5. 5. 新しいターミナルを開いて動作確認(締め出し防止確認)
  8. 7. よくあるエラーとトラブルシューティング
    1. トラブル1:Permission denied (publickey) と怒られて入れない
    2. トラブル2:デバッグログを出力して原因を特定する
  9. 8. 実務運用のベストプラクティス
    1. 1. 複数クライアントからのアクセス管理
    2. 2. ssh-agent でパスフレーズ入力を省略する
  10. まとめ & 関連リファレンス
  11. 関連記事

【早見表】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_configPasswordAuthentication 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:サーバー側で直接ファイル編集

  1. クライアント側で公開鍵の内容を表示してコピーする:
    cat ~/.ssh/id_ed25519.pub
  2. サーバーにログインし、~/.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側で新しいターミナルウィンドウを開き、接続確認を行います。

  1. 鍵認証での接続テスト:
    ssh -i ~/.ssh/id_ed25519 user@server_ip

    正常にログインできることを確認します。

  2. パスワード認証が拒否されることのテスト:
    秘密鍵をあえて指定せず、パスワード認証を試みます。

    ssh -o PubkeyAuthentication=no user@server_ip

    以下のように Permission denied (publickey) と表示されて接続が拒否されれば、パスワード無効化は完全に成功です!

    user@server_ip: Permission denied (publickey).

7. よくあるエラーとトラブルシューティング

SSH鍵認証の設定中・設定後に発生しやすいトラブルと、その解決策です。

トラブル1:Permission denied (publickey) と怒られて入れない

Permission denied エラー が出る場合、以下のチェックリストを順に確認してください。

  1. パーミッションの不整合:
    サーバー側の chmod 700 ~/.ssh および chmod 600 ~/.ssh/authorized_keys が設定されているか確認。
  2. ホームディレクトリの権限:
    サーバー側の /home/username のパーミッションが 777775 など他人に書込可能になっていないか確認(chmod 755 /home/username に修正)。
  3. 登録した公開鍵の内容:
    authorized_keys にペーストした際、末尾の改行が抜けていたり、途中で勝手に改行が入って1行でなくなっていないか確認。
  4. SELinuxのブロック(RHEL / AlmaLinux / Rocky Linux):
    手動でファイルを作成した場合、SELinuxのコンテキストがずれて読み取り拒否されることがあります。

    # SELinuxコンテキストの再適用
    restorecon -R -v ~/.ssh

トラブル2:デバッグログを出力して原因を特定する

エラー原因が分からない場合は、クライアント側で -vvv オプションを付けて詳細ログを出力します。

ssh -vvv user@server_ip

ログのどの段階(Offering public keyServer accepts keyNext 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 に配置
  • パーミッション: .ssh700authorized_keys600 を厳守
  • パスワード禁止: sshd_configPasswordAuthentication no を設定し、セッションを維持したまま別ウィンドウで接続確認

初期設定を終えたら、続けて SSH configファイルの設定SSHポートの変更(22番からの変更) もあわせて実施すると、日々の運用効率とセキュリティをさらに高めることができます。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント