SSH鍵とは?

SSH鍵は、SSH(Secure Shell)接続で使われる認証方式です。パスワードの代わりに「秘密鍵」と「公開鍵」のペアを使います。

仕組み

あなたのPC                    サーバー/GitHub
┌──────────┐                 ┌──────────┐
│ 秘密鍵    │ ← 絶対に外に出さない    │ 公開鍵    │
│ (id_ed25519) │              │ (authorized_keys) │
└──────────┘                 └──────────┘
      │                            │
      └── 署名を送る ─────────────→ 検証 → OK!
  • 公開鍵: サーバーやGitHubに登録する。誰に見られても問題ない
  • 秘密鍵: 自分のPCに保管する。絶対に他人に渡さない

鍵のアルゴリズム

アルゴリズム推奨度説明
Ed25519◎ 最推奨高速・安全・鍵が短い
ECDSAEd25519と同程度のセキュリティ
RSA (4096bit)互換性は高いが鍵が長い
DSA×非推奨(廃止済み)

SSH鍵の生成

Ed25519鍵を生成する(推奨)

ssh-keygen -t ed25519 -C "[email protected]"

対話形式で質問されます:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
# → Enterでデフォルトのまま

Enter passphrase (empty for no passphrase):
# → パスフレーズを入力(推奨)

Enter same passphrase again:
# → 同じパスフレーズを再入力

生成されるファイル

~/.ssh/
├── id_ed25519       ← 秘密鍵(絶対に外に出さない)
└── id_ed25519.pub   ← 公開鍵(サーバーやGitHubに登録する)

複数の鍵を使い分ける

# 仕事用
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_work

# 個人用
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_personal

パスフレーズとssh-agent

パスフレーズを設定すべき理由

秘密鍵にパスフレーズを設定すると、仮にファイルが流出しても鍵を使えません。

ssh-agentで毎回の入力を省く

# ssh-agent を起動
eval "$(ssh-agent -s)"

# 鍵を登録(パスフレーズを1回だけ入力)
ssh-add ~/.ssh/id_ed25519

# macOS: Keychainに保存
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

macOS の Keychain 連携

# ~/.ssh/config
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

GitHub にSSH鍵を登録する

1. 公開鍵をコピー

# macOS
pbcopy < ~/.ssh/id_ed25519.pub

# Linux
cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard

# Windows (Git Bash)
clip < ~/.ssh/id_ed25519.pub

# どのOSでも
cat ~/.ssh/id_ed25519.pub
# → 表示されたテキストを手動でコピー

2. GitHubに登録

  1. GitHub → Settings → SSH and GPG keys → New SSH key
  2. Title: わかりやすい名前(例: “MacBook Pro 2026”)
  3. Key type: Authentication Key
  4. Key: コピーした公開鍵を貼り付け
  5. Add SSH key をクリック

3. 接続テスト

ssh -T [email protected]
# Hi username! You've successfully authenticated, but GitHub does not provide shell access.

4. リポジトリのURLをSSHに変更

# 現在のリモートURLを確認
git remote -v
# origin  https://github.com/user/repo.git (fetch)

# SSHに変更
git remote set-url origin [email protected]:user/repo.git

# 確認
git remote -v
# origin  [email protected]:user/repo.git (fetch)

SSH Config の設定

~/.ssh/config の基本

# GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  AddKeysToAgent yes

# 仕事用GitHub(別アカウント)
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work

# 開発サーバー
Host dev-server
  HostName 192.168.1.100
  User deploy
  Port 22
  IdentityFile ~/.ssh/id_ed25519

# 本番サーバー(踏み台経由)
Host prod-server
  HostName 10.0.0.50
  User deploy
  ProxyJump bastion

Host bastion
  HostName bastion.example.com
  User admin
  IdentityFile ~/.ssh/id_ed25519

便利な設定

Host *
  # 接続維持(60秒ごとにキープアライブ)
  ServerAliveInterval 60
  ServerAliveCountMax 3

  # 接続の多重化(2回目以降の接続が高速に)
  ControlMaster auto
  ControlPath ~/.ssh/sockets/%r@%h-%p
  ControlPersist 600

  # ssh-agent に鍵を自動追加
  AddKeysToAgent yes
# ソケットディレクトリを作成
mkdir -p ~/.ssh/sockets

複数のGitHubアカウントを使い分ける

# 個人用
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_personal

# 仕事用
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
# 個人用リポジトリ
git clone [email protected]:personal/repo.git

# 仕事用リポジトリ
git clone git@github-work:company/repo.git

サーバーへのSSH接続

公開鍵をサーバーに登録

# ssh-copy-id を使う(推奨)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

# 手動で登録する場合
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

パーミッションの確認

# サーバー上で実行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519       # 秘密鍵
chmod 644 ~/.ssh/id_ed25519.pub   # 公開鍵

パーミッションが正しくないとSSH接続が拒否されます。

パスワード認証を無効にする(セキュリティ強化)

サーバーの /etc/ssh/sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
# 設定を反映
sudo systemctl restart sshd

トラブルシューティング

接続できない場合のデバッグ

# 詳細なログを表示
ssh -vvv user@server

# よくある確認ポイント:
# 1. 鍵のパーミッション
# 2. 正しい鍵が使われているか
# 3. サーバーの authorized_keys の内容
# 4. ファイアウォールの設定

Permission denied (publickey)

# 1. 鍵が ssh-agent に登録されているか確認
ssh-add -l

# 2. 正しい鍵を指定して接続
ssh -i ~/.ssh/id_ed25519 user@server

# 3. パーミッションを確認
ls -la ~/.ssh/
# id_ed25519 は 600 であること

GitHub に接続できない

# テスト接続
ssh -T [email protected]

# 別のポートで試す(企業ファイアウォール対策)
ssh -T -p 443 [email protected]

443ポートで接続できる場合、~/.ssh/config に以下を追加:

Host github.com
  HostName ssh.github.com
  Port 443
  User git

鍵のパスフレーズを変更する

ssh-keygen -p -f ~/.ssh/id_ed25519

鍵のフィンガープリントを確認

ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 256 SHA256:XXXXXXXXXX [email protected] (ED25519)

セキュリティのベストプラクティス

対策説明
Ed25519を使うRSAより安全で高速
パスフレーズを設定鍵の流出時の保険
鍵を使い分けるサービスごとに別の鍵
定期的に更新古い鍵は無効にする
秘密鍵をバックアップしないクラウドストレージに置かない
パスワード認証を無効化サーバーは鍵認証のみにする

まとめ

SSH鍵の設定手順をまとめると:

  1. ssh-keygen -t ed25519 で鍵を生成
  2. パスフレーズを設定
  3. ssh-agentに登録
  4. 公開鍵をGitHub/サーバーに登録
  5. ~/.ssh/config で接続設定を管理
  6. パーミッションを正しく設定

一度設定してしまえば、安全かつ快適なSSH接続が実現できます。


SSH鍵のフィンガープリントなど、ハッシュ値の確認にはAssistyのハッシュ生成ツールが便利です。SHA-256等のハッシュをブラウザ上で計算できます。