SSH 鍵認証セットアップ - パスワードレスで安全にログイン
この記事でできるようになること
- ED25519 の鍵ペアを生成し、公開鍵をサーバに配置してパスワードなしでログインできる
- `~/.ssh` 配下の権限を正しく設定し、`Permission denied (publickey)` を自力で切り分けられる
- `~/.ssh/config` と `ssh-agent` で複数サーバとパスフレーズを管理できる
前提知識(先に読むと理解しやすい記事)
この記事で解決できること
- SSH 鍵ペア(公開鍵・秘密鍵)を生成してサーバに接続する手順が分かる
ssh-copy-idで公開鍵を正しく配置できる~/.ssh/configで複数サーバを管理する方法が身につく
用語の整理(この記事で使う言葉を先に定義します)
- 鍵ペア: 対になる 2 つのファイルです。公開鍵(
.pubが付く方)と秘密鍵(.pubが付かない方)で 1 組になります - 公開鍵: サーバ側に置く鍵です。他人に見られても問題ありません。「パブリックキー」とも呼びます
- 秘密鍵: 手元の端末に置く鍵です。他人に渡ってはいけないファイルです。「プライベートキー」「identity file」も同じものを指します
- パスフレーズ: 秘密鍵ファイル自体を暗号化するための合言葉です。サーバのログインパスワードとは別物です。混同しやすいので区別してください
authorized_keys: サーバ側で「このユーザーとしてログインしてよい公開鍵」を並べたファイルです。~/.ssh/authorized_keysに置きますssh-agent: 復号した秘密鍵をメモリ上で預かる常駐プログラムです。パスフレーズの再入力を省けます- ED25519 / RSA: 鍵の作り方(アルゴリズム)の名前です。現在の推奨は ED25519 です
結論(3 ステップ)
ssh-keygen -t ed25519で鍵ペアを生成するssh-copy-id user@serverで公開鍵をサーバに配置するssh user@serverでパスワードなしでログインできる
前提(対象環境)
- OS: Ubuntu / Debian / RHEL 系 Linux
- クライアント・サーバ両方に OpenSSH がインストール済み
- 初期設定時はパスワード認証でサーバにログインできる状態
なぜ鍵認証を使うのか?
パスワード認証より安全で、自動化にも強い方式です。鍵認証を使う主な理由は 3 点あります。
- 安全性: 秘密鍵はクライアント端末から出ません。パスワードをネットワーク越しに送らずに認証できます
- ブルートフォース(総当たり攻撃)耐性: 十分な長さの鍵は、片端から試す攻撃が事実上不可能です
- 自動化: rsync・Ansible・CI/CD パイプラインなど、人が入力できない場面でも接続できます
1. 鍵ペアの生成
どのアルゴリズムを選ぶか?
現在は ED25519 一択です。RSA-4096 と同等以上の強度を、はるかに短い鍵と高速な処理で得られます。古い機器で ED25519 に対応していない場合だけ -t rsa -b 4096 を使ってください。
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 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
-C は鍵のコメント(識別用)。省略しても動作する。
パスフレーズを設定する理由
パスフレーズを設定すると、秘密鍵ファイル自体が暗号化されます。端末を盗まれても、そのままでは鍵を使えません。毎回の入力が面倒な場合は ssh-agent で省略できます(後述)。空のまま Enter で進めることもできますが、その場合は秘密鍵ファイルを手に入れた人が即座にログインできる状態になります。
生成後の確認:
ls -la ~/.ssh/
total 16 drwx------ 2 user user 4096 May 31 10:00 . drwxr-xr-x 8 user user 4096 May 31 10:00 .. -rw------- 1 user user 419 May 31 10:00 id_ed25519 -rw-r--r-- 1 user user 107 May 31 10:00 id_ed25519.pub
id_ed25519(秘密鍵): 権限は600。手元の端末から動かさないファイルですid_ed25519.pub(公開鍵): サーバの~/.ssh/authorized_keysに追記する側です
秘密鍵でやってはいけないこと
秘密鍵が他人の手に渡ると、その鍵で入れるサーバすべてに侵入されます。パスワードの使い回しより被害範囲が広くなります。
- メール・チャット・課題管理ツールに貼らない: 送信先の履歴とログに永久に残ります。共有が必要なのは常に公開鍵(
.pub)の方です - 共有サーバや共有ストレージに置かない:
scpで秘密鍵をサーバへコピーするのは典型的な事故です。サーバ側に置くのは公開鍵だけです - リポジトリにコミットしない: 一度 push した鍵は履歴から消しても漏洩したものとして扱います
- 端末ごとに別の鍵を作る: 1 本を全端末で使い回すと、1 台の紛失で全滅します
漏らしたかもしれないときの対処
- サーバ側の
~/.ssh/authorized_keysから該当する公開鍵の行を削除する ssh-keygen -t ed25519で新しい鍵ペアを作り、配り直す- その鍵を登録していたサービス(GitHub 等)でも登録を削除する
2. 公開鍵をサーバに配置する
ssh-copy-id を使う(推奨)
パスワード認証がまだ有効なうちに、1 回だけ実行します。実行時に聞かれるのはサーバのログインパスワードです。鍵のパスフレーズではありません。
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
/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) /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed user@server's password: Number of key(s) added: 1
ssh-copy-id はサーバ側の ~/.ssh/authorized_keys に公開鍵の内容を追記します。既存の鍵は上書きされず、追記されます。~/.ssh を新しく作る場合は適切な権限で作成しますが、既にあるディレクトリやファイルの権限は直しません。次章の権限確認は必ず実施してください。
ssh-copy-id が使えないときの手動配置
cat ~/.ssh/id_ed25519.pub | ssh user@server \ "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
>>(追記)を >(上書き)に書き間違えない
上のコマンドの cat >> ~/.ssh/authorized_keys は追記です。> にすると上書きになります。サーバに登録済みだった他の公開鍵がすべて消えます。同僚や CI が使っていた鍵も消え、復旧にはコンソールからの作業が必要になります。
配置元のファイルが .pub であることも確認してください。.pub を付け忘れると秘密鍵をサーバへ送ることになります。
3. パーミッションを正しく設定する
SSH は ディレクトリとファイルの権限が緩すぎると鍵認証を拒否 する設計です。他人が読み書きできる場所に置かれた鍵は信用できない、という考え方に基づきます。
| パス | 正しい権限 | 理由 |
|---|---|---|
~/.ssh/ |
700 |
所有者のみ読み書き実行 |
~/.ssh/authorized_keys |
600 |
所有者のみ読み書き |
~/.ssh/id_ed25519 |
600 |
秘密鍵は特に厳格に |
~/.ssh/id_ed25519.pub |
644 |
公開鍵は他者が読んでも問題ない |
確認・修正コマンド:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_ed25519
権限が緩すぎると鍵認証は失敗します。ただし「どこが緩いか」で、拒否する側が変わります。
- サーバ側: ホームディレクトリ・
~/.ssh・authorized_keysのいずれかがグループまたは他人から書き込み可(775/777など)だと、sshd はその鍵を無視してPermission denied (publickey)を返します。755や644は拒否されません - クライアント側: 秘密鍵にグループまたは他人の権限が 1 つでも付いていると(
644/755など)、sshがUNPROTECTED PRIVATE KEY FILEを表示して鍵を使いません。この拒否はサーバではなく手元のsshによるものです
接続できないときは、まず上の表の権限にそろっているかを確認してください。
chmod 777 ~/.ssh で解決しようとしない: 権限を緩めると症状は悪化します。全ユーザーが authorized_keys を書き換えられる状態になり、他人が自分の公開鍵を追記して侵入できるためです。上の表の値(700 / 600 / 644)にそろえるのが正しい対処です。
4. 接続テスト
ssh -v user@server
-v(verbose = 詳細)を付けると、認証の過程がログとして出力されます。どの鍵を提示し、サーバがそれを受け入れたかが分かります。
... debug1: Offering public key: /home/user/.ssh/id_ed25519 ED25519 SHA256:xxxxx debug1: Server accepts key: /home/user/.ssh/id_ed25519 ED25519 SHA256:xxxxx Authenticated to server ([x.x.x.x]:22) using "publickey".
Authenticated to server ... using "publickey" が出れば鍵認証は成功です。
パスワード認証を無効化するのは、鍵認証の成功を確認してから
/etc/ssh/sshd_config の PasswordAuthentication no は、鍵認証が確実に動く状態になるまで設定しないでください。鍵の配置に失敗したまま無効化すると、誰もログインできないサーバができあがります。
安全な手順
- いま接続している SSH セッションは閉じずに残す
- 別のターミナルから新しいセッションで鍵ログインできることを確認する
- 確認できてから設定を変更し、
sudo systemctl reload ssh(RHEL 系はsshd)を実行する - さらに別のセッションでログインできることを確認してから、最初のセッションを閉じる
トラブルシューティング
症状: Permission denied (publickey)
確認 1: そもそも鍵が提示されているか
ssh -v user@server 2>&1 | grep -i "offering\|authentications that can continue"
提示されていなければ、ssh -i ~/.ssh/id_ed25519 user@server で鍵を明示するか、~/.ssh/config の IdentityFile を確認します。
確認 2: クライアント側の秘密鍵の権限
ls -l ~/.ssh/id_ed25519
-rw-------(600)以外なら chmod 600 ~/.ssh/id_ed25519 で直します。
確認 3: サーバ側の権限と登録内容
ssh user@server 'ls -ld ~ ~/.ssh; ls -l ~/.ssh/authorized_keys; wc -l ~/.ssh/authorized_keys'
ホームディレクトリ・~/.ssh・authorized_keys のいずれかがグループまたは他人から書き込み可なら、sshd は鍵を無視します。
対処
- 権限を
700/600にそろえる ssh-copy-idを実行し直す- それでも失敗するなら、サーバ側で
sudo journalctl -u ssh -n 30を実行し、拒否理由を読む(RHEL 系は-u sshd)
5. ~/.ssh/config で接続設定を管理する
接続先が増えてきたら ~/.ssh/config を使います。ホスト名・ユーザー名・鍵ファイルの組み合わせに、短い名前を付けられます。
vim ~/.ssh/config
設定例:
Host myserver
HostName 192.168.1.100
User ubuntu
IdentityFile ~/.ssh/id_ed25519
Port 22
Host staging
HostName staging.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519設定後は ssh myserver だけで接続できる。
chmod 600 ~/.ssh/config
~/.ssh/config がグループまたは他人から書き込み可(664 など)だと、ssh は Bad owner or permissions on /home/user/.ssh/config を表示して接続を中止します。無視して続行はしません。600 にしておいてください。
6. ssh-agent でパスフレーズを管理する
パスフレーズを毎回入力しなくて済む仕組みです。セッション開始時に 1 回だけ入力すれば、以後は省略できます。預けた鍵はメモリ上に置かれ、ログアウトで消えます。
# エージェントを起動 eval "$(ssh-agent -s)" # 鍵を登録(1 回だけパスフレーズを入力) ssh-add ~/.ssh/id_ed25519
Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com)
登録済み鍵の確認:
ssh-add -l
macOS は Keychain 統合により自動的に ssh-agent が動作する。~/.ssh/config に UseKeychain yes と AddKeysToAgent yes を追記すると再起動後も引き継がれる。
まとめ
| コマンド | 用途 |
|---|---|
ssh-keygen -t ed25519 |
鍵ペア生成(ED25519 推奨) |
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server |
公開鍵をサーバに配置 |
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys |
権限を正しく設定 |
ssh -v user@server |
詳細ログ付きで接続テスト |
eval "$(ssh-agent -s)" && ssh-add |
エージェントにパスフレーズを預ける |