LoginSignup
20
9

概要

  • コミットは簡単になりすましができてしまう
  • なりすまし防止のためコミットに署名することができる
  • おすすめはSSH鍵を用いた署名
    • GitHubのSSH認証に用いている鍵を使い回せるため
  • コミットを署名&GitHubで検証できるようにして、Verified マークをつけよう
    Untitled-1.png

背景

コミットは偽装できる

こちらの記事で紹介されているように、Gitのコミットは ユーザー名とメールアドレス さえわかれば、簡単に他人がコミットを行ったかのように偽装できてしまいます。
これでは悪意のある人が、信頼されているユーザーになりすまして悪意のあるコードをコミットすることができてしまいます。

コミットに署名してなりすましを防ぐ

なりすましを防ぐため、Gitにはコミットに署名して検証する仕組みがあります。

署名したコミットをGitHubにプッシュするとGitHub側で検証され、正しく検証された場合は以下のように Verified マークがつきます。

image.png

GitHubのブランチ保護ルールでは検証済みのコミットのみをマージできるルールを設定することもできるので、より強固になりすましを防止できます。

image.png

SSH鍵を使ってコミットに署名する

ここから本題です。

コミットに署名するには以下の方法があります。

  • GPG
  • SSH
  • S/MIME

この中でもおすすめは SSH です。
理由として、GitHubへの接続にSSH認証を使用している場合、そのSSH鍵をコミット署名に再利用できるためです。
本記事では SSH を使って署名する方法を紹介します。

注: SSH 署名の検証は、Git 2.34 以降で利用できます。

以下の順に行っていきます。

  1. 新しい SSH キーを生成する
  2. GitHub アカウントに SSH 署名キーを追加する
  3. Git へ署名キーを伝える
  4. コミットに署名する

新しい 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に登録します。

  1. 公開鍵をコピーする
    cat ~/.ssh id_ed25519.pub
    
  2. GitHubの設定を開く
  3. SSH and GPG keys を開く
  4. New SSH key をクリックする
  5. Title には任意の名前をつける
  6. Key typeSigning Key を選択する
  7. Key に先ほどコピーした公開鍵の中身を貼り付ける

    このとき、改行などが含まれないように注意する

  8. Add SSH keyをクリックする

これでGitHub側の設定は完了です。

Git へ署名キーを伝える

コミット時に先ほど作成したSSH鍵で署名するようにGitの設定をします。

  1. コミットの署名にSSHを使うよう設定
    git config --global gpg.format ssh
    
  2. GitにSSH署名キーを設定
    git config --global user.signingkey ~/.ssh/id_ed25519.pub
    

~/.gitconfigを直接編集する場合は以下のようにします。

~/.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 をクリックすると確認できます。

Untitled.png
Untitled-1.png

毎回 -S オプションをつけずとも、デフォルトでコミット署名を設定することもできます。

下記コマンドを実行するか、~/.gitconfigに以下を追記します。

git config --global commit.gpgsign true
~/.gitconfig
[commit]
    gpgsign = true

参考記事

20
9
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
20
9