Skip to content

認証済みコミット

traP Gitea に登録されている情報や開発履歴は部外秘の運用がなされていますが、GitHub 上の公開リポジトリなどで開発をしていると思わぬ情報が公開されてしまうことがあります。

コミットのメールアドレス

Git では、開発に関わった個人を見分ける ID としてメールアドレスの文字列それ自体が使われています。リポジトリにおけるコミットやその他の操作の履歴にはメールアドレスが埋め込まれ、リポジトリが公開されている場合はアドレスも公開されます。ただし、Git やホスティングサービスによってこのアドレスに自動的に何かが送られてくることはありません。

GitHub 上でリポジトリにコミットした人のアカウントを表示できればとても便利で安心です。ところがデフォルトではコミットに埋め込まれている個人の情報はメールアドレスしかないので、GitHub はこのメールアドレスを紐づけている GitHub アカウントを探索して見つかったものを「コミットしたユーザー」として表示します。GitHub で 1 つのメールアドレスを複数のアカウントに紐付けることができないのはそのためです。

ダミーメールアドレスの活用

メールアドレスの公開はリスクを生むので出来れば避けたいというニーズはありますが、ダミーのアドレスによる匿名コミットが横行するとそれはそれで開発の効率や安全性に差し障ります。このジレンマを解決すべく、GitHub は各ユーザーに ダミーのメールアドレス を提供しています。コミットに埋め込むメールアドレスをこれに変更することで、個人的に使っているメールアドレスの公開を避けつつ GitHub アカウントとコミットをしっかりと紐づけることができます。このメールアドレスはメールアドレスとしては機能しておらず、届いた一切のメールを見ることはできません。

ところで、コミットに埋め込むメールアドレスは前編 必要なツール の章で紹介した方法で自由に設定することができます。それがたとえ自分のメールアドレスでなかったとしても。先ほど述べた通り公開リポジトリのコミットのメールアドレスは漏れなく公開されているので、コピペして別のコミットに埋め込めば GitHub 上ではそのアドレスに紐づけられたアカウントが「コミットをしたユーザー」として表示されることになります。GitHub のアカウント自体を乗っ取らずとも、成り済ましコミットは想像よりずっと簡単にできてしまうというわけです。

流石にそれは宜しくないので、Git はコミットに GPG 署名と呼ばれる公開鍵暗号を活用した署名を埋め込むことを可能にしています。GPG 署名を使用する場合は SSH と同様に GitHub に公開鍵を渡し、ローカルに秘密鍵を秘匿しておきます。GPG 署名の設定方法に関する詳細は コミットに署名する をご覧ください。

公開鍵暗号とその用途

公開鍵暗号は関数 f を公開し f1 を秘匿した状態で、情報をこれらの関数に通すことで情報の保護や正統性の証明を可能にする技術です。ff1 はそれぞれ 公開鍵秘密鍵 と呼ばれています。

  • 外部に漏れないように情報を受信したい場合、f は暗号化関数、f1 は復号関数としてはたらきます。秘密鍵 f1 を秘匿する私が相手から安全に情報 a を受信したい場合、相手には公開鍵 f を用いて暗号化した情報 f(a)=a を送ってもらいます。この情報を復号できるのは秘密鍵 f1 を所持している私だけなので、情報 f1(a)=a を安全に受け取ることができます。

  • 公開鍵暗号は 署名 すなわち渡す情報の正統性の証明に用いることもでき、この場合秘密鍵 f1 が暗号化関数としてはたらきます。渡したい情報から固有に得られる値 bf1 で暗号化した f1(b)=b を署名として情報に添えて渡します。公開鍵 f によって確かに f(b)=b が成り立つことを相手に確認してもらい、秘密鍵を所持する本人であると証明することができます。

GPG 署名ではコミットの内容やコミットメッセージなどの情報全体をハッシュ関数にかけた値を b として署名に用います。GitHub はコミットに埋め込まれているメールアドレスに紐づいたアカウントを特定し、予めユーザーから受け取っている公開鍵 f にコミットの署名 b を通してコミット全体のハッシュ値 b と比べます。これらの一致が確かめられればコミットが真にそのユーザーによるものと証明され、GitHub 上でコミットに Verified マークがつけられます。