🐿️

[git] Ubuntu DesktopにおけるgitおよびGCMの設定方法(署名付き)

2024/05/22に公開

はじめに

Ubuntu DesktopでgitおよびGitHubへのコミットの準備を行うための方法を記載します。
具体的には、gitのインストールから始まり、CUIベースでGCM(git-credential-manager)によるHTTPSでの自動認証と、コミット署名ができるようになるまでの手順を記載します

これによって、以下のことが出来ます。

  • 署名付きコミットができる
  • 資格情報はGCMを利用するよう設定され、HTTPSでのコミット及びクローンができる

この話題については私以外にも沢山の方が記事を作られています。GitHubへの接続方法はSSHなどもあります。私はGitHubの推奨ということもあり、HTTPS形式を基本的に利用しています。

「こんなこと当たり前のことだよ!」と思われる方もおられるかもしれませんが、ある程度理解できても骨が折れる作業だと思ったので、「初めてUbuntu Desktop入れてみたよ」「git慣れしてないよ」って方などにも出来るだけ対象にしたつもりで、自分なりにまとめました。1つの参考にしてみてくださると嬉しいです。

本記事についてはUbuntu Desktopをターゲットにしていますが、大まかなところでは他OSでも参考になると思います(特にGCM周りはチマチマOSまたはWSLなどでそれぞれごとの設定が必須、また、GUIクライアントを使う際はソフトによっては色々やるべきことがあるかもしれません。)。
なお、執筆段階で筆者が利用しているOSはUbuntu 22.04です。

前準備

gitのインストール

gitは当然利用可能である必要があります。インストールしていない場合は、インストールします。

sudo apt-get update
sudo apt-get install git

Gitが利用可能か確認するには、which gitなどを利用します。

ユーザ名・Eメールの確認

ほぼ大多数の方はグローバルなスコープで殆どの需要が合うと思うので、今後はこの~/.gitconfigに設定していく話を前提にします。

最初に、~/.gitconfigの存在をチェックしてください。なければこの段階で空ファイルを作っても良いでしょう。touch ~/.gitconfigで生成できます。

この段階では、具体的にはユーザ名とEメールアドレスを設定しているかをチェックします。
これは、以下のようなコマンドで確認可能です。

git config --global --list
cat ~/.gitconfig

ユーザ名は任意です。私はちょっと恥ずかしく、プライベートはニックネームにしてますが、法人では本名が基本的になるでしょう。
EmailアドレスはGitHub Email設定Not visible in emailsを設定するようにしています。

ユーザ名とEメールを設定するには、以下のコマンドを利用します。
個人的には第2手ですが、~/.gitconfigなどに設定はベタ書き・修正してもOKです。

git config --global user.name <user-name>
git config --global user.email <email>

ツールの導入

gpgおよびpassを導入します。インストールされていれば、割愛して構いません。

gpgは暗号化ツールです。具体的には秘密情報の為の鍵を生成したりするためのツールです。
passgpgを使ったパスワード管理をしておく為のCLIツールです。別ソフトウェアですが、例えばDocker Desktopのログイン設定などでも使ったりメジャーなツールだと思うので、入れておいて損はないと思います。

sudo apt update
sudo apt install gpg pass

インストールされたか確認するには、which gpgpass --helpのようなコマンドを利用します。

コミット署名できるようにする

最初にコミット署名できるような設定をしていきます。ここでは、gpgコマンドを沢山使うことが関門です。

gpg鍵の作成

鍵を使いまわしてインポートした場合はこれ以降GitHubへの設定の段階まで割愛することが出来ます。左記が何を言っているか分からない場合は、ここからスタートしましょう(大丈夫!)。

gpgで鍵を作成します。

gpg --full-generate-key

ここでは、鍵の種類どうする?期限どうする?などの情報が問われ、Enterまたは入力で進みます。基本はデフォルトでOKだと思います。

ポイント1: 鍵には有効期限がある

注意したいのは鍵の有効期限を問う場面で、期限がある場合は都度更新が必要になることを覚えておいてください。基本的に安全上の観点から有効期限付きであることをおすすめしますが、まずお試しで、とかプライベートの利用で面倒、って方はとりあえず無期限でOK、ではないかと考えています。
これは一応、のちのち編集も出来はしますので、あんまり恐れないでください。その方法は割愛しますが、後の参考文献などを参照してみてください。

