Gitでプロジェクトを管理する上で、SSHの設定はもはや必須と言ってもかまいません。
HTTPのように毎回パスワードを入力する必要もなく、便利な上に安全性が確保された接続が実現できる為です。
本記事では、GitにSSH接続するための設定方法をまとめました。
目次
SSH接続の概要
SSH (Secure Shell) は、ネットワークを通じてリモートのコンピュータに安全に接続するためのプロトコル(通信規約)です。
特に、ログインやコマンドの送受信を暗号化することで、第三者に内容を盗み見られたり、データを改ざんされるリスクを防ぎます。
SSHでは、通信するデータが暗号化されます。これにより、通信経路上で第三者がデータを傍受しても内容を解読できません。暗号化には公開鍵(Public Key)と秘密鍵(Private Key)の2つの鍵が関与します。
公開鍵(Public Key) | みんなに公開できる鍵で、データを暗号化する役割を持ちます。 |
秘密鍵(Private Key) | 公開鍵で暗号化されたデータを解読する鍵で、所有者だけが持ちます。 この鍵は厳重に管理して、他の人に見せたり、渡してはいけません。 |
通信の相手が本物であることを確認するために、公開鍵と秘密鍵を使用して認証が行われます。認証が完了すると通信セッションが確立され、以降のデータ通信はすべて暗号化されます。
公開鍵と秘密鍵を作成する
まず、秘密鍵と公開鍵を作成します。
ssh-keygen -t ed25519 -C "e-mail@example.com"
-t
はオプションでは暗号アルゴリズムを指定します。ED25519が推奨です。ED25519に対応していない場合には、RSAも使用できます。
ssh-keygen -t rsa -b 4096 -C "e-mail@example.com"
-C
はコメントを記入するオプションで、gitlabやgithubで使用するメールアドレスを設定します。
コマンドを実行すると、指定したメールアドレスをラベルとするSSHキーが作成されます。
> Generating public/private ALGORITHM key pair.
そして、「鍵を保存する場所を入力してください」というメッセージが表示されます。保存場所や鍵の名前をデフォルトから変更する場合には、その場所や名前を指定します。デフォルトのままにする場合は何も入力せずにEnterします。
> Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):[Press enter]
次に、パスフレーズを設定するかどうかを訊かれます。パスフレーズを設定することで、鍵を所有していてもパスフレーズが分からなければアクセスできないようにすることができます。つまり、パスフレーズを設定することで、秘密鍵が盗まれた場合でも不正利用を防ぐことができます。パスフレーズを設定しない場合には空のままEnterします。
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
以上で、鍵が作成されます。.pub
という拡張子がある方が公開鍵です。秘密鍵は厳重に管理して人に渡してはいけません。
参考情報:新しい SSH キーを生成して ssh-agent に追加する(https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?platform=linux)
鍵を配置して管理者権限を変更する
鍵はホームディレクトリ下の~/.ssh
に配置します。~/.ssh
の管理者権限を以下に変更します。
chmod 700 ~/.ssh
また、秘密鍵の管理者権限も変更します。
chmod 600 ~/.ssh/id_ed25519
id_ed25519
の部分は秘密鍵の名前で適宜変更してください。
~/.ssh/configを作成する
~/.ssh/config
を作成します。
Host ホスト名のエイリアス
HostName ホスト名かIPアドレス
User ユーザー名
Port 22
IdentityFile ~/.ssh/id_ed25519 (秘密鍵のパス)
TCPKeepAlive yes
IdentitiesOnly yes
それぞれ次の意味があります。
キーワード | 意味 |
Host | エイリアス(別名)を設定します。SSH接続の際に、この名前を使って設定内容(HostName やUser など)を呼び出せます。例えば、Host gitlab の場合には、 ssh gitlab とすることで、 ssh myuser@example.com と同じ意味になります。このように、エイリアスを用いることで、HOST以降に書かれた設定に基づき、SSH接続が行われます。 |
HostName | 実際に接続するサーバーのドメイン名やIPアドレスを指定します。 (例えば、 guthub.com )この値はDNSで解決される実際のサーバーアドレスを意味します。 |
User | ユーザー名を指定します。(Gitで使用するアカウント名やメールアドレスになります) |
Port | SSH接続用のポート番号で、通常は22を使用します。 |
IdentityFile | 接続時に使用する秘密鍵のパスを指定します。ここで指定された秘密鍵を使って公開鍵認証が行われます。 |
TCPKeepAlive | 長時間接続がアイドル状態になると切断されるのを防ぐための設定です。サーバーと接続を維持するために定期的に信号を送るかどうかを指定します。yes にすると、長時間操作がない場合でも接続が切れにくくなります。ただし、サーバー側で許可されている場合のみ有効になります。 |
IdentitiesOnly | 指定された秘密鍵ファイル(IdentifyFile )だけを使用するように設定します。デフォルトでは、SSHは利用可能なすべての鍵を試みるため、特定の鍵だけを使用したい場合に有効です。特に複数の鍵を管理している場合、このオプションが役立ちます。この設定がない場合、他の鍵も試みるため、意図しない認証失敗が発生する可能性があります。 |
公開鍵を登録する
gitlabやgithubをブラウザで開きます。
gitlabの場合
Settings
>SSH Keys
Key
: 公開鍵の内容をそのままコピー&ベーストします。Title
:この公開鍵の内容が分かる名前をつけます。Expiration date
:有効期限を設定します。Add key
ボタンを押します。
githubの場合
Settings
>SSH and GPG keys
>New SSH key
Title
:この公開鍵の内容が分かる名前をつけます。Key type
:"Authentication Key
"(認証鍵)と"Signing Key
"(著名鍵)のいずれかを用途に合わせて選択します。Key
: 公開鍵の内容をそのままコピー&ベーストします。Add key
ボタンを押します。
認証鍵はGit操作やSSH接続で使用し、著名鍵はコミットやタグの著名で使用されます。
接続テストを行う
Gitlabの場合
以下のコマンドで確認します。
ssh -T git@gitlab.example.com
gitlab.example.com
の部分は、あなたが使用するGitlabインスタンスのホスト名に置き換えます(Gitlabをブラウザで開いたときに表示されるアドレス)。
接続がうまくいった場合には、以下が表示されます。
Welcome to GitLab,@username!
問題がある場合には、ssh
をverbose
モードで実行することでトラブルシューティングを行うことができます。
ssh -Tvvv git@gitlab.example.com
githubの場合
以下のコマンドで確認します。
ssh -T git@github.com
接続がうまくいった場合には、以下が表示されます。
Hi <GitHubユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.
メッセージの意味は以下になります。
"You've successfully authenticated" | 接続設定が正しく行われていることを意味しています。 |
"GitHub does not provide shell access" | GitHubはSSH接続を介したシェル操作は提供していないため、警告メッセージとして表示しています。 |
WSLから接続するための設定
まず、WSLにgitをインストールします。ここではUbuntu
とDebian
を例に示します。
WSL上の使用しているディストリビューションでコマンドラインを開き、以下を実行します。
sudo apt-get install git
次に、ユーザー名とメールアドレスを設定します。
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
次に、git for Windows
をインストールして、このgit for Windows
に含まれる Git Credential Manager
を使用します。最新版はここからインストールできます。
そして、WSL上で次のコマンドを実行します。インストールされているGITが >= v2.39.0
の場合
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe"
インストールされているGITが >= 2.36.1の場合
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"
また、 < v2.36.1の場合
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager-core.exe"
を実行します。以上で設定は完了です(つまり、バージョンにあわせてgit-credential-manager-core.exe
の場所を適切に指定します)。
参考情報:Linux 用 Windows サブシステムで Git の使用を開始する(https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-git#git-credential-manager-setup)
git for Windowsを使用しない方法についても上の参考情報に記述されています。
外部ネットワークにそもそもつながらない場合はWSLのDNSの設定が正しく行われているかをご確認ください。
まとめ
SSH接続を利用することで、Gitをよりセキュアかつ便利に活用することができます。公開鍵と秘密鍵を用いた認証方式により、毎回パスワードを入力する手間を省き、通信の暗号化を通じて安全性も確保されます。SSH接続を適切に設定し、効率的で安全なGit作業環境を整えましょう。ご参考になりましたら幸いです。