🪪

コミットに署名するとはどういうことなのか

2024/05/11に公開1

貴方は誰ですか?[1]

はじめに

本記事では、コミットに署名をすることにどういった効果があるのか掘り下げています。読者がどういった署名を採用するかの判断基準が得られることを目標にします。この記事の執筆にあたり GitHub 上でのコミットの見え方を検証するリポジトリを作成して公開しています。

https://github.com/ykws/signed-commit-example

扱わないこと

本記事では、コミットに署名する具体的な方法については触れません。具体的な方法が知りたい場合は、別の記事で触れているので、そちらを参考記事として紹介します。記事の中で紹介している GitHub のドキュメントが充実していて、わかりやすいです。

https://zenn.dev/yumemi_inc/articles/signed-commit

用語の整理

まずは署名に関する用語を整理してみます。

署名/記名/落款

「あなたの作品に署名すること」[2]

この言葉を聞いて作品とはどんなものをイメージしますか。具体的なアプリケーションでしょうか。それとも、そのアプリを構成する一機能でしょうか。プログラマにとって 1 つのコミットが 1 つの作品という位置付けに共感できるでしょうか。

仮に 1 つのコミットをあなたの 1 つの作品として、それに署名しましょう、という動機付けに共感できるでしょうか。

結論は急ぎません。ここでは問いかけのみに留めます。

「署名」という言葉には次のような解釈があります。[3]

署名とは、ある行為の際に自筆で自分の氏名を文書に書き記すこと、または書き記した氏名のことです。

一方、その対比として「記名」という言葉が定義されています。

「署名」は手書きで自分の氏名を書く行為ですが、「記名」は手書き以外の手段で自分の名前を記す行為です。

この解釈によると、コミットに名前やメールアドレスを設定することを署名と表現すると誤解が含まれそうです。どちらかといえば記名です。コミットに記名する。この表現が適切だと感じました。

さらにいうと落款[4]のような判子として押印するのが、冒頭の「あなたの作品に署名すること」と聞いて筆者が思い浮かべるイメージに近いです。

電子署名/デジタル署名

前述の署名では自筆という定義はあるものの、IT 用語として、電子署名またはデジタル署名として、署名のメタファがすっかり定着しています。[5]

「電子署名」(electoronic signature)とは本来、紙の文書における押印やサインに相当する証明手段を電子的な手段で実現したもの全般を表す総称であり、「デジタル署名」(digital signature)は公開鍵暗号の原理に基づく電子署名の一方式である。

ここでの解釈としては、電子署名とデジタル署名を区別していて、コミットへの署名は公開鍵暗号を利用しているのでデジタル署名ということになります。

署名の段階の整理

これらを踏まえて署名の段階の整理をします。記事中のホストは GitHub に限定して書いています。

  1. コミットに名前が設定されている
  2. コミットにメールアドレスが設定されている
  3. ホストにメールアドレスが登録されている
  4. コミットにデジタル署名されている
  5. ホストに公開鍵が登録されている

それぞれの段階で実際に GitHub 上でどのように見えるかは先に紹介した検証リポジトリのコミット履歴を見てもらうとわかりやすいです。

Git の公式ドキュメント[6]では、最初にやることが名前とメールアドレスを設定することと記されています。

ただ、これは PC のセットアップ時に限定されがちで、新規プロジェクト参画時にも見直しすることをお勧めしたいです。

名前とメールアドレスが未設定の場合

この記事の執筆にあたり、改めて、名前とメールアドレスを未設定の状態でコミットしようとしたところそれはできないことがわかりました。コミット時に次のエラーが発生しコミットできませんでした。

Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <>) not allowed

そのため、名前が未設定な状態にはできなくて、検証リポジトリでは Anonymous という名前を設定してコミットしたため、 GitHub 上でも Anonymous と表示されています。無名だから Anonymous ではないです。

名前とメールアドレスを設定しても GitHub で関連付けされていないと、コミット時に指定した名前が表示されています。

メールアドレスを関連づけることでアカウントと紐づいて、この時点でコミット時の名前は表示されなくなります。

デジタル署名をしても GitHub に公開鍵が未登録だと Unverified のバッジが表示されます。

GitHub に公開鍵を登録すると Verified のバッジが表示されます。

コミットに名前を設定する

まず名前の設定ですが、これが一番難しいです。

本名にするのか、ハンドルネームにするのか、名前の表記には特別なルールがなくて何を頼りに決めるのか迷うところです。参加したプロジェクトに方針があれば、リポジトリごとに設定可能なので合わせます。会社名を含める書式で統一されたプロジェクトに参加したこともあります。

筆者の場合は、特に指定がない限り KAWASHIMA Yoshiyuki に統一しています。

コミットに設定する名前はどんな時に役立つかというと、ローカルでコミットログを見る時、 IDE 上で Git Blame をした時などホストを介さないケースです。 いずれの場合も表示領域としては狭いことが多いので、アルファベット表記よりも、漢字の方がわかりやすさは勝る気がします。

筆者が日本人の姓名のローマ字表記について拠り所としているものとして、次のようなガイドラインがあります。

