15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

なりすまし防止!Githubへの署名付きコミット

Last updated at Posted at 2020-05-18

 こんにちは!バイオインフォマティクス系オタク修士学生のroadricefieldです!今日はGithub上で各コミットを本当に自分が行ったということを証明するお話です。

何が起きたのか

 僕は気づいてしまったんです... ホームディレクトリの.gitconfigのメールアドレスを誰かがGithubアカウントに登録しているメールアドレスに書き換えると以降の自分のすべてのコミットをその誰かのアカウントが行ったとGithub上では表示されることに...

.gitconfig
[user]
        email = <Email address>
        name = <User name>

 ほんとなんです!!気になる君はお友達とやってみよう!お友達がいない君は新しいGithubアカウントおともだちを作ってやってみよう!

 これを利用すれば他人を陥れることが可能なのではないかと心配になりました。

Github文庫『それでも僕はコミットしてない』

 完全自立型介護ロボット「MIRAI」の制御プログラムの開発は終盤に差し掛かっていた。

「おれ、この案件が終わったら彼女にプロポーズしようと思うんだ」

 そう隣で誰も聞いてもいないのに語り始めたのは僕の同期、E君だ。彼はとても優秀で次の人事での昇進は確実だと言われている。おまけにとてもかわいくてやさしい彼女がいて、E君の人生は順風満帆だった。

◇◇◇

 「MIRAI」は無事発売され、全国の介護施設で運用がスタートした。売れ行きはとても良く、僕たちの会社はまたたく間に成長し、数年後には業界トップになった。「MIRAI」への貢献が大きいE君は若くして部長に就任した。社員の給料もどんどん上がり、独身貴族の僕もウハウハだった。

◇◇◇

 僕たちの幸せな日々はそう長くは続かなかった。「MIRAI」による事故が全国で多発し始めたのだ。突如天国から地獄に叩き落された会社は必死に原因を究明した。その結果、「MIRAI」の制御プログラムに外部からの通信により誤作動を起こす仕組みが発見され、すぐさまGithubのコミットログが調べられた。

 その部分を書いてコミットしていたのはE君だった。E君は全く知らない、誰かに仕組まれたと主張したが残念ながら誰もE君を信じようとはしなかった。

「それでも僕はコミットしてない」

 E君は最後にそう言い残して会社をやめていった。

◇◇◇

 E君は事あるごとに僕を見下すような発言をする人だった。しかも僕の彼女を奪って挙句の果てには僕の隣でプロポーズを宣言しやがった。僕はあの日、E君に復讐しようと誓った。

$ cd
$ vim .gitconfig

 僕はターミナルにそう打ち込んで.gitconfigを編集する。

.gitconfig
[user]
        email = E-kun@qiitasoft.com
        name = E-kun

 :wqで保存してそのまま事前に用意していたあのソースコードをプッシュする。

$ git push origin master

 プッシュするときのユーザー名とパスワードは自分のを入力すればいい。ブラウザでコミットログを調べるとたしかにE君がコミットしたことになっていた。こまめにコミットするE君は一個だけ身に覚えがない自分のコミットがあることに気づかない。これで僕の完全犯罪が成立した。さて、いつ破滅させてやろうか...

E君のようにならないためには

 実際にこんなことが起きたらたまったものではないので自分がコミットをしたんだということを証明できるようにしたいところです。Githubにはコミットに署名をしてそれを検証してくれる機能があります。この記事ではWSL (Windows Subsystems for Linux)でのその一連の操作を紹介します。

GPGキーの作成

 まず署名に使用するGPGキーという鍵を作成します。

$ gpg --full-generate-key

 これを入力すると以下のようなメッセージが表示されます。

gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?

 defaultで良いようなのでなにもせずにEnterを押します。

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)

 Githubによるとここは4096 bitにしてほしいらしいので4096と入力してEnter

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)

 キーの有効期限。無期限でいいと思います。もし指定する場合は数字を入力してください。何もせずにEnter

Key does not expire at all
Is this correct? (y/N)

 yと入力してEnter

GnuPG needs to construct a user ID to identify your key.

Real name: E-kun
Email address: E-kun@qiitasoft.com
Comment:

 情報を入力してください。このとき、Email addressには.gitconfigに書いているものを入力してください。Commentには何か入力してもいいですし、何も書かなくてもいいです。鍵は複数作れるようなのでもし失敗したらもういちど作り直してください。入力したらEnter

You selected this USER-ID:
    "E-kun (dammy) <E-kun@qiitasoft.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

修正したいところがなければOと入力してEnter

 次に、パスフレーズの登録を求められます。少なくとも一文字は数字を含める必要があるようです。

 パスフレーズの入力が終わったら、

$ gpg --list-secret-keys --keyid-format LONG

すると

/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot 
ssb   4096R/42B317FD4BA89E7A 2016-03-10

このような出力を得ます。この例はGithub公式のものをお借りしました。secから始まる行の/の後、この例で言うところの3AA5C34371567BD2がキーIDと呼ばれるものだそうです。

 GPGキーを出力します。

$ gpg --armor --export 3AA5C34371567BD2

3AA5C34371567BD2は自分のキーIDに置き換えてください。すると「この画像の中であなたが最初に見つけた5つの言葉があなたの人生を表すキーワード」みたいなのがでてくるので-----BEGIN PGP PUBLIC KEY BLOCK-----で始まり、-----END PGP PUBLIC KEY BLOCK-----で終わる部分をコピーしてください。

作ったGPGキーをGithubアカウントに登録する

 Githubに自分のアカウントでログインして右上の自分アバターをクリック -> Settings -> 左のメニューの中のSSH and GPG keysをクリック -> New GPG keyをクリック -> 出てきたwindowに先程のGPGキーをペースト -> Add GPG keyをクリック

 これでアカウントへのGPGキーの登録はおしまいです。

Gitに署名用のGPGキーを登録する

 ターミナルに戻って

$ git config --global user.signingkey 3AA5C34371567BD2

を実行します。3AA5C34371567BD2は自分のキーIDに置き換えてください。もし忘れた場合はもう一度

$ gpg --list-secret-keys --keyid-format LONG

で表示してください。

WSLだけ?で必要だった謎操作

 私のWSL環境では以下をホームディレクトリの.bash_profile.bashrcに書き加える必要がありました。

export GPG_TTY=$(tty)

このあと先程登録したパスフレーズの入力を求められるのですがこれをやっておかないとその入力画面が立ち上がらず、失敗するようです。(謎)$ source .bash_profileかWSLを再起動するのを忘れないでください。

署名付きでコミットする

 署名付きでコミットするにはコミットの際に-Sオプションを付け足すだけです。

$ git commit -m "Verify test" -S

先程のパスフレーズの入力を求められます。

$ git push origin <branch名>

 プッシュしたらブラウザでコミットログを確認してください。

verified.PNG

 このようにVerifiedと表示されていればそのコミットは署名付きになっています。確かにあなたがコミットしており、なりすましではないことが保証されているという形になります。

引用

 この記事は以下のGithub公式での説明を再構成して書いたものです。

 さらにWSL特有(?)の問題の解決法は以下で見つけました。

15
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?