はじめに
導入
本記事は、GUI gitクライアントツールであるSourcetree のWindows版に関して、SSH接続の設定等につき情報を整理したものです。
とは言え、こうしなければいけないというわけではなく、なるべく単純になるようにという観点で手順を構築することを考え、それに対して周辺知識や代替の手順を補足したものに過ぎません。それを元にSSH接続に関する周辺知識を識るきっかけになれば幸いです。
※いくつかのパターンで整理していますが、「単純」という観点ではOpenSSHでSSH認証エージェント(ssh-agent)なしで使う手順が最も単純かと思います。
環境
- Sourcetree バージョン 3.4.12
- Windows10 22H2
- リモートリポジトリとして github を想定
注意事項:
Sourcetreeは、内部で使用する git アプリとして、別途インストールした各 git プログラムを選択することも可能になっています。( おそらく Git-for-windows 等を想定したものと思われます )
しかし、本記事ではデフォルトで使用する内蔵(Embedded) git を前提とします。
※以下、ツール→オプション→Git(タブ) で確認できる、git の選択画面の状況
基礎知識
SSHの構成要素
gitを使う局面においてSSHは次の図のように、クライアントからサーバ側のgitアプリの起動指示と、クライアント・サーバそれぞれのgitアプリのデータをやり取りするための通信の中継の役割を担います。
※参考: 記事「SSHの公開鍵ってなに?」の「SSHについておさらい」の章
そのため、ユーザにとって一番重要なのは、もちろん上図「SSHクライアント」に相当するアプリになりますが、実際に SSH を運用するにあたっては周辺ツールのことも意識する必要があります。それら構成要素は次のようになります。
- サーバ側
- SSHサーバ
SSHクライアントからの接続を受け付け通信を行う、サーバ側のメインアプリです。 - ホスト鍵
通信開始時に「自分が何者であるか」を示す「ホスト認証」の手続きのためにSSHサーバが使う、公開鍵・秘密鍵のペアを指します。 - 認証鍵管理簿(※独自用語)
各ユーザが用いる認証鍵の公開鍵を管理するファイルなりDBのことを指して、ここでは「管理簿」という名称を付けています。
一般には authorized_keys というファイルをユーザ毎に作って管理する形式がよく採られます。( 参考: 「SSHの公開鍵ってなに?」の「公開鍵の登録」の章 ) しかし、どのように管理するかはサーバの構成次第です。
- SSHサーバ
- ユーザ側
- SSHクライアント
SSHサーバに接続し通信を行う、ユーザ側のメインアプリです。 - ホスト鍵管理簿(※独自用語)
接続先のサーバに対応するホスト鍵の公開鍵を管理するファイルなりDBのことを指して、ここでは「管理簿」という名称を付けています。
手動で管理するというよりも、SSHクライアントが自動登録する( 接続時にユーザに確認を求め、承認された分を登録 ) という使われ方になります。( 参考:「SSHの公開鍵ってなに?」の「ホスト鍵の扱い」の章 ) - 接続情報管理簿・設定ツール(※独自用語)
SSH接続に必要な情報、接続時のオプション等を、SSHクライアントの定める形式で接続先毎にまとめて管理・保存するためのファイル等を指して、ここでは「管理簿」という名称を付けています。また、この管理簿を操作するツールを「設定ツール」としています。
SSHクライアント実行時に個別に情報を指定することは可能なため、接続情報の管理・保存が必須というわけではなく、情報管理コスト軽減を目的としたものと言えます。また、テキストベースのファイルで接続情報を管理する形態であれば、特に専用のツールが存在しないこともあります。 - 認証鍵・鍵生成ツール
認証鍵は、ユーザ認証としてポピュラーな「公開鍵認証」を行う場合にSSHクライアントが使う、公開鍵・秘密鍵のペアを指します。
そのの生成や、形式の変換、パスフレーズ・コメント等の付随情報を調整するためのツールを、ここでは鍵生成ツールとしています。 - SSH(認証)エージェント
認証鍵を管理する常駐アプリとして、SSHクライアントに替わって認証鍵を使った処理 ( 公開鍵認証における使い捨ての署名データ生成 ) を代行するツールです。
SSHクライアント自身も認証鍵を扱う機能を備えるため、このSSH認証エージェントは必須ではありません。しかし、特にパスフレーズ保護された鍵を使う場合のパスフレーズ入力を省略できるという点で、運用上のメリットが大きいものです。
- SSHクライアント
以下に、SSHエージェントを利用しない場合・利用する場合それぞれでの構成要素の関係を図示します。
これらの構成要素の中で、SourcetreeからSSH接続を行う場合に関わってくるユーザ側のツールは、SSHクライアント、鍵生成ツール、SSH認証エージェントの3種類です。
最後のSSH認証エージェントについては、一般のSSHでは必須ではないものの、Win版Sourcetreeからは半ば必須と言う扱いになっています。( それでも利用しない方法はあります )
「接続情報管理簿」を調整することはSourcetree側で想定していないため「設定ツール」も同梱されていません。しかし、一般的なSSHの運用では鍵の管理にも関わってくる要素であるため、本記事で一部取り上げます。
Sourcetreeでの選択肢
Sourcetreeでは利用する SSH のツールセットとして、内蔵の2種類が選択肢として用意されています。
- 選択肢1 … PuTTY
SSH登場初期からWindows用として利用されてきたツールセットであり、Sourcetree の初期設定ではこちらが選択されています。Sourcetree以外でも有名どころでは WinSCP や Teraterm 等、PuTTY 付属のツールと連携できるようになっているものが多いのも特徴です。- SSHクライアント
ポピュラーなのは、ターミナル機能を備えたGUI版の PuTTY ですが、Sourcetree には同梱されていません。CUI版の Plink のみが同梱されています。 - 設定ツール
SSHクライアントである PuTTY が設定ツールも兼ねています。しかし上述の通り Sourcetree には同梱されていないため、別途 PuTTY を導入しない限り、設定管理はできません。
※Plinkのコマンドラインオプションにより接続用のパラメータ指定は事足りますので、設定管理できなくて困るわけではありません - 鍵生成ツール
GUI版の鍵生成ツールである PuTTYgen が同梱されています。これは WinSCP にも同梱されているものです。本ツールで扱う鍵の形式は主に PuTTY PPK形式ですが、その他の形式も広く扱うことができます。 - SSH認証エージェント
GUI版のエージェントである Pageant ( Pagentではない ) が同梱されています。このツールは WinSCP等にも同梱されているため、そちらで代用しても構いません。( 2つ以上を同時起動はできません )
Sourcetree では設定ツールを兼ねる PuTTY が同梱されていないため、鍵を使うためにこの Pageant の理由はほぼ必須となります。
- SSHクライアント
- 選択肢2 … OpenSSH
Linux, MacOSX も含め UNIX 系の標準ツールとして広く使用されるCUIのツールセットです。
しかし Windows で使う上では UNIXとのアーキテクチャの違いを吸収するための仕組みが必要となるため、一口に OpenSSH といっても、内部的に相互運用不可能な幾つかのバージョンがあります。- SSHクライアント
ssh コマンドが同梱されています。PuTTY のような GUI版はありません。 - 設定ツール
OpenSSH では接続設定はテキストファイルで行います。そのため専用のツールは特になく、好みのエディタを流用すれば事足ります。 - 鍵生成ツール
ssh-keygen コマンドが同梱されています。 - SSH認証エージェント
常駐のエージェント本体である ssh-agent と、エージェントを操作するための ssh-add コマンドが同梱されています。
Sourcetree で OpenSSH を選択した場合、自動的にエージェントが起動されますが、利用は必須ではありません。
なお、ssh-agent, ssh-add は Sourcetree が内部で自動的に操作するため、ユーザがコマンドを明示的に使うことはありません。
- SSHクライアント
Sourcetreeでの操作メニュー
PuTTY版
- PuTTYの選択
ツール→オプション→全般(タブ)から、「SSHクライアントの設定」カテゴリで「SSHクライアント」を「PuTTY/Plink」とすることで、PuTTYが選択されます。
Pageantの起動はオプションとなっており、Sourcetree外で既にPageantを運用している場合はチェックを外しておきます。
- PuTTY関連のツールメニュー
前項でPuTTYを選択することで、ツールからPageantの起動(SSHエージェントを起動)と、PuTTYgenの起動(SSHキーの作成/インポート)が選べるようになります。
- Pageant操作
起動後のPageantはWindowsタスクバーの通知領域にアイコンとして表示されます。
右クリックすることでメニューを出すことができ、「Add Key」メニューから鍵の登録ができます。
※Sourcetreeの設定で鍵ファイルを設定していれば、このメニューから登録する必要はありません。
OpenSSH版
- OpenSSHの選択
ツール→オプション→全般(タブ)から、「SSHクライアントの設定」カテゴリで「SSHクライアント」を「OpenSSH」とすることで、OpenSSHが選択されます。
ssh-agentの起動は強制です。ただPageantと違い、ssh-agentは重複して起動できるため、Sourcetreeの外で別にssh-agentを使っていても影響はありません。
- OpenSSH関連のツールメニュー
前項でOpenSSHを選択することで、ツールからssh-agentの起動し直し(SSHエージェントを起動)と、ssh-agentへの鍵の登録(SSHキーを追加)が選べるようになります。
単独でWindowsアプリとして制御できるPageantと違い、Sourcetreeを介さずにssh-agentに対し操作を行う方法は基本的にありません。( ssh-agentの内部動作を知ってれば手はありますが )
- コマンド実行用ターミナル
「ターミナル」アイコンから起動できるターミナルは、OpenSSH関連のコマンド ( ssh や ssh-keygen )、その他UNIX系コマンドを実行するために使えます。
ただし、ここでssh-agent, ssh-addでエージェントを操作してもSourcetreeと連携させることは基本的にできません。( ssh-agentと連携するためには起動プロセス毎に決まる情報が必要になるところ、その情報をSourcetree本体と遣り取りする手段がないためです )
鍵設定の典型手順
SSHクライアントとの連携にあたって
GUIツールであるSourcetreeからSSHクライアントに連携するにあたり、1つ意識すべき点があります。
それはSSHクライアントの「対話的な操作」です。
特にパスフレーズ保護された鍵を使うケースが典型ですが、SSHクライアントを実行した後、通信を確立するまでに色々とコンソール経由での入力を要求される場合があります。
これは自動処理という面では非常に都合が悪く、Sourcetreeでは直接対処する方法を持ち合わせていません。
参考: 入力を要求されて処理が停止した場合の一例
コンソールで入力が要求される状況がSourcetreeで起こると、自動処理ができず処理停止やエラーになる
SourcetreeでほぼSSH認証エージェントが必須扱いされている理由は、パスフレーズ保護された秘密鍵を使う際に、このような入力要求が発生するのを回避するためと思われます。
とは言え、必ずSSH認証エージェントを使わなければならないというわけではありません。
入力要求の有無を意識しつつ、SSH接続ができるまでの手順を整備してみます。
SSH認証エージェントを使う手順
SSH認証エージェントを使う場合、パスフレーズ保護された認証鍵も簡単に扱えるというのが最大の特長です。手順の概略は次のようになります。
なお、Sourcetree上の設定画面やメニューについては、上述の「Sourcetreeでの操作メニュー」の章をご覧ください。
- 認証鍵の準備
- 認証鍵の作成
鍵生成ツールを使って認証鍵を作成する。お好みでパスフレーズも設定する。 - サーバへの公開鍵の登録
認証鍵の公開鍵をサーバの認証鍵管理簿へ登録します。手順はサーバ次第です。詳細はここでは割愛します。
- 認証鍵の作成
- Sourcetreeの設定
- SSHクライアントの選択
PuTTYまたはOpenSSHを選択する。PuTTYの場合はSSH認証エージェントの自動起動も有効にする。
※Sourcetree外のPutty Pageantを使う場合は不要 - 認証鍵の指定
前項で作成した認証鍵のファイル名を登録する。
※Sourcetree外のPutty Pageantを使う場合はここでは設定せず、別途 Pageant に自分で鍵の登録を行う。
- SSHクライアントの選択
- 接続確認
- SSH認証エージェントの起動
設定を有効にすると自動的にSSH認証エージェントが起動される。認証鍵にパスフレーズを設定した場合は、このタイミングでパスフレーズを入力する。
※この起動処理は、Sourcetree起動毎に行われる - gitリポジトリサーバへの接続確認(※オプション)
登録した認証鍵による認証のテストを兼ねてサーバへSSH接続し、ホスト鍵の管理簿への初回登録も行う。ただし、OpenSSHの場合は行う意味がない。
- SSH認証エージェントの起動
PuTTYでSSH認証エージェント(Pageant)を使う手順
- 認証鍵の準備
- 認証鍵の作成
SourcetreeのメニューでPuTTY/Plinkを選択するよう設定し、ツールメニューからPuTTYgenを起動します。※まだ認証鍵ファイルやSSH認証エージェントの自動起動は設定しません。
PuTTYgenの操作については、記事「SSHの公開鍵ってなに?」の「認証鍵作成ツール」の章の、PuTTYgen/MobaKeyGenの項をご参照ください。
なお、コメントやパスフレーズを設定する場合は、「Save private key」ボタンで保存する前に、下の画像を参考に入力してください。
- サーバへの公開鍵の登録
登録する際の公開鍵は、前項PuTTYgenの画面上の公開鍵テキストをコピペして使ってください。
- 認証鍵の作成
- Sourcetreeの設定
PuTTYgenによる認証鍵生成に先立って、既にPuTTYは選択済みですが、まだ設定していなかったSSH認証エージェントの自動起動の有効化と、前項で作成した認証鍵ファイルの指定を行います。 - 接続確認
- SSH認証エージェントの起動
設定反映した段階でPageantが起動され、パスフレーズ保護ありの鍵の場合、次図のように入力画面が現れますので、パスフレーズを入力しOKボタンを押します。
※パスフレーズ保護が無い場合、特に画面には何も現れません。Pageantの起動を確認する場合はタスクバーの通知領域をご覧ください。
- gitリポジトリサーバへの接続確認
PuTTYの場合は、ホスト鍵の登録が必須となるため、以下の手順でPlinkコマンドを実行して接続確認のついでに登録を行います。
※過去のAtlasianのナレッジベースを見ると、Sourcetreeがホスト鍵確認のダイアログを出す機能も持っていて、敢えて手動で登録する必要はなかったようなのですが、手元では確認できなかったため「ホスト鍵の登録が必須」としています。- PuTTYフォルダを開く
Sourcetreeに同梱されているPuTTYのフォルダをExplorerで開きます。一例として、以下の手順があります。 - Plinkでの操作
- Plinkコマンドの実行
PuTTYフォルダを開いた状態のExplorerのアドレス欄に、plink -T ユーザ名@接続先
とコマンド・Enterを入力します。( githubの場合はplink -T git@github.com
です ) - 接続確認
初回接続の場合、次の画像のようにホスト鍵のフィンガープリントが表示されますので、正しいものかを確認し、"y"を入力してPC上に登録します。( PuTTYの場合はレジストリに保存されます ) その後 "Access granted." と表示があれば成功なので、画面を閉じます。
なお、ホスト鍵のフィンガープリントについては、githubの場合、GitHub's SSH key fingerprintsのページで確認できます。
- Plinkコマンドの実行
- PuTTYフォルダを開く
- SSH認証エージェントの起動
OpenSSHでSSH認証エージェント(ssh-agent)を使う手順
- 認証鍵の準備
- 認証鍵の作成
Sourcetreeのメニューからターミナルを起動し、ssh-keygenコマンドにより鍵を生成します。
ed25519で、コメントとしてメールアドレスを指定し、c:\test\testkey
に保存する場合のコマンド例は次の図の通りです。対応するファイル名の指定は-f /c/test/testkey
になります。
※この-f
の指定を省略した場合、C:\Users\ユーザ名\.ssh\id_ed25519
というデフォルトのファイル名になります。
- サーバへの公開鍵の登録
登録する際の公開鍵は、公開鍵ファイル ( 前項で指定したファイル名に.pub
を追加したファイル ) をcat
コマンドで出力し、その内容をコピペして使います。
- 認証鍵の作成
- Sourcetreeの設定
Sourcetreeの設定でOpenSSHを選択し、前項で作成した認証鍵ファイルの指定を行います。
※SSH認証エージェントの自動起動は強制的に有効になります。 - 接続確認
OpenSSHの場合、個別に接続確認をする意義はありません。以下では、SSH認証エージェントの起動についてのみ手順を説明します。- SSH認証エージェントの起動
設定反映した段階でssh-agentが起動され、パスフレーズ保護ありの鍵の場合、次図のように入力画面が現れますので、パスフレーズを入力します。
※パスフレーズ保護が無い場合、特に画面には何も現れません。
- gitリポジトリサーバへの接続確認
ssh-agentをSourcetreeが起動している状態でも、そのエージェントと連携する情報が得られないため、接続確認に使えません。
また、Sourcetreeはホスト鍵を無視するオプションを付けてsshクライアントを起動するため、ホスト鍵の登録も必要ありません。そのため、接続確認の手順を行う意味がありません。
※参考: ホスト鍵が不正の場合も、次の図のように警告は出るものの無視扱いになります。セキュリティ的にはよろしくないのですが、これがSourcetreeでOpenSSHを使う場合のSSH運用ポリシーのようです。
- SSH認証エージェントの起動
SSH認証エージェントを使わない手順
SSH認証エージェントを使わない場合、SourcetreeはSSHクライアントに認証鍵情報を伝える手段をサポートしていません。加えて認証鍵にパスフレーズ保護がある場合、対話処理が発生してしまいます。
しかし、以下の条件を満たすことでSSH認証エージェントを使わない運用が可能になります。
- パスフレーズ保護の無効化
認証鍵をパスフレーズ無しで作成することで、対話処理を抑止することができます。 - SSHクライアントへの直接の認証鍵指定
以下のどちらかを満たすことで、SSHクライアントは使用する認証鍵を認識することができます。- 接続先個別の認証鍵の設定
接続先に対してどの認証鍵を使うかを接続設定管理簿上で指定することで、SSH認証エージェントを介在させる必要なくSSHクライアントを使うことができます - デフォルトのファイル名での認証鍵の作成
個別の接続先に対して設定がなくとも、SSHクライアントのデフォルトの認証鍵ファイル名でも、SSH認証エージェント無しにできます。
- 接続先個別の認証鍵の設定
なお、OpenSSHの場合、~/.ssh/config
ファイルが接続情報管理簿となっており、テキストエディタで編集することで情報を登録しておくことができます。
次の図のように、個別にコマンドで情報を指定する代わりに、接続名を指定して、(認証鍵ファイルも含め)一括で情報を指定することができるようになります。
ただ、これはSourcetree側であまり想定されていないので、あくまで参考情報に留めておきます。
PuTTYでSSH認証エージェント(Pageant)なしで使う手順
Sourcetreeから使うPuTTYでSSH認証エージェント無しの運用を行う場合、設定ツール兼SSHクライアントであるPuTTY本体が必要になります。
※PuTTY本体は、PuTTYダウンロードページから個別にも入手可能です。
そのため、あくまでここでは参考情報として、PuTTY本体で鍵を指定する方法を紹介するにとどめます。
接続先個別の認証鍵の設定の場合でも、デフォルトのファイル名での認証鍵の作成の場合でも、いずれにせよPuTTY上での設定が必要です。
項目は、Connection→SSH→Auth→Credentialsの Private key file for authentication です。
これを、接続名(セッション) "Default Settings" に指定すれば「デフォルトのファイル名」、それ以外の名前なら個別の設定として働きます。
以下、それぞれで設定した状況での Plink 実行時の様子を表した図です。いずれでも認証鍵を使って接続できていることが分かります。
※ホスト鍵登録後に試しているので、ホスト鍵に関する確認メッセージは出ていません。
OpenSSHでSSH認証エージェント(ssh-agent)なしで使う手順
最後に、OpenSSHで認証エージェントなしの手順です。
ここでは手順を簡略化するため、パスフレーズ保護無し + デフォルトのファイル名の場合を紹介します。
手順の一部は、SSH認証エージェント有りの場合と重複します。
-
認証鍵の準備
-
接続確認
SSH認証エージェント有りの場合と同様、意義はあまりないのですが、認証鍵の確認にはなるので、接続確認手順を挙げておきます。
と言っても、ターミナル上でssh -T git@github.com
というコマンドを実行するだけです。初回接続時はホスト鍵のフィンガープリントの確認を行い、正しいフィンガープリントならyes
と入力してください。
-
Sourcetreeの設定
Sourcetreeの設定でOpenSSHを選択し、認証鍵ファイルは空のままとします。
※SSH認証エージェントの自動起動は強制的に有効になりますが、鍵を登録しないので特に使われもしません。
おわりに
SSHを使うことに慣れている人であれば、設定項目・関連するツール群との連携の調整に苦を感じることもないと思いますが、経験が浅い人にとってはなかなか掴みどころがないのではないでしょうか。この記事がそういった知識を整理する一助となれば幸いです。