ポイント2: メールアドレスとパスワード設定

次に注意したいポイントとして、メールアドレスとパスワードを設定する段階があります。具体的には、名前、メールアドレス、コメントを設定した後、パスワード(パスフレーズ)を入力します。名前は一応本名ってあるけどそうじゃなくても良いですし、コメントは無記載でも構いません。

ここで、メールアドレスはGitHub Email設定に一致させる必要があります
すなわち、~/.gitconfigのメールアドレスとも等価と思われるので、それを設定してください(Not visible in emailsもOK)。
パスワード(パスフレーズ)はコミットごとになど、かなりの頻度で入力するはずなので、やや推測しにくいが、手グセで殆ど忘れることはない、すぐ入力できる内容にすることをおすすめします。

gpg公開鍵をGitHubに設定する

まず作成した鍵を確認します。

gpg --list-secret-keys --keyid-format=long

ここで、表示され作成されたものを見つけ、secの下の行にある長い文字列を見つけます。
例は以下の通りです。

sec   xxxxxxx/xxxx xxxx-xx-xx [XX]
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ←これ

これは俗にgpg-idと呼ばれるフィンガープリントで、後にも出てくるので、こういうのを見るぞ、ってところを覚えておきましょう。

その文字列をコピーし、以下のコマンドを叩きます。

gpg --armor --export <gpg-id>

すると、公開鍵が文字列として出力されます。

-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----

これは丸々コピーしてください。なお、この文字列は必要な場所以外でむやみやたらに外部に公開しないようにしてください。

そして、GitHubのkeysページの下の方にある(2024年5月現在)「New GPG Key」ボタンで移行する登録フォームに公開鍵をペーストし、何らかの表題をつけて登録します。

署名コミットされるようにgitを設定

GPGで署名コミットされるよう設定します。
<gpg-id>とは、先述したgpg-idとなる長い文字列であり、<gpg-path>which gpgで表示されたgpgのプログラムパスを入力します(例えば/usr/bin/gpg)。

git config --global user.signingkey <gpg-id>
git config --global gpg.program <gpg-path>
git config --global commit.gpgsign true
git config --global tag.gpgsign true

設定をチェック

ここまでで、署名コミットする為の設定は終わりです。
git config --global --listを使いつつ、以下の項目を点検します。

  • user.nameuser.emailは設定されていますか、特にEmailはGitHubに登録されているものと同じですか
  • user.signingkeyは設定されていますか、それはgpg --list-secret-keysで表示される利用IDと一致していますか
  • gpg.programは設定されていますか
  • 少なくともcommit.gpgsigntrueで設定されていますか
  • GitHubのサイトにあなたのアカウントでGPGの公開鍵登録はされていますか

git-credential-managerの導入と設定

次に、GCM (git-credential-manager)を導入します。これは資格情報を管理するための.NET製ツールで、ほぼデフォルトみたいな位置のツールです。

具体的にはHTTPSでGitのクローンやコミットをするときに資格情報が必要な為、使います。
このツールはWindows版Gitだとデフォルトでついており、Macもbrewで簡単にインストールできるので楽ですが、Linuxはちょっと設定が必要なので手順を記載します。

公式のマニュアルがやや見にくいですが、公式リポジトリのdocsの部分なので、詳しくはそちらを参照してください。

.NET関連のSDKとランタイムをインストール

インストール手段としては、私は.NETを好んでいることもあるので、この方法が楽だなと感じています。
.debパッケージなどの方法もあるので、好みだと思います。他の方法を使いたい場合は、GCMの公式マニュアルを参照してください。

.NETのインストール方法を詳細に示したリソースは.NET公式マニュアルが良いでしょう。

ここで重要なことはdotnetコマンドが使えるかということで、PATHが通っているかをチェックします。

sudo apt-get update && sudo apt-get install -y dotnet-sdk-7.0
# ↓ or sudo apt-get install -y dotnet-runtime-7.0
sudo apt-get update && sudo apt-get install -y aspnetcore-runtime-7.0
# インストールされてるかのチェック
which dotnet
# 対応SDKがあるか確認
dotnet --list-sdks
# 対応ランタイムがあるか確認
dotnet --list-runtimes

