Technology

gitリポジトリにSSH接続するための設定(Linux・WSL対応)

GitHubGitLabといったリモートリポジトリへのアクセス方法として、HTTPSとSSHの2つの方式が広く使われています。HTTPSは手軽に始められる反面、操作のたびに認証情報を求められることがあり、長期的な運用では煩わしさを感じる場面も少なくありません。一方、SSHを用いた接続は、初期設定こそ必要なものの、一度準備を済ませてしまえばパスワードレスで安全にやり取りができるようになります。

本記事では、LinuxおよびWSL(Windows Subsystem for Linux)の環境を想定し、Gitリポジトリに対してSSHで接続するための設定手順を解説します。鍵の作成から各種サービスへの登録、接続確認、そしてWSL特有のGit設定までを通して取り扱います。

目次

Gitのインストール

ディストリビューションのターミナルを開き、Gitをインストールします。UbuntuやDebianの場合は、次のように実行します。

sudo apt update
sudo apt install git

ユーザー情報の設定

接続できることを確認したら、コミットの作者として記録される名前とメールアドレスを設定します。

git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"

SSHの仕組みについて

SSH(Secure Shell)は、ネットワーク越しに別のコンピュータと安全に通信するためのプロトコルです。最大の特徴は、通信内容が暗号化される点にあります。これにより、たとえ第三者が通信経路上でパケットを傍受したとしても、その中身を解読することはできません。

通信を始める前には、相手が本当に正しい接続先なのかを確認する「認証」のステップが入ります。SSHではこの認証に公開鍵(Public Key)と秘密鍵(Private Key)という2つの鍵を組み合わせて使用します。両者は対になっており、一方で暗号化したデータはもう一方でしか復号できないという性質を持ちます。

鍵の種類説明
公開鍵(Public Key)相手に渡しても問題ない鍵。GitHubやGitLabなどのサービス側に登録してく。データを暗号化する役割を持つ。
秘密鍵(Private Key)自分の手元で厳重に保管する鍵。絶対に他人に渡してはいけない。公開鍵で暗号化されたデータを解読する鍵で、所有者だけが持ちます。

認証が完了するとセッションが確立され、以降はやり取りされるすべてのデータが暗号化された状態で送受信されます。

公開鍵と秘密鍵の作成

鍵ペアの生成には ssh-keygen コマンドを使用します。ターミナルを開き、以下のように実行します。

ssh-keygen -t ed25519 -C "e-mail@example.com"

各オプションの意味は次の通りです。

オプション説明
-t暗号アルゴリズムを指定するオプション。現在は ED25519 が推奨されています。短い鍵長で高い安全性が得られ、生成や認証の処理も高速です。古い環境などED25519に対応していない場合は、-t rsa -b 4096 のようにRSAを指定する方法もありますが非推奨です。
-C鍵に付与するコメントです。後から鍵を見分けやすくするため、GitHubやGitLabで使用しているメールアドレスを指定するのが一般的です。

コマンドを実行すると、保存先のパスとパスフレーズの入力を求められます。

Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

最初に保存先の確認があります。基本的にデフォルトのままで問題ありませんが、鍵の名前をデフォルト(id_ed25519)から変えたい場合は、鍵の名前を含めた絶対パスを入力します。デフォルトのままでよい場合はそのままEnterを押します。

次にパスフレーズの入力を求められます。パスフレーズは秘密鍵そのものに対するパスワードとして機能し、設定しておくと万一秘密鍵が漏れた場合の保険になります。入力を省略してEnterすることもできます。この場合はパスフレーズは設定されませんが、セキュリティ上のリスクから設定することをおすすめします。パスフレーズを設定すると、秘密鍵を使うときにその都度パスフレーズの入力が求められます。

完了すると、デフォルトの場合には~/.ssh/ 配下に秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)の2ファイルが生成されます。秘密鍵は厳重に管理して絶対に他人に渡してはいけません。

参考:新しいSSHキーを生成してssh-agentに追加する

鍵を配置して管理者権限を変更する

鍵は ホームディレクトリ直下の ~/.ssh に配置するのが慣例です。SSHは鍵ファイルの権限が緩すぎる場合に読み込みを拒否するため、適切なパーミッションを設定しておく必要があります。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

id_ed25519の部分は秘密鍵の名前で適宜変更してください。それぞれの権限は以下の通り。

対象数字権限
~/.ssh ディレクトリ700本人のみ読み書き実行可能
秘密鍵600本人のみ読み書き可能
公開鍵644本人が読み書き、他者は読み取りのみ

