GitHub - SSHの設定
概要
SSH (Secure Shell) は、暗号化された通信を用いてリモートサーバーに安全に接続するためのプロトコルである。
GitHubとの通信方法にはHTTPSとSSHの2種類があり、HTTPSではリポジトリへのプッシュ / プルのたびにユーザ名とPersonal Access Tokenの入力が必要となる。
一方、SSHでは公開鍵認証方式を使用するため、一度鍵を設定すれば以降の認証は自動的に行われる。
Claude CodeやOpenCode等のAIコーディングツールからGitHubリポジトリを操作する場合にも、SSH接続の設定が必要となる。
SSHを使用する主なメリットは以下の通りである。
- パスワードやトークンの入力が不要
- 毎回の認証操作が省略されるため、作業効率が向上する。
- 高い安全性
- 公開鍵認証方式はパスワード認証よりも安全であり、通信内容も暗号化される。
- 利便性
- 一度設定すれば、以降のgit push / pull / clone等の操作で追加の認証入力は不要である。
- AIコーディングツールとの親和性
- Claude CodeやOpenCode等のターミナルベースのAIツールは対話的なパスワード入力に対応していない場合があるため、SSH接続が事実上必須となる。
SSH接続の仕組みは以下の通りである。
- ローカルコンピュータでSSH鍵ペア (秘密鍵と公開鍵) を生成する。
- 公開鍵をGitHubアカウントに登録する。
- ローカルからGitHubに接続する際、秘密鍵で署名を生成してGitHubが公開鍵で検証する。
- 検証に成功すると認証が完了して、リポジトリへのアクセスが許可される。
SSHの設定
SSH鍵の種類
SSH鍵にはいくつかの暗号アルゴリズムが存在する。
下表に、主なSSH鍵の種類と特徴を示す。
| アルゴリズム | 鍵長 | 特徴 |
|---|---|---|
| Ed25519 | 256ビット固定 | 現在最も推奨されるアルゴリズム。 高速かつ安全性が高い。GitHubも推奨している。 |
| RSA | 2048 / 4096ビット | 広く普及しており互換性が高い。 4096ビット以上の使用を推奨する。 |
| ECDSA | 256 / 384 / 521ビット | 楕円曲線暗号を使用する。 Ed25519が利用できない環境での代替として使用される。 |
| DSA | 1024ビット | 非推奨。OpenSSH 7.0以降ではデフォルトで無効化されている。 |
特別な理由がない限り、Ed25519の使用を推奨する。
SSH鍵の生成
以下のコマンドを実行して、Ed25519アルゴリズムのSSH鍵ペア (秘密鍵と公開鍵) を生成する。
# Ed25519鍵を生成する (推奨) ssh-keygen -t ed25519 -C "GitHubに登録しているメールアドレス" -f ~/.ssh/id_ed25519_github # Ed25519が使用できない環境の場合はRSA 4096ビットを使用する ssh-keygen -t rsa -b 4096 -C "GitHubに登録しているメールアドレス" -f ~/.ssh/id_rsa_github
コマンド実行時のオプションの詳細は以下の通りである。
-t ed25519- 鍵の種類を指定する。
-C "メールアドレス"- コメントを設定する。一般的にメールアドレスを指定する。
-f ~/.ssh/id_ed25519_github- 鍵ファイルの保存先とファイル名を指定する。
コマンド実行後にパスフレーズの入力を求められる。
Enter passphrase (empty for no passphrase): Enter same passphrase again:
パスフレーズを設定すると、鍵の使用時にパスフレーズの入力が必要になる。
セキュリティの観点からパスフレーズの設定を推奨するが、空欄のまま[Enter]キーを押下して省略することも可能である。
鍵の生成が完了すると、以下に示す2つのファイルが作成される。
- ~/.ssh/id_ed25519_github
- 秘密鍵。絶対に他者と共有してはならない。
- ~/.ssh/id_ed25519_github.pub
- 公開鍵。GitHubに登録するファイル。
SSH Agentの設定
SSH Agentは秘密鍵をメモリ上に保持して、SSH接続時に自動的に鍵を提供するデーモンである。
パスフレーズを設定した場合、SSH Agentを使用することで毎回のパスフレーズ入力を省略できる。
# SSH Agentをバックグラウンドで起動する eval "$(ssh-agent -s)" # 秘密鍵をSSH Agentに追加する ssh-add ~/.ssh/id_ed25519_github
パスフレーズを設定している場合は、ssh-addコマンドの実行時に1度だけパスフレーズの入力を求められる。
SSH Agentの起動をシェルのログイン時に自動化する場合は、シェルの設定ファイルに以下を追記する。
# Bashの場合
# SSH Agent
if [ -z "$SSH_AUTH_SOCK" ]
then
eval "$(ssh-agent -s)" > /dev/null 2>&1
ssh-add ~/.ssh/id_ed25519_github > /dev/null 2>&1
fi
# Fishの場合
# SSH Agent
if not set -q SSH_AUTH_SOCK
eval (ssh-agent -c) > /dev/null 2>&1
ssh-add ~/.ssh/id_ed25519_github > /dev/null 2>&1
end
SSH configの設定
~/.ssh/config ファイルにGitHub用の設定を追記する。
この設定により、GitHub接続時に使用する鍵ファイルが自動的に選択される。
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
AddKeysToAgent yes
各設定項目の詳細は以下の通りである。
| 項目 | 説明 |
|---|---|
| Host | 接続先のエイリアス名 github.com を指定する。 |
| HostName | 実際の接続先ホスト名 github.com を指定する。 |
| User | 接続ユーザ名 GitHubでは常に git を指定する。 |
| IdentityFile | 使用する秘密鍵のパス |
| AddKeysToAgent | yes を指定すると、初回接続時に自動的にSSH Agentに鍵が追加される。
|
複数のGitHubアカウントを使い分ける場合は、以下に示すようにHostを別名にして設定する。
# メインアカウント
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_main
# サブアカウント
Host github-sub
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_sub
サブアカウントのリポジトリをクローンする場合は、以下に示すように指定する。
git clone git@github-sub:<ユーザ名>/<リポジトリ名>.git
公開鍵のGitHubへの登録
生成した公開鍵をGitHubアカウントに登録する。
まず、公開鍵の内容をクリップボードにコピーする。
# 公開鍵の内容を表示する cat ~/.ssh/id_ed25519_github.pub
# 表示例 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... user@example.com
表示された文字列を全てコピーして、以下の手順でGitHubに登録する。
- GitHubにログインする。
- 右上のプロフィールアイコンを選択して、[Settings]を選択する。
- 左メニューの[Access]セクションにある[SSH and GPG keys]を選択する。
- [New SSH key]ボタンを押下する。
- 以下の項目を入力する。
- Title
- 鍵の識別名を入力する。
- 例: SUSE-PC
- Key type
- Authentication Key を選択する。(デフォルト)
- Key
- コピーした公開鍵を貼り付ける。
- Title
- [Add SSH key]ボタンを押下する。
- GitHubのパスワード入力を求められた場合は、入力して認証する。
GitHub CLIを使用して登録する場合は、以下に示すコマンドを実行する。
gh ssh-key add ~/.ssh/id_ed25519_github.pub --title "SUSE-PC"
接続テスト
SSH鍵の登録が完了した後、GitHubとのSSH接続が正常に動作するかテストする。
ssh -T git@github.com
初回接続時は、以下のようにホスト鍵の確認を求められるためyesと入力する。
The authenticity of host 'github.com (20.27.177.113)' can't be established. ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
接続に成功すると、以下のメッセージが表示される。
Hi <ユーザ名>! You've successfully authenticated, but GitHub does not provide shell access.
上記のメッセージが表示されれば、SSHの設定は完了である。
接続に失敗した場合は、以下のコマンドを実行して詳細なデバッグ情報を確認する。
ssh -vT git@github.com
既存リポジトリのリモートURLをSSHに変更
既にHTTPSでクローンしたリポジトリをSSH接続に切り替える場合は、リモートURLを変更する。
# 現在のリモートURLを確認する git remote -v # リモートURLをSSHに変更する git remote set-url origin git@github.com:<ユーザ名>/<リポジトリ名>.git # 変更後のリモートURLを確認する git remote -v
SSH鍵のセキュリティに関する注意事項
SSH鍵を安全に運用するために、以下に示す事柄に留意する必要がある。
| 項目 | 説明 |
|---|---|
| 秘密鍵の権限設定 | 秘密鍵ファイルのパーミッションは600 (所有者のみ読み書き可) に設定する。chmod 600 ~/.ssh/id_ed25519_github
|
| 秘密鍵の共有禁止 | 秘密鍵は絶対に他者と共有してはならない。共有するのは公開鍵 (.pub) のみである。
|
| パスフレーズの設定 | 秘密鍵にはパスフレーズを設定することを推奨する。 万が一秘密鍵ファイルが漏洩した場合のリスクを軽減する。 |
| 鍵のローテーション | 定期的に新しい鍵ペアを生成して、古い鍵をGitHubから削除することを推奨する。 |
| 不要な鍵の削除 | 使用しなくなったデバイスの鍵は、GitHubの[SSH and GPG keys]設定ページから速やかに削除する。 |
トラブルシューティング
下表に、SSH接続に関する一般的な問題と対処法を示す。
| 症状 | 原因 | 対処法 |
|---|---|---|
| Permission denied (publickey) | 公開鍵がGitHubに登録されていない、 または秘密鍵のパスが正しくない |
ssh-add -lで登録済みの鍵を確認する。SSH configのIdentityFileパスを確認する。 GitHubに公開鍵が正しく登録されているか確認する。 |
| Could not open a connection to your authentication agent | SSH Agentが起動していない | eval "$(ssh-agent -s)"を実行してSSH Agentを起動する。
|
| WARNING: UNPROTECTED PRIVATE KEY FILE! | 秘密鍵ファイルのパーミッションが緩すぎる | chmod 600 ~/.ssh/id_ed25519_githubを実行する。
|
| Connection timed out | ファイアウォール等でSSHポート (22) がブロックされている | HTTPS経由のSSH接続 (ポート443) を試行する。 SSH configに以下を設定する。 Host github.com HostName ssh.github.com Port 443
|