概要
- コミットは簡単になりすましができてしまう
- なりすまし防止のためコミットに署名することができる
- おすすめはSSH鍵を用いた署名
- GitHubのSSH認証に用いている鍵を使い回せるため
- コミットを署名&GitHubで検証できるようにして、Verified マークをつけよう
背景
コミットは偽装できる
こちらの記事で紹介されているように、Gitのコミットは ユーザー名とメールアドレス さえわかれば、簡単に他人がコミットを行ったかのように偽装できてしまいます。
これでは悪意のある人が、信頼されているユーザーになりすまして悪意のあるコードをコミットすることができてしまいます。
コミットに署名してなりすましを防ぐ
なりすましを防ぐため、Gitにはコミットに署名して検証する仕組みがあります。
署名したコミットをGitHubにプッシュするとGitHub側で検証され、正しく検証された場合は以下のように Verified マークがつきます。
GitHubのブランチ保護ルールでは検証済みのコミットのみをマージできるルールを設定することもできるので、より強固になりすましを防止できます。
SSH鍵を使ってコミットに署名する
ここから本題です。
コミットに署名するには以下の方法があります。
- GPG
- SSH
- S/MIME
この中でもおすすめは SSH です。
理由として、GitHubへの接続にSSH認証を使用している場合、そのSSH鍵をコミット署名に再利用できるためです。
本記事では SSH を使って署名する方法を紹介します。
注: SSH 署名の検証は、Git 2.34 以降で利用できます。
以下の順に行っていきます。
- 新しい SSH キーを生成する
- GitHub アカウントに SSH 署名キーを追加する
- Git へ署名キーを伝える
- コミットに署名する
新しい SSH キーを生成する
まずはSSHキーを作成します。
すでにSSH認証を使用している場合はこの手順をスキップできます。
ssh-keygen -t ed25519 -C "your_email@example.com"
以下が出てきた場合はそのまま Enter キーを押します。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
パスフレーズはここではなしで進めます。
以下が出てきたらそのまま Enter キーを押します。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
よりセキュアに利用するにはパスフレーズを設定することをおすすめします。
通常パスフレーズを設定すると秘密鍵を使用するたびにパスフレーズの入力が求められますが、ssh-agent
を利用することで毎回の入力を回避することができます。
詳しくは以下の記事を参照してください。
これでSSH鍵を作成できました。
Enter file in which to save the key
で指定したディレクトリに秘密鍵と公開鍵の2つのファイルが作成されます。
root@1f9727978628:/# ls ~/.ssh
id_ed25519 id_ed25519.pub
GitHub アカウントに SSH 署名キーを追加する
続いてコミット署名検証用の公開鍵をGitHubに登録します。
- 公開鍵をコピーする
cat ~/.ssh id_ed25519.pub
- GitHubの設定を開く
- SSH and GPG keys を開く
- New SSH key をクリックする
- Title には任意の名前をつける
- Key type は Signing Key を選択する
-
Key に先ほどコピーした公開鍵の中身を貼り付ける
このとき、改行などが含まれないように注意する
- Add SSH keyをクリックする
これでGitHub側の設定は完了です。
Git へ署名キーを伝える
コミット時に先ほど作成したSSH鍵で署名するようにGitの設定をします。
- コミットの署名にSSHを使うよう設定
git config --global gpg.format ssh
- GitにSSH署名キーを設定
git config --global user.signingkey ~/.ssh/id_ed25519.pub
~/.gitconfig
を直接編集する場合は以下のようにします。
[gpg]
format = ssh
[user]
signingkey = /root/.ssh/id_ed25519.pub
name = Your Name
email = your_email@example.com
コミットに署名する
コミット時に署名するには -S
フラグをつけます。
git commit -S -m "update README.md"
GitHubにプッシュして、Verified マークを確認します。
リポジトリのページを開き、Commits をクリックすると確認できます。
毎回 -S
オプションをつけずとも、デフォルトでコミット署名を設定することもできます。
下記コマンドを実行するか、~/.gitconfig
に以下を追記します。
git config --global commit.gpgsign true
[commit]
gpgsign = true
参考記事