[git] Ubuntu DesktopにおけるgitおよびGCMの設定方法(署名付き)
はじめに
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
は暗号化ツールです。具体的には秘密情報の為の鍵を生成したりするためのツールです。
pass
はgpg
を使ったパスワード管理をしておく為のCLIツールです。別ソフトウェアですが、例えばDocker Desktopのログイン設定などでも使ったりメジャーなツールだと思うので、入れておいて損はないと思います。
sudo apt update
sudo apt install gpg pass
インストールされたか確認するには、which gpg
やpass --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.name
とuser.email
は設定されていますか、特にEmailはGitHubに登録されているものと同じですか -
user.signingkey
は設定されていますか、それはgpg --list-secret-keys
で表示される利用IDと一致していますか -
gpg.program
は設定されていますか - 少なくとも
commit.gpgsign
はtrue
で設定されていますか - 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での無難な選択肢として、credentialStore
にgpg
を選択しています。pass
を保存先に使う設定です。
この段階ではgpg
とpass
ツールが導入されているかが重要であり、pass
がinit
済みである必要があります。「前準備」の項目を行った場合、インストールしています。
まだ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みたいなツールもあるので、わかりにくい!ってなったら使ってみるのもありだと思います。
- 新しい GPG キーを生成する (GitHub Docs)
- コミットに署名する (GitHub Docs)
- git-credential-manager公式リポジトリ
- Git Credential Manager (GCM) でGithubへの認証をセキュアに実現する (Windows, WSL2, Linux)
- GnuPG (Arch Wiki)
- GnuPG (Gentoo Wiki)
- Pass 公式ドキュメント
おわりに
いやぁ〜〜〜お疲れ様でした。ここまでお読みいただきありがとうございます。やっぱりこう手順を振り返ってまとめてみると、骨が折れますね。
ひとえにgitは基本、と言っても、結構環境づくりは大変だったりするので、少しでもご参考になれば幸いです!
Discussion