4.

ssh-keygen の使い方|Ed25519 の鍵作成・公開鍵の登録・パーミッション

編集
この記事の要点
  • ssh-keygen は SSH の公開鍵・秘密鍵のペアを作るコマンド
  • 今から作るなら Ed25519 が第一候補。ssh-keygen -t ed25519 -C コメント
  • 公開鍵(.pub)はサーバへ、秘密鍵は自分の端末から出さない。これを逆にすると即アウト
  • 接続できない原因の大半はパーミッション~/.ssh は 700、authorized_keys は 600
  • 鍵にパスフレーズを付け、ssh-agent に預けると入力の手間なく安全に使える

ssh-keygen とは

ssh-keygen は、SSH の公開鍵認証で使う鍵ペア(秘密鍵と公開鍵)を生成するコマンドです。パスワード認証と違い、総当たり攻撃で破られる心配がほとんどなく、自動化にも向いています。

仕組みは単純です。公開鍵をサーバに登録しておき、接続時に「その公開鍵に対応する秘密鍵を持っているか」をサーバが確かめるという流れで、秘密鍵そのものはネットワークを流れません。

[公開鍵認証の流れ]
  クライアント                          サーバ
       |                                 |
       | -- 接続要求(この公開鍵で) -->  |
       |                                 | authorized_keys に
       |                                 | その公開鍵があるか確認
       | <-- ランダムな文字列(チャレンジ)|
       |                                 |
       | 秘密鍵で署名して返す --------->  | 公開鍵で署名を検証
       |                                 |
       | <-------- 認証成功 -----------  |
       |                                 |
   ※ 秘密鍵は一度もネットワークを流れない

鍵を作る

# 推奨: Ed25519
ssh-keygen -t ed25519 -C "you@example.com"

# 古い機器に繋ぐなど、Ed25519 が使えない場合は RSA 4096
ssh-keygen -t rsa -b 4096 -C "you@example.com"

# ファイル名を指定して作る(用途ごとに分けたいとき)
ssh-keygen -t ed25519 -C "github" -f ~/.ssh/id_ed25519_github

実行すると 2 つ聞かれます。

質問意味おすすめ
Enter file in which to save the key保存先。空 Enter で既定の ~/.ssh/id_ed25519用途が 1 つなら既定でよい
Enter passphrase秘密鍵自体にかけるパスワード付ける。ssh-agent と組み合わせれば毎回入力しなくて済む

できあがるのは 2 ファイルです。

ファイル中身扱い
id_ed25519秘密鍵絶対に外へ出さない。共有・アップロード禁止
id_ed25519.pub公開鍵サーバや GitHub に登録する。人に見せてよい

主なオプション

オプション意味
-t 種類鍵の種類。ed25519 / rsa / ecdsa
-b ビット数鍵長。RSA で使う(4096 推奨)。Ed25519 では固定なので不要
-C コメント公開鍵の末尾に付く目印。どのマシンの鍵か分かるようにする
-f ファイル名保存先を指定
-p既存の鍵のパスフレーズを変更する
-y秘密鍵から公開鍵を復元して表示する
-l -f 鍵フィンガープリントを表示する

鍵の種類の選び方

種類特徴使うか
Ed25519短くて速い。強度も十分第一候補
RSA 4096互換性がいちばん広いEd25519 非対応の相手に
RSA 1024 以下強度が不足使わない
ECDSA曲線の選定に懸念があるとされる積極的には選ばない
DSA1024 ビット固定。OpenSSH では既定で無効使わない

公開鍵をサーバに登録する

# いちばん簡単(パスワード認証がまだ使える状態で)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

# 手動でやる場合は、公開鍵の中身を authorized_keys に追記する

# サーバ側でパーミッションを整える(ここが最重要)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

パーミッションが緩いと SSH は鍵を無視します。エラーメッセージが出ないままパスワードを聞かれるので、原因が分かりにくいのが厄介です。接続できないときは真っ先にここを確認してください。

対象権限
ホームディレクトリ他人に書き込み権限が無いこと(755 など)
~/.ssh700
~/.ssh/authorized_keys600
秘密鍵(クライアント側)600

ssh-agent でパスフレーズの入力を省く

# エージェントを起動して鍵を預ける
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

# 預けてある鍵を確認
ssh-add -l

# 全部外す
ssh-add -D

これで、パスフレーズ付きの鍵でも入力は 1 回で済みます。パスフレーズを付けない理由にはならないので、必ず付けてください。秘密鍵ファイルが流出しても、パスフレーズがあれば即座には悪用されません。

用途ごとに鍵を分ける

# ~/.ssh/config
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    IdentitiesOnly yes

Host myserver
    HostName 203.0.113.10
    User deploy
    Port 22022
    IdentityFile ~/.ssh/id_ed25519_server
    IdentitiesOnly yes

この設定があれば ssh myserver だけで繋がります。IdentitiesOnly yes を付けないと、手元の鍵を順番に試して試行回数超過でサーバに拒否されることがあります。鍵が増えてきたら付けておくのが安全です。

FAQ

Q: 秘密鍵をなくしました
A: 復元はできません。新しい鍵ペアを作り直し、サーバ側の authorized_keys から古い公開鍵の行を削除してください。

Q: 鍵を作ったのにパスワードを聞かれます
A: ほぼパーミッションの問題です。サーバ側の ~/.ssh(700)と authorized_keys(600)、それにホームディレクトリが他人に書けない状態かを確認してください。ssh -v で詳細ログを見ると原因がつかめます。

Q: 同じ鍵を複数のサーバで使い回していいですか?
A: 動きますが、1 つ漏れると全部に影響します。少なくとも「業務用」と「個人用」は分けてください。

Q: 公開鍵をなくしました
A: 秘密鍵から復元できます。ssh-keygen -y -f ~/.ssh/id_ed25519 の出力が公開鍵です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Linux(Mac)クライアントからLinuxサーバーへのSSH鍵接続
  2. Cygwinを使用したSSH接続方法
  3. エラー一覧
  4. ssh-keygenによる鍵生成