各府省庁が作成する公用文等において日本人の姓名をローマ字表記する際に,姓と名を明確に区別させる必要がある場合には,姓を全て大文字とし(YAMADA Haruo),「姓―名」の構造を示すこととする。[7]

したがって,日本人の姓名については,ローマ字表記においても「姓-名」の順(例えばYamada Haruo)とすることが望ましい。なお,従来の慣習に基づく誤解を防くために,姓をすべて大文字とする(YAMADA Haruo),姓と名の間にコンマを打つ(Yamada,Haruo)などの方法で,「姓-名」の構造を示すことも考えられよう。[8]

コミットにメールアドレスを設定する

メールアドレスはシンプルです。

特定の組織に属してコミットする場合は、所属組織ドメインのメールアドレスを発行してもらえるので、そのメールアドレスを設定します。前述の Git Setup にあるとおり、メールアドレスはリポジトリ単位で設定可能です。そのため、所属組織のリポジトリごとにメールアドレスを設定するなどして、複数の組織に所属する場合も個別に設定ができます。

ホストにメールアドレスを登録する

コミットに設定されているメールアドレスで GitHub 上では同一アカウントか認識しています。そのため、 Git に設定したメールアドレスを GitHub にも登録することで、コミットがアカウントと紐付いて表示されます。
以降は、コミットに設定した名前が GitHub 上で表示されることはなくなって、アカウント名とそのアイコンが表示されるようになります。GitHub 上でも複数のメールアドレスを登録できるので、複数の組織に所属するケースにも対応しています。

なお、 GitHub のアカウントを削除すると ghost という削除済みアカウントに変わるようです。[9] [10]

コミットにデジタル署名する

名前とメールアドレスは他の人でも設定できてしまうため、コミットのパーソナライズを担保するのは難しかったりします。[11]とはいえ、 OSS と異なり、組織に所属する場合、一定の基準があれば、その組織内での活動においては事実上担保されます。

名前とメールアドレスに関連付けるキーを用意し、この秘密鍵でコミットにデジタル署名し、公開鍵をホストに登録して、パーソナライズを担保しようとする試みになります。

ホストに公開鍵を登録する

デジタル署名されたコミットの公開鍵がホスト側に未登録の場合、 GitHub では Unverified とバッジ表示されます。未登録なので有効な署名であると見なされていないです。ホスト側に公開鍵を登録し、対になる秘密鍵でデジタル署名されたコミットに対して、 GitHub では Verified と表示されます。

おめでとうございます。

この段階で GitHub ではこのコミットが秘密鍵でデジタル署名されたものである、すなわち、秘密鍵を所持しているあなた自身のものであると証明してくれています。

なお、キーに設定したメールアドレスとコミットのメールアドレスが一致していない場合も Unverified と表示されます。

おわりに

ここまで読んでいただいてコミットの署名に対してその判断基準は得られたでしょうか。コミットは現代のプログラミングにおいてその変更履歴の最小単位になります。その単位に対して作者を特定できる仕組みを活用したいと筆者は考えています。

直近で xz v5.6.0/5.6.1 にバックドアが仕込まれてしまう問題がありました。[12]

デジタル署名によって、この問題が直接的に回避できたかはあやしいですが、その仕組みを利用してコミットの安全性を測れるように将来的にはなるのではと考えています。

そのための準備としても、コミットにデジタル署名しておくことは有意義であると筆者は考えています。

ゆめみ大技林

ゆめみ大技林 '24 に、この記事を掲載しています。 BOOTH から購入が可能です。無料配布になります。

https://booth.pm/ja/items/5701456

脚注
  1. 森博嗣著(1998).すべてが F になる, 講談社. ↩︎

  2. アンドリュー・ハント/デビッド・トーマス著, 村上雅章訳(2020). 達人プログラマー(第2版)-熟練に向けたあなたの旅-, オーム社. ↩︎

  3. 署名とは?記名との違いや契約書への記載方法を紹介 https://biz.moneyforward.com/contract/basic/2334/ ↩︎

  4. 落款(署名と押印)の基本 https://zenzine.jp/write/calligraphy/11184/ ↩︎

  5. 電子署名【electronic signature】デジタル署名 https://e-words.jp/w/電子署名.html ↩︎

  6. Git 1.6 使い始める - 最初の Git の構成 https://git-scm.com/book/ja/v2/使い始める-最初のGitの構成 ↩︎

  7. 公用文等における日本人の姓名のローマ字表記について https://www.kantei.go.jp/jp/singi/seimei_romaji/pdf/moshiawase.pdf ↩︎

  8. 国際化に伴うその他の日本語の問題 https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kakuki/22/tosin04/17.html ↩︎

  9. 個人アカウントを削除する https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-your-personal-account/deleting-your-personal-account ↩︎

  10. https://github.com/glideapps/quicktype/issues/17680 ↩︎

  11. Git でコミット作成者を偽装する方法/署名付きコミットでの対策 https://qiita.com/s6n/items/bb869f740a53a3bf169e ↩︎

  12. brew install xz installs the outdated version 5.4.6 instead of 5.6.1 https://github.com/orgs/Homebrew/discussions/5243 ↩︎

GitHubで編集を提案
株式会社ゆめみ

Discussion