この設定を怠ると、接続時に Permissions are too open といったエラーが出て認証が通らなくなることがあります。

SSH configファイルの設定

~/.ssh/config ファイルを用意しておくと、接続先ごとの設定をまとめて管理でき、ssh コマンドや git コマンドの呼び出しが大幅に簡潔になります。

Host ホスト名のエイリアス
    HostName       ホスト名かIPアドレス
    User           ユーザー名
    Port           22
    IdentityFile   ~/.ssh/id_ed25519
    TCPKeepAlive   yes
    IdentitiesOnly yes

主な項目の意味は次の通りです。

エイリキーワードアス意味
Host接続時に使う短い別名(エイリアス)。例えば、Hostをgitlab、HostNameをexample.com、Userをmyuserとした場合、ssh gitabと打ち込むと、ssh myuser@example.comと同じ意味になります。このように、エイリアスを用いることで、Host以降に書かれた設定に基づき、SSH接続が行われます。秘密鍵のパスを設定している場合は、その秘密鍵が使用されます。
HostName実際の接続先(github.comgitlab.example.com など)です。ドメイン名やIPアドレスを指定します。実際にGitHubやGitLabをブラウザで開き、リポジトリのSSH接続のアドレスをコピーしてみれば、ドメイン名を確認できます。
Userリモート側のユーザー名。GitHubやGitLab宛ての場合は通常 git です。
Port接続ポート。SSHのデフォルトは 22 ですが、自前で立てたサーバーなどで別ポートを使う場合はその番号を指定します。
IdentityFile認証に使う秘密鍵のパスを指定します。
TCPKeepAlive通信断を防ぐためのキープアライブを有効化します。長時間接続がアイドル状態になると通信が切断されてしまいますが、この設定をyesにすると長時間操作がない場合でも接続が切断されにくくなります。
IdentitiesOnly指定した鍵だけを認証に使う設定で、複数鍵を扱う際の意図しないマッチングを防げます。デフォルトでは、SSHは利用可能なすべての鍵を試みますが、このオプションを設定することで、意図しない認証失敗が発生する可能性を回避できます。

このファイル自体も、念のため chmod 600 ~/.ssh/config で権限を絞っておくと安心です。githubの場合の例を示します。

Host deploy
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/github_ed25519
  TCPKeepAlive yes
  IdentitiesOnly yes

秘密鍵のパスを適宜お使いの環境に合わせて変更してください。

GitHubやGitLabへの公開鍵の登録

生成した公開鍵を、リモートリポジトリ側のサービスに登録します。まず、公開鍵の中身を表示してコピーします。

cat ~/.ssh/id_ed25519.pub

表示された内容(ssh-ed25519 AAAA... で始まる文字列)をそのままコピーし、各サービスの設定画面に貼り付けます。

GitLabとGitHubのそれぞれについて鍵登録のための設定方法を示します。

GitHubの場合

  • Settings > SSH and GPG keys > New SSH key
    • Title:この公開鍵の内容が分かる名前をつけます。
    • Key typeAuthentication Key(認証鍵)とSigning Key(著名鍵)のいずれかを用途に合わせて選択します。
    • Key : 公開鍵の内容(ssh-ed25519 AAAA...)をそのままコピー&ベーストします。
    • Add key ボタンを押します。
鍵の種類用途
Authentication Key(認証鍵)Git操作やSSH接続そのものに使用します。
Signing Key(署名鍵)コミットやタグに署名を付与するために使用します。

認証鍵はGit操作やSSH接続で使用し、著名鍵はコミットやタグの著名で使用されます。

GitLabの場合

  • Settings > SSH Keys
    • Key: 公開鍵の内容(ssh-ed25519 AAAA...)をそのままコピー&ベーストします。
    • Title:この公開鍵の内容が分かる名前をつけます。
    • Expiration date:有効期限を設定します。
    • Add key ボタンを押します。

通常のpushやpullを行うだけであれば認証鍵を登録すれば十分ですが、コミットの真正性を保証したい場合には署名鍵もあわせて登録しておくとよいでしょう。

SSH接続のテスト

公開鍵の登録が完了したら、実際に接続できるかを確認します。GitHubの場合は次のコマンドを実行します。

ssh -T -i ~/.ssh/id_ed25519 git@github.com

GitLabの場合は以下のようになります。gitlab.example.com の部分は、実際に利用するGitLabインスタンスのホスト名(ブラウザでアクセスする際のアドレス)に置き換えてください。

