SSH鍵管理ガイド
安全な鍵の生成・管理・運用
SSH鍵認証の仕組みから、鍵の生成、ssh-agentの活用、~/.ssh/configの設定まで、安全で効率的なSSH鍵の管理方法を解説します。
こんな人向けの記事です
- SSH鍵認証の仕組みを理解したい
- 鍵の種類(RSA, Ed25519)の選び方を知りたい
- 複数サーバーのSSH鍵を効率的に管理したい
STEP 1SSH鍵認証の仕組み(公開鍵暗号)
SSH鍵認証は、公開鍵暗号という仕組みを使ってサーバーにログインする方式です。パスワード認証と違い、鍵ファイルを持っているPCからしか接続できないため、安全性が格段に向上します。
公開鍵と秘密鍵のペア
SSH鍵認証では、公開鍵と秘密鍵の2つのファイルがペアになっています。
| 鍵の種類 | 保管場所 | 役割 | 公開してよいか |
|---|---|---|---|
| 公開鍵(.pub) | 接続先のサーバー | 暗号化・署名検証に使用 | はい(誰に見せてもOK) |
| 秘密鍵 | 自分のPC | 復号・署名に使用 | いいえ(絶対に漏らさない) |
認証の流れ
SSH鍵認証は、以下のステップで行われます。
- クライアント(自分のPC)がサーバーに接続を要求する
- サーバーがランダムなデータ(チャレンジ)を生成し、クライアントに送る
- クライアントは秘密鍵でチャレンジに署名して返す
- サーバーは登録済みの公開鍵で署名を検証する
- 検証が成功すればログインが許可される
STEP 2鍵の種類と選び方(RSA, Ed25519)
SSH鍵にはいくつかの暗号アルゴリズムがあります。現在主に使われているのは RSA と Ed25519 の2つです。
| アルゴリズム | 鍵の長さ | 安全性 | 速度 | 互換性 | 推奨度 |
|---|---|---|---|---|---|
| Ed25519 | 256ビット固定 | 非常に高い | 非常に速い | OpenSSH 6.5以降 | 最もおすすめ |
| RSA | 2048〜4096ビット | 高い(4096ビット推奨) | やや遅い | ほぼすべての環境 | 互換性重視なら |
| ECDSA | 256/384/521ビット | 高い | 速い | OpenSSH 5.7以降 | あまり推奨しない |
| DSA | 1024ビット固定 | 低い | 速い | 古い環境のみ | 使用禁止 |
Ed25519の特徴
- 楕円曲線暗号の一種で、Curve25519という曲線を使用
- 鍵の長さが256ビット固定なので、公開鍵のファイルサイズが非常に小さい
- タイミング攻撃(処理時間の差から鍵を推測する攻撃)に耐性がある
- RSA 3072ビットと同等以上の安全性を、はるかに短い鍵で実現
RSAを選ぶケース
- 古いサーバーやネットワーク機器に接続する必要がある
- 組織のセキュリティポリシーでRSAが指定されている
- GitHubやGitLabなど、一部のサービスでEd25519がサポートされていない場合(現在はほぼサポート済み)
STEP 3鍵ペアの生成(ssh-keygen)
ssh-keygen コマンドで鍵ペアを生成します。ここでは推奨の Ed25519 と、互換性用の RSA の両方の手順を解説します。
Ed25519鍵の生成(推奨)
ssh-keygen -t ed25519 -C "your_email@example.com"
RSA鍵の生成(互換性が必要な場合)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
生成時の対話プロンプト
コマンドを実行すると、以下の3つを聞かれます。
1. 鍵ファイルの保存先
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
デフォルトのパスでよければ、そのまま Enter を押します。複数の鍵を使い分ける場合は、用途がわかるファイル名を指定しましょう。
# 本番サーバー用
/home/user/.ssh/id_ed25519_production
# GitHub用
/home/user/.ssh/id_ed25519_github
# 開発サーバー用
/home/user/.ssh/id_ed25519_dev
2. パスフレーズの設定
Enter passphrase (empty for no passphrase):
パスフレーズは必ず設定してください。秘密鍵が漏洩した場合でも、パスフレーズが設定されていればすぐには悪用できません。
生成されるファイル
| ファイル | 内容 | パーミッション |
|---|---|---|
~/.ssh/id_ed25519 |
秘密鍵 | 600(所有者のみ読み書き可能) |
~/.ssh/id_ed25519.pub |
公開鍵 | 644(誰でも読み取り可能) |
公開鍵をサーバーに登録する
ssh-copy-id コマンドを使うと、公開鍵をサーバーの ~/.ssh/authorized_keys に自動で追加できます。
ssh-copy-id -i ~/.ssh/id_ed25519.pub ユーザー名@サーバーのIPアドレス
ssh-copy-id が使えない環境では、手動で登録します。
# 公開鍵の内容を表示してコピー
cat ~/.ssh/id_ed25519.pub
# .sshディレクトリがなければ作成
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 公開鍵を追加
echo "コピーした公開鍵の内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
パーミッションの確認
SSHはファイルのパーミッションに厳格です。パーミッションが正しくないと、鍵認証が拒否されます。
# 正しいパーミッションを設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # 秘密鍵
chmod 644 ~/.ssh/id_ed25519.pub # 公開鍵
chmod 600 ~/.ssh/authorized_keys # サーバー側
chmod 644 ~/.ssh/config # 設定ファイル
STEP 4ssh-agentとパスフレーズ管理
パスフレーズを設定すると、SSH接続のたびに入力が必要になります。ssh-agent を使えば、一度入力したパスフレーズをメモリに保持し、以降の接続では自動的に認証が行われます。
ssh-agentとは
ssh-agent は、秘密鍵をメモリ上に保持するバックグラウンドプロセスです。以下のメリットがあります。
- パスフレーズの入力が1回で済む(セッション中は自動認証)
- 秘密鍵がディスクから直接読み取られることを防ぐ
- SSH転送(Agent Forwarding)で踏み台サーバー経由の接続が安全にできる
ssh-agentの起動と鍵の登録
# ssh-agentを起動
eval "$(ssh-agent -s)"
# 秘密鍵を登録(パスフレーズを聞かれる)
ssh-add ~/.ssh/id_ed25519
macOSの場合
macOSでは、キーチェーンと連携してパスフレーズを保存できます。
# キーチェーンにパスフレーズを保存
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
~/.ssh/config に以下を追加すると、macOS起動時に自動でキーチェーンから鍵を読み込みます。
Host *
AddKeysToAgent yes
UseKeychain yes
登録済みの鍵を確認する
# 登録済みの鍵の一覧を表示
ssh-add -l
# 登録済みの公開鍵を表示
ssh-add -L
鍵の削除
# 特定の鍵を削除
ssh-add -d ~/.ssh/id_ed25519
# 全ての鍵を削除
ssh-add -D
ssh -A でAgent Forwardingを使うと、踏み台サーバーから別サーバーへの接続が便利になります。しかし、踏み台サーバーの管理者があなたの鍵を悪用できるリスクがあります。信頼できるサーバーでのみ使用してください。
STEP 5~/.ssh/config の設定
~/.ssh/config は、SSH接続の設定をホストごとに定義できるファイルです。長いコマンドを毎回打つ代わりに、短いエイリアスで接続できるようになります。
基本的な書き方
# 本番サーバー
Host production
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_production
IdentitiesOnly yes
# 開発サーバー
Host dev
HostName 192.168.1.100
User developer
IdentityFile ~/.ssh/id_ed25519_dev
# GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
設定後は、以下のように短いコマンドで接続できます。
# 以前: ssh -p 2222 -i ~/.ssh/id_ed25519_production deploy@203.0.113.10
# 以後:
ssh production
主要な設定項目
| 設定項目 | 説明 | 例 |
|---|---|---|
Host |
接続時に使うエイリアス名 | production |
HostName |
実際のホスト名またはIPアドレス | 203.0.113.10 |
User |
ログインするユーザー名 | deploy |
Port |
SSHポート番号(デフォルト22) | 2222 |
IdentityFile |
使用する秘密鍵のパス | ~/.ssh/id_ed25519_production |
IdentitiesOnly |
指定した鍵のみ使用する | yes |
ServerAliveInterval |
接続維持のための間隔(秒) | 60 |
ServerAliveCountMax |
応答がない場合の最大回数 | 3 |
ProxyJump |
踏み台サーバーを経由する | bastion |
共通設定(Host *)
Host * はすべてのホストに適用される共通設定です。個別のホスト設定が優先されます。
# 全ホスト共通の設定
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
IdentitiesOnly yes
IdentitiesOnly yes を設定しないと、ssh-agentに登録されたすべての鍵を順番に試行します。サーバーによっては認証試行回数の制限(MaxAuthTries)に引っかかり、接続が拒否されることがあります。
踏み台サーバー(ProxyJump)の設定
内部ネットワークのサーバーに踏み台を経由して接続する設定です。
# 踏み台サーバー
Host bastion
HostName 203.0.113.1
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519_bastion
# 内部サーバー(踏み台経由)
Host internal-web
HostName 10.0.1.10
User deploy
IdentityFile ~/.ssh/id_ed25519_internal
ProxyJump bastion
この設定で ssh internal-web と打つだけで、自動的に踏み台サーバーを経由して内部サーバーに接続されます。
STEP 6複数サーバー・複数鍵の管理
サーバーやサービスが増えてくると、鍵の管理が複雑になります。以下のベストプラクティスに従って整理しましょう。
鍵のファイル名を用途別にする
デフォルトの id_ed25519 のままだと、どの鍵がどのサーバー用かわからなくなります。用途がわかるファイル名をつけましょう。
~/.ssh/
├── config # SSH設定ファイル
├── authorized_keys # (サーバー側)許可された公開鍵
├── known_hosts # 接続済みホストの記録
├── id_ed25519_github # GitHub用 秘密鍵
├── id_ed25519_github.pub # GitHub用 公開鍵
├── id_ed25519_production # 本番サーバー用 秘密鍵
├── id_ed25519_production.pub # 本番サーバー用 公開鍵
├── id_ed25519_staging # ステージング用 秘密鍵
├── id_ed25519_staging.pub # ステージング用 公開鍵
├── id_ed25519_dev # 開発サーバー用 秘密鍵
└── id_ed25519_dev.pub # 開発サーバー用 公開鍵
サービスごとに鍵を分ける理由
| 管理方法 | メリット | デメリット |
|---|---|---|
| サービスごとに分ける(推奨) | 1つの鍵が漏洩しても被害が限定される | 管理する鍵の数が増える |
| 全サービスで1つの鍵を共有 | 管理がシンプル | 1つ漏洩すると全サーバーが危険 |
鍵の棚卸し(定期的な確認)
定期的に以下を確認しましょう。
# 鍵ファイルの一覧とパーミッションを確認
ls -la ~/.ssh/
# 各公開鍵のフィンガープリントを確認
for key in ~/.ssh/*.pub; do
echo "=== $key ==="
ssh-keygen -lf "$key"
done
不要な鍵の削除
使わなくなったサーバーの鍵は速やかに削除しましょう。
# ssh-agentから削除
ssh-add -d ~/.ssh/id_ed25519_old_server
# ファイルを削除
rm ~/.ssh/id_ed25519_old_server
rm ~/.ssh/id_ed25519_old_server.pub
# サーバー側のauthorized_keysからも削除
# サーバーにログインして該当行を削除する
GitHubアカウントごとに鍵を分ける
個人用と仕事用など、複数のGitHubアカウントを使い分ける場合の設定例です。
# 個人用GitHub
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_personal
# 仕事用GitHub
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_work
# 個人用アカウントでクローン
git clone git@github-personal:username/repo.git
# 仕事用アカウントでクローン
git clone git@github-work:company/repo.git
SSH鍵管理チェックリスト
SSH鍵の管理状態を定期的に確認しましょう。