SSH

SSH鍵管理ガイド|安全な鍵の生成・管理・運用

SSH セキュリティ 鍵管理

SSH鍵管理ガイド
安全な鍵の生成・管理・運用

SSH鍵認証の仕組みから、鍵の生成、ssh-agentの活用、~/.ssh/configの設定まで、安全で効率的なSSH鍵の管理方法を解説します。

こんな人向けの記事です

  • SSH鍵認証の仕組みを理解したい
  • 鍵の種類(RSA, Ed25519)の選び方を知りたい
  • 複数サーバーのSSH鍵を効率的に管理したい

STEP 1SSH鍵認証の仕組み(公開鍵暗号)

SSH鍵認証は、公開鍵暗号という仕組みを使ってサーバーにログインする方式です。パスワード認証と違い、鍵ファイルを持っているPCからしか接続できないため、安全性が格段に向上します。

公開鍵と秘密鍵のペア

SSH鍵認証では、公開鍵秘密鍵の2つのファイルがペアになっています。

鍵の種類 保管場所 役割 公開してよいか
公開鍵(.pub) 接続先のサーバー 暗号化・署名検証に使用 はい(誰に見せてもOK)
秘密鍵 自分のPC 復号・署名に使用 いいえ(絶対に漏らさない)

認証の流れ

SSH鍵認証は、以下のステップで行われます。

  1. クライアント(自分のPC)がサーバーに接続を要求する
  2. サーバーがランダムなデータ(チャレンジ)を生成し、クライアントに送る
  3. クライアントは秘密鍵でチャレンジに署名して返す
  4. サーバーは登録済みの公開鍵で署名を検証する
  5. 検証が成功すればログインが許可される
なぜ安全なのか
秘密鍵はネットワーク上を一切流れません。サーバーに送るのは署名データだけです。たとえ通信を傍受されても、秘密鍵を復元することは数学的に不可能です。
秘密鍵の取り扱い
秘密鍵は絶対に他人に渡したり、メールやチャットで送信してはいけません。秘密鍵が漏洩した場合は、直ちに新しい鍵ペアを生成し、全サーバーの公開鍵を入れ替えてください。

STEP 2鍵の種類と選び方(RSA, Ed25519)

SSH鍵にはいくつかの暗号アルゴリズムがあります。現在主に使われているのは RSAEd25519 の2つです。

アルゴリズム 鍵の長さ 安全性 速度 互換性 推奨度
Ed25519 256ビット固定 非常に高い 非常に速い OpenSSH 6.5以降 最もおすすめ
RSA 2048〜4096ビット 高い(4096ビット推奨) やや遅い ほぼすべての環境 互換性重視なら
ECDSA 256/384/521ビット 高い 速い OpenSSH 5.7以降 あまり推奨しない
DSA 1024ビット固定 低い 速い 古い環境のみ 使用禁止
結論:Ed25519を選ぶ
特別な理由がない限り、Ed25519 を選んでください。鍵が短く、生成・認証が高速で、セキュリティも高いです。古いサーバー(OpenSSH 6.5未満)に接続する必要がある場合のみ、RSA 4096ビットを使いましょう。

Ed25519の特徴

  • 楕円曲線暗号の一種で、Curve25519という曲線を使用
  • 鍵の長さが256ビット固定なので、公開鍵のファイルサイズが非常に小さい
  • タイミング攻撃(処理時間の差から鍵を推測する攻撃)に耐性がある
  • RSA 3072ビットと同等以上の安全性を、はるかに短い鍵で実現

RSAを選ぶケース

  • 古いサーバーやネットワーク機器に接続する必要がある
  • 組織のセキュリティポリシーでRSAが指定されている
  • GitHubやGitLabなど、一部のサービスでEd25519がサポートされていない場合(現在はほぼサポート済み)

STEP 3鍵ペアの生成(ssh-keygen)

ssh-keygen コマンドで鍵ペアを生成します。ここでは推奨の Ed25519 と、互換性用の RSA の両方の手順を解説します。

Ed25519鍵の生成(推奨)

ローカル(自分のPC)
ssh-keygen -t ed25519 -C "your_email@example.com"