ssh -T -i ~/.ssh/id_ed25519 git@gitlab.example.com

-i オプションは認証に使う秘密鍵のパスを指定するためのものです。明示的に指定しておくと「どの鍵で接続を試みているか」がはっきりするため、特に初回確認時や複数鍵を使い分ける環境では指定をおすすめします。特に秘密鍵のパスと名前がデフォルトではない場合は指定する必要があります。ただし、~/.ssh/configIdentityFile を設定済みであれば省略しても構いません。

例えば、上記に示した~/.ssh/configのサンプルを使用した場合に、GitHubのテストを実施する場合は以下の方法でも接続できます。

ssh -T deploy

接続がうまくいった場合には、以下のようなメッセージが表示されます。

(GitHubの場合)
Hi ****! You've successfully authenticated, but GitHub does not provide shell access.
(GitLabの場合)
Welcome to GitLab, @username!

初回接続時には、相手ホストの公開鍵を ~/.ssh/known_hosts に登録してよいか確認されますので、yes を入力して進めます。問題がある場合には、sshverboseモードで実行することでトラブルシューティングを行うことができます。

ssh -Tvvv -i ~/.ssh/id_ed25519 git@github.com

鍵の読み込み状況や認証の試行手順が詳細に表示されるため、「鍵が読み込まれていない」「期待と異なる鍵で認証を試みている」といった問題に気付きやすくなります。

WSL環境でのGitセットアップ

ここからはWSLを使っている場合の追加設定について触れます。基本的な流れはLinuxと同じですが、Windows側と連携する部分にいくつかコツがあります。

Git Credential Managerの利用

HTTPS接続を併用する場合などは、Windows側にインストールした Git for Windows に含まれる Git Credential Manager をWSLからも利用するように設定すると、認証情報の管理が一元化されて便利です。Git for Windowsの最新版は公式サイトからダウンロードできます。

インストールされているGitのバージョンに応じて、WSL上で以下のコマンドを実行します。

Git >= v2.39.0の場合:

git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe"

Git >= v2.36.1(v2.39.0未満)の場合:

git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"

Git < v2.36.1の場合:

git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager-core.exe"

これでWSL上のGitからもWindows側の資格情報マネージャーが利用され、認証情報をOSをまたいで使い回せるようになります。上記はバージョンにあわせてgit-credential-manager-core.exeの場所を適切に指定します。もし、うまくいかない場合はこの実行体を探して、パスを書き換えて対応します。

WSLについて、外部ネットワーク自体に接続できていない場合は、DNSの設定が正しく行われているかをご確認ください。

Gitコマンドのテスト

WSL上で次のように git clone できることを確認してみます。例えば、GitHubの場合には次のような形になります。

git clone git@github.com:ユーザー名/リポジトリ名.git

このアドレスの部分(git@github.com:ユーザー名/リポジトリ名.git)はGitHubとGitLabで異なりますが、どちらもリポジトリからコピーします。

秘密鍵のパスや名前を変えている場合には、秘密鍵を指定する必要があります。

方法1:.ssh/configを用いる

.ssh/configの設定を使う方法です。サンプルの設定ファイルを使った場合には以下のようになります。

git clone deploy:ユーザー名/リポジトリ名.git

deploy.ssh/configで定義したHost名です。

方法2:GIT_SSH_COMMAND 環境変数を使う

特定のコマンドだけ別の鍵で実行したい場合は、GIT_SSH_COMMAND を一時的に指定する方法が便利です。

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes" \
    git clone git@github.com:ユーザー名/リポジトリ名.git

このコマンドの実行時にのみ指定した鍵が使われるため、~/.ssh/config を書き換えずに済む点が利点です。

方法3:リポジトリ単位でcore.sshCommandを設定

特定のリポジトリに対して常に同じ鍵を使いたい場合は、そのリポジトリ内で次のように設定しておくと、以降の git コマンドが自動的にその鍵を利用します。

git config core.sshCommand "ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes"

まとめ

SSH接続を使えるようにしておくと、Gitの操作は快適かつ安全になります。公開鍵と秘密鍵を組み合わせた認証方式によって、毎回パスワードを入力する手間が省けるだけでなく、通信の暗号化によって安全性も担保されます。

最初の設定は少し面倒に感じられますが、いったん整えてしまえば日々のpushやpullがスムーズに進みます。Linux環境はもちろん、WSLを使った開発でも同じ仕組みでリモートリポジトリへアクセスできるので、ぜひ環境構築の一環として取り入れてみてください。

-Technology
-