git-credential-managerのインストール

dotnet tool install -gでツールをインストールします。

ここでは、ツールインストール先は基本的に~/.dotnet/toolsとなっており、そこにPATHが通っているかなどの観点も必要です。通ってなかったらPATHを通しましょう。

dotnet tool install -g git-credential-manager
# インストールされているかのチェック
which git-credential-manager
# 初期設定 (.gitconfigに書き込まれる)
git-credential-manager configure

ここで、.gitconfigが書き換わってるハズなので、1回ちょっと何が変わったか点検してみることをおすすめします。

credentialStoreの設定

credentialStoreの設定をします。

重要な箇所です。秘密情報の保存先をどうするかを決定する段階です。

ここでは、Linux Desktopでの無難な選択肢として、credentialStoregpgを選択しています。passを保存先に使う設定です。

この段階ではgpgpassツールが導入されているかが重要であり、passinit済みである必要があります。「前準備」の項目を行った場合、インストールしています。

まだpassデータベースが初期化されてない場合は、鍵生成し初期化します。
鍵生成はコミット署名の項目に述べたことと大体同じですが、passの為のものなので、別途作成するようにします。具体的には、以下のコマンドを使います。

# 鍵を作成: or gpg --full-generate-key
gpg --gen-key
# 鍵IDを確認
gpg --list-secret-keys --keyid-format=long
# passを初期化
pass init <gpg-id>

passが使えるかの確認については、~/.password-storeというフォルダが存在している(作られている)ことが1つ判定基準になります。

GCMでgpg利用するようgitを設定

ここまでで出来たら、gitの設定を行います。資格情報にgpgを選択します。

git config --global credential.credentialStore gpg

設定をチェック

おおよそのことは終わりです。
git config --global --listで以下の項目を点検します。

  • credential.helperは設定されていますか、それはgit-credential-managerのパスになってますか
  • credential.credentialStoreは設定されていますか、それはgpgですか
  • passは導入されていますか、~/.password-storeフォルダが生成されていますか

その他キャッシュ設定などがありますが、これはお好みです。

テストする

ここまで来たら、以下のことが出来るようになると期待されます。

  • 署名付きコミットができる
  • 資格情報はGCMを利用するよう設定され、HTTPSでのコミット及びクローンができる

テストしてみます。

クローンしてみる

まずクローンです。git-credential-managerが正常に機能するかをチェックします。
GitHubで適当なリポジトリを作り、クローンしてみます。

正常に使える場合、ブラウザ画面が出てきて1度だけGitHubがオーサライズする項目が出現します。

1回オーサライズしたら、あとは何度でもクローンできるはずです。
ちなみに資格情報の保存先としては、~/.password-store/gitが出来ています。

コミットしてみる

次に、コミット署名できているかを確認します。
GitHubで適当なリポジトリを作り、クローンした後、適当にコミットします。
あるいはローカルから作って、後でリモートリポジトリを作ってリモート設定してもOKです。
内容は適当で構いません。下のようなふうに。

echo "aaaaaaaaaaa" >> test.txt
git add -A
git commit -m "initial commit"

この時点でパスワードを求めるダイアログが出ると思うので、その挙動があるかに注目してください。そこで、先に設定したパスフレーズを入力してください。通ればコミットできたはずです。

その後、Pushします。

git push -u origin main

Pushに成功したら、GitHubのWebサイトで、リモートリポジトリであなたのコミット履歴を確認してください。
左に「Verified」という緑マークがついていたら、成功です!🚀

参考文献

最後に、参考文献および有用なリソースを記載します。特にgpg周りが大変だと思うので、迷ったら参考にしてみると良い気がします。
なお、GPGの管理にはKleopatraみたいなツールもあるので、わかりにくい!ってなったら使ってみるのもありだと思います。

おわりに

いやぁ〜〜〜お疲れ様でした。ここまでお読みいただきありがとうございます。やっぱりこう手順を振り返ってまとめてみると、骨が折れますね
ひとえにgitは基本、と言っても、結構環境づくりは大変だったりするので、少しでもご参考になれば幸いです!

Discussion