SSH 鍵認証セットアップ - パスワードレスで安全にログイン

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 ステップ)

  1. ssh-keygen -t ed25519 で鍵ペアを生成する
  2. ssh-copy-id user@server で公開鍵をサーバに配置する
  3. 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 に追記する側です

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"

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

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_configPasswordAuthentication no は、鍵認証が確実に動く状態になるまで設定しないでください。鍵の配置に失敗したまま無効化すると、誰もログインできないサーバができあがります。

安全な手順

  1. いま接続している SSH セッションは閉じずに残す
  2. 別のターミナルから新しいセッションで鍵ログインできることを確認する
  3. 確認できてから設定を変更し、sudo systemctl reload ssh(RHEL 系は sshd)を実行する
  4. さらに別のセッションでログインできることを確認してから、最初のセッションを閉じる

トラブルシューティング

症状: 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/configIdentityFile を確認します。

確認 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'

ホームディレクトリ・~/.sshauthorized_keys のいずれかがグループまたは他人から書き込み可なら、sshd は鍵を無視します。

対処

  1. 権限を 700 / 600 にそろえる
  2. ssh-copy-id を実行し直す
  3. それでも失敗するなら、サーバ側で 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 など)だと、sshBad 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/configUseKeychain yesAddKeysToAgent 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 エージェントにパスフレーズを預ける

次に読む

この記事を共有

次の一手