RSA鍵の生成(互換性が必要な場合)

ローカル(自分のPC)
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):

パスフレーズは必ず設定してください。秘密鍵が漏洩した場合でも、パスフレーズが設定されていればすぐには悪用できません。

パスフレーズなしは危険
パスフレーズを空にすると、秘密鍵ファイルを入手した人が即座にサーバーにログインできてしまいます。利便性のためにパスフレーズを省略したい場合は、次のSTEPで紹介する ssh-agent を使いましょう。

生成されるファイル

ファイル 内容 パーミッション
~/.ssh/id_ed25519 秘密鍵 600(所有者のみ読み書き可能)
~/.ssh/id_ed25519.pub 公開鍵 644(誰でも読み取り可能)

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

ssh-copy-id コマンドを使うと、公開鍵をサーバーの ~/.ssh/authorized_keys に自動で追加できます。

ローカル(自分のPC)
ssh-copy-id -i ~/.ssh/id_ed25519.pub ユーザー名@サーバーのIPアドレス

ssh-copy-id が使えない環境では、手動で登録します。

ローカル(自分のPC)
# 公開鍵の内容を表示してコピー
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の起動と鍵の登録

ローカル(自分のPC)
# ssh-agentを起動
eval "$(ssh-agent -s)"

# 秘密鍵を登録(パスフレーズを聞かれる)
ssh-add ~/.ssh/id_ed25519
Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com)

macOSの場合

macOSでは、キーチェーンと連携してパスフレーズを保存できます。

macOS
# キーチェーンにパスフレーズを保存
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

~/.ssh/config に以下を追加すると、macOS起動時に自動でキーチェーンから鍵を読み込みます。

~/.ssh/config
Host *
    AddKeysToAgent yes
    UseKeychain yes

登録済みの鍵を確認する

ローカル(自分のPC)
# 登録済みの鍵の一覧を表示
ssh-add -l

# 登録済みの公開鍵を表示
ssh-add -L

鍵の削除

ローカル(自分のPC)
# 特定の鍵を削除
ssh-add -d ~/.ssh/id_ed25519

# 全ての鍵を削除
ssh-add -D
Agent Forwardingの注意点
ssh -A でAgent Forwardingを使うと、踏み台サーバーから別サーバーへの接続が便利になります。しかし、踏み台サーバーの管理者があなたの鍵を悪用できるリスクがあります。信頼できるサーバーでのみ使用してください。

STEP 5~/.ssh/config の設定

~/.ssh/config は、SSH接続の設定をホストごとに定義できるファイルです。長いコマンドを毎回打つ代わりに、短いエイリアスで接続できるようになります。

基本的な書き方

~/.ssh/config
# 本番サーバー
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

設定後は、以下のように短いコマンドで接続できます。

ローカル(自分のPC)
# 以前: 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 * はすべてのホストに適用される共通設定です。個別のホスト設定が優先されます。

~/.ssh/config
# 全ホスト共通の設定
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes
    IdentitiesOnly yes
IdentitiesOnlyを設定する理由
IdentitiesOnly yes を設定しないと、ssh-agentに登録されたすべての鍵を順番に試行します。サーバーによっては認証試行回数の制限(MaxAuthTries)に引っかかり、接続が拒否されることがあります。

踏み台サーバー(ProxyJump)の設定

内部ネットワークのサーバーに踏み台を経由して接続する設定です。

~/.ssh/config
# 踏み台サーバー
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/ のディレクトリ構造
~/.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つ漏洩すると全サーバーが危険

鍵の棚卸し(定期的な確認)

定期的に以下を確認しましょう。

ローカル(自分のPC)
# 鍵ファイルの一覧とパーミッションを確認
ls -la ~/.ssh/

# 各公開鍵のフィンガープリントを確認
for key in ~/.ssh/*.pub; do
    echo "=== $key ==="
    ssh-keygen -lf "$key"
done

不要な鍵の削除

使わなくなったサーバーの鍵は速やかに削除しましょう。

ローカル(自分のPC)
# 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アカウントを使い分ける場合の設定例です。

~/.ssh/config
# 個人用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鍵の管理状態を定期的に確認しましょう。