公開鍵認証はセキュリティ面でもパスワード認証より格段に強固で、現場のLinuxサーバーではほぼ標準の設定です。
この記事では、
ssh-keygen コマンドで鍵ペアを生成する基本手順から、サーバーへの公開鍵登録(authorized_keys)、パスフレーズの扱い、よくあるエラーの対処まで、実務で使えるレベルで解説します。動作確認環境:RHEL 9.4 / Ubuntu 24.04 LTS / Rocky Linux 9.3
この記事のポイント
・ssh-keygen -t ed25519 で最新推奨アルゴリズムの鍵ペアを生成できる
・公開鍵は ssh-copy-id またはauthorized_keysに手動追記で登録する
・パーミッション設定(700/600)が間違うとPermission deniedになる
・パスフレーズ+ssh-agentで安全性と利便性を両立できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
SSH公開鍵認証の仕組みを理解する
公開鍵認証は「秘密鍵を持っている本人かどうか」を数学的に検証するしくみです。パスワード認証と違い、パスワード文字列がネットワーク上を流れないため、盗聴やブルートフォース攻撃のリスクを大幅に下げられます。
鍵は必ずペアで生成されます。
・秘密鍵(private key):自分のPCに保管。絶対に外部に出さない
・公開鍵(public key):接続先サーバーに登録する。漏れても問題ない
接続時の流れはおおまかに以下の通りです。
1. クライアントが「公開鍵でこの乱数を暗号化してください」とサーバーに要求する
2. サーバーは登録済みの公開鍵で乱数を暗号化してクライアントに送り返す
3. クライアントは秘密鍵で復号して元の乱数と一致することを確認する
4. 一致すれば認証成功
秘密鍵を持っている本人しかこの検証をパスできないため、パスワードなしでも安全に接続できます。
ssh-keygenの基本的な使い方
1. 鍵ペアを生成する
ssh-keygen コマンドで鍵ペアを生成します。アルゴリズムには
ed25519 を指定するのが現在の推奨です(RSA-4096も可ですが、ed25519はより短い鍵長で同等以上の安全性を持ちます)。# ed25519アルゴリズムで鍵ペアを生成する(推奨) $ ssh-keygen -t ed25519 -C "your_email@example.com" Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): ← Enterで規定値 Enter passphrase (empty for no passphrase): ← パスフレーズを入力 Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub The key fingerprint is: SHA256:xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX your_email@example.com
-C オプションはコメントです。メールアドレスや用途を書いておくと複数鍵を管理するときに識別しやすくなります。パスフレーズを設定すると秘密鍵が盗まれても即時悪用されるリスクを下げられます(パスフレーズなしにする場合はそのままEnterを2回押します)。
2. 生成された鍵ファイルを確認する
# ~/.ssh/ ディレクトリを確認する $ ls -la ~/.ssh/ total 16 drwx------. 2 user user 4096 Apr 13 09:30 . drwx------. 7 user user 4096 Apr 13 09:30 .. -rw-------. 1 user user 411 Apr 13 09:30 id_ed25519 ← 秘密鍵(パーミッション600必須) -rw-r--r--. 1 user user 97 Apr 13 09:30 id_ed25519.pub ← 公開鍵(.pub付き)
600(所有者のみ読み書き可)になっていることを確認してください。他のユーザーが読み書きできる状態だとSSHクライアントが「Permissions too open」エラーを出して接続を拒否します。
3. RSA鍵を生成する場合(互換性が必要な場合)
古いサーバーへの接続など、ed25519が使えない環境では-t rsa -b 4096 でRSA 4096bit鍵を生成します。# RSA 4096bit鍵を生成する(旧環境との互換性が必要な場合) $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
公開鍵をサーバーに登録する
1. ssh-copy-idで自動登録する(推奨)
ssh-copy-id コマンドを使うと、公開鍵のコピーとサーバー側のパーミッション設定を自動で行えます。サーバー側に ~/.ssh が無ければ作成し、既に同じ鍵が登録されていれば重複を避ける挙動になっているため、運用上もっとも安全な方法です。# ssh-copy-idで公開鍵をサーバーに登録する $ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.100 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new key(s) user@192.168.1.100's password: ← この1回だけパスワードが必要 Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@192.168.1.100'"
ssh user@192.168.1.100 だけでパスワードなしで接続できます(パスフレーズを設定した場合はパスフレーズの入力が必要です)。-i を省略すると、ssh-copy-id は ssh-add -L の出力(ssh-agentに登録済みの鍵)やホームディレクトリ配下の標準鍵を自動で探して登録します。意図しない鍵が登録されるのを避けたい場合は、必ず -i で明示してください。2. 標準以外のSSHポートを使う場合(-pオプション)
セキュリティ対策としてSSHポートを22以外に変更している環境では、-p オプションでポート番号を指定します。# ポート2222を使うサーバーに公開鍵を登録する $ ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub user@192.168.1.100
ssh -p と同じです。user@host:2222 のようなコロン区切りは使えないので注意してください。事前にそのポートがLISTENしているかはLinux ポート確認の全コマンドで確認しておくと、接続失敗時の切り分けがスムーズです。3. 手動でauthorized_keysに追記する
ssh-copy-id が使えない環境では、公開鍵の内容をサーバーの ~/.ssh/authorized_keys に手動で追記します。# クライアント側で公開鍵の内容を確認する $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxx... your_email@example.com # サーバー側で ~/.ssh/authorized_keys に追記する $ mkdir -p ~/.ssh $ echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxx... your_email@example.com" >> ~/.ssh/authorized_keys # パーミッションを設定する(重要) $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
※注意:
authorized_keys には既存の公開鍵が入っている場合があります。>(上書き)ではなく >>(追記)を使わないと、既存の鍵が消えてロックアウトされる危険があります。Windows の Git Bash や標準OpenSSHクライアントで
ssh-copy-id が同梱されていない場合は、以下のワンライナーで同等の処理を一気に実行できます。# 公開鍵を標準入力から渡して追記する(ssh-copy-idが無い環境の代替) $ cat ~/.ssh/id_ed25519.pub | ssh user@192.168.1.100 \ "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
4. 接続確認と登録結果の確認
# 公開鍵認証で接続できることを確認する $ ssh user@192.168.1.100 Enter passphrase for key '/home/user/.ssh/id_ed25519': ← パスフレーズを設定した場合のみ表示 Last login: Sun Apr 13 09:30:00 2026 from 192.168.1.1 [user@server ~]$
# リモート側で登録行数と末尾の鍵・パーミッションを確認する $ ssh user@192.168.1.100 "wc -l ~/.ssh/authorized_keys; tail -1 ~/.ssh/authorized_keys" 3 /home/user/.ssh/authorized_keys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@example.com $ ssh user@192.168.1.100 "ls -ld ~/.ssh ~/.ssh/authorized_keys" drwx------. 2 user user 4096 Apr 20 09:10 /home/user/.ssh -rw-------. 1 user user 820 Apr 20 09:10 /home/user/.ssh/authorized_keys
.ssh が700、authorized_keys が600になっていれば正常です。ssh-agentでパスフレーズ入力を省略する
パスフレーズを設定すると接続のたびにパスフレーズ入力が必要になります。ssh-agent を使うと、1回入力するだけでセッション中はパスフレーズを記憶させられます。# ssh-agentを起動して秘密鍵を登録する $ eval "$(ssh-agent -s)" Agent pid 12345 $ ssh-add ~/.ssh/id_ed25519 Enter passphrase for /home/user/.ssh/id_ed25519: ← この1回だけ入力する Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com) # 登録済みの鍵を確認する $ ssh-add -l 256 SHA256:xXxXxXxXxXxXxXxX your_email@example.com (ED25519)
デスクトップ環境(GNOME等)では自動的にssh-agentが動いているため
ssh-add だけで済む場合もあります。複数の鍵を用途別に管理する(~/.ssh/config)
サーバーごとに異なる鍵ファイルを使いたい場合は~/.ssh/config にホスト定義を書きます。# ~/.ssh/config の設定例 Host web-server HostName 203.0.113.10 User ec2-user IdentityFile ~/.ssh/id_ed25519_webserver Host db-server HostName 203.0.113.20 User dbadmin IdentityFile ~/.ssh/id_rsa_legacy Port 22022
ssh web-server だけで接続できます。鍵ファイルのパスや接続先ホスト名を毎回打ち込む必要がなくなり、作業ミスも減ります。
ssh-copy-id もこのconfigを読んでくれるため、ssh-copy-id web-server のようにホスト別名だけで鍵登録まで完結します。「Permission denied (publickey)」が出た時の対処法
公開鍵認証を設定したのにPermission denied (publickey) が出るケースで最も多い原因はパーミッションの誤設定です。20年以上サーバーを運用してきた経験から言うと、原因の9割はクライアント・サーバーどちらかのパーミッションかsshd側の設定に集約されます。1. クライアント側のパーミッションを確認する
# 秘密鍵のパーミッションを確認する(600でなければ修正) $ ls -la ~/.ssh/id_ed25519 -rw-------. 1 user user 411 Apr 13 09:30 /home/user/.ssh/id_ed25519 # 権限が緩い場合は修正する $ chmod 600 ~/.ssh/id_ed25519 $ chmod 700 ~/.ssh
2. サーバー側のパーミッションを確認する
# サーバー側で確認する(SSHでログインできる場合) $ ls -la ~/.ssh/ drwx------. 2 user user 4096 Apr 13 09:30 . -rw-------. 1 user user 411 Apr 13 09:30 authorized_keys ← 600必須 $ ls -la ~ | grep .ssh drwx------. 2 user user 4096 Apr 13 09:30 .ssh ← 700必須
3. ホームディレクトリのパーミッションが緩いケース
意外と見落としやすいのが、ホームディレクトリそのものが他人から書き込める状態になっているパターンです。# ホームディレクトリのパーミッションを確認する $ ls -ld /home/user drwxr-xr-x. 5 user user 4096 Apr 20 09:00 /home/user # 「group」「other」に書き込み権限がある場合はsshdが鍵認証を拒否する $ chmod go-w /home/user
4. sshd_configで公開鍵認証が有効か確認する
# /etc/ssh/sshd_config の設定を確認する $ sudo grep -E "PubkeyAuthentication|AuthorizedKeysFile" /etc/ssh/sshd_config PubkeyAuthentication yes ← yesになっていること AuthorizedKeysFile .ssh/authorized_keys ← 標準パス # 変更したらsshdを再起動する $ sudo systemctl reload sshd
PubkeyAuthentication no になっていると鍵認証が完全に無効化されます。また、SELinuxが有効なRHEL系では authorized_keys のセキュリティコンテキストがずれると鍵が読めなくなるため、その場合は restorecon -R -v ~/.ssh でコンテキストを復元してください。5. 詳細ログで原因を特定する
-v オプションを付けると接続の詳細ログが出ます。-vvv でさらに詳しく確認できます。# -vで詳細ログを出力して原因を特定する $ ssh -v user@192.168.1.100 ... debug1: Trying private key: /home/user/.ssh/id_ed25519 debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic debug1: No more authentication methods to try. user@192.168.1.100: Permission denied (publickey).
Trying private key」の行で鍵ファイルのパスを確認し、「Authentications that can continue」で許可されている認証方式を確認します。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ed25519鍵ペアを生成する | ssh-keygen -t ed25519 -C "コメント" |
| RSA鍵ペアを生成する(旧環境向け) | ssh-keygen -t rsa -b 4096 -C "コメント" |
| 公開鍵をサーバーに自動登録する | ssh-copy-id -i ~/.ssh/id_ed25519.pub user@ホスト名 |
| 非標準ポートに自動登録する | ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub user@ホスト名 |
| ssh-copy-idが無い環境でワンライナー登録する | cat ~/.ssh/id_ed25519.pub | ssh user@ホスト名 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" |
| authorized_keysに手動追記する | echo "公開鍵の内容" >> ~/.ssh/authorized_keys |
| 登録後に確認する | ssh user@ホスト名 "tail -1 ~/.ssh/authorized_keys" |
| ssh-agentに秘密鍵を登録する | ssh-add ~/.ssh/id_ed25519 |
| 登録済みの鍵を確認する | ssh-add -l |
| 接続詳細ログを表示する | ssh -v user@ホスト名 |
| SELinuxコンテキストを復元する | restorecon -R -v ~/.ssh |
特にサーバーを複数管理するエンジニアにとっては欠かせない設定です。
SSH接続の基本的なコマンドや接続オプションについては、sshコマンドでLinuxサーバーにリモート接続する方法も合わせて参照してください。
また、SSHのセキュリティ強化としてポート番号変更やパスワード認証の無効化については、SSHのポート番号を変更する方法|sshd_configの設定からfirewalld・SELinux対応まででも解説しています。
SSH設定が整ったら、次はサーバー構築の基礎を体系的に学びませんか?
公開鍵認証をマスターするとサーバー管理が格段にラクになります。その力を活かして、体系的にLinuxサーバー構築を学んでみませんか。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:xargsの並列処理-Pで一括処理を高速化する|-n・-I・-d・-rの実務テクニック
- 前のページへ:tcpdumpコマンドでパケットをキャプチャ・解析する方法|フィルタ指定・ファイル保存・実務活用も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます