SHALO AUTHでGitのコミットに署名する
SHALO AUTH は ログイン認証時の秘密鍵を簡単・安全に管理し。SSHやVPNに安全に接続できるソリューションです。業界標準の PKCS #11 や FIDO U2F / CTAP1 に対応しています。
Git ではリモートリポジトリへのサインイン認証に HTTPS や SSH 、アクセストークンが使われています。リポジトリのコミットに署名を付けることができ、署名のついたコミットは GitHub やGitLabで検証済みとしてマークされます。これによって他のユーザーはその変更が信頼できるソースであると確認できます。
今回は Git のコミットに SHALO AUTH で署名する方法を解説します。
コミット署名
以前まで Git のコミットは GnuPG (GPG)か S/MIME で署名していましたが、2021年11月にリリースされた Git 2.34 でコミットへのSSH 署名がサポートされました。
SSH は Unix 系 OS へのリモートログイン認証に広く使用され、Git でもリポジトリの認証に使われています。リモートターミナルへのログイン以外でも、ファイル転送やポートフォワーディングなどで間接的に使っている場合も多いです。
SSHでコミット署名できると次のようなシナリオで威力を発揮します。
SSH接続先のDockerコンテナや EC2 インスタンスから、SSH agent forwardingでホストPCのSSH鍵を使ってGitリポジトリにpush/fetch、コミット署名する。
この良い点は、SSH 鍵をホスト PC に保存するだけで済む点です。
インスタンス内に保存する必要は無いので重要なSSH鍵の流出する可能性が減ります。さらに SSH 鍵をSHALO AUTHに入れておけば、ホストPC に SSH 鍵を保存する必要もありません。
上で SSH 署名を推していますが GPG にも素晴らしい点があります。次の2点は秘密鍵の運用する上で重要な機能です。
- 鍵に有効期限を指定できる
- 鍵を失効できる
S/MIME は GPG と似ていますが、公的な認証局から鍵・証明書を発行してもらってそれを署名に使用します。署名は証明書チェーンを確認することで正当性を確認できます。ただし鍵・証明書の発行は大抵有償なので、個人で利用する人はそれほど多くありません。
コミット署名にGPGを使う場合、1つだけ注意があります。それはコミット時のローカルで設定しているメールアドレスに対応した GPG 鍵を作る必要がある点です。GitHubに登録したメールアドレスの GPG 鍵を使ったとしても、メールアドレス非公開(○○○@users.noreply.github.com)でコミット署名すると署名検証に失敗します。
これら3つの方法は良い面もそれほど良くない面ありますので、実際に試してみるといいかもしれません。
ここでは SSH とGPGで SHALO AUTH を使ってコミット署名する方法について解説していきます。
コミット署名の鍵を準備する
SSH を使用する場合、Git向けのSHALO AUTH環境を準備していない方はSHALO AUTH のユーザーマニュアルの『8章 SSH 認証で使う』に従って準備してください。そしてSHALO Keyringを使って SHALO AUTH に鍵を保存します。
1つの SSH 鍵をGitHubのSSH認証とコミット署名の両方の鍵として使用することもできます。
GnuPGを使う場合は、以下の記事を参考にしてSHALO AUTHとGnuPGを準備します。
PGP 鍵を作成する際に、ユーザー情報のメールアドレスにGit で使うメールアドレスを指定することに注意します。
GitHubに公開鍵を登録する
GitHubに公開鍵を登録するためにGitHubサインインし、右上のアイコンをクリックして [Settings] をクリックします。そしてウィンドウ内左の [SSH and GPG keys] をクリックします。
SSH鍵を登録する場合には、[New SSH Key] をクリックします。すると下の画像のように表示されます。オレンジで囲んだ Key typeフィールドは GitHub が SSH署名に対応する際に追加されました。
ここで次のようにします。
- Titleフィールドに鍵を識別する文字列を入力します。
- Key typeを “Signing Key” にします。
- KeyフィールドにSSH公開鍵をKeyフィールドにペーストします。
- 最後に[Add SSH Key]をクリックします。
SSH公開鍵は SHALO Keyring で鍵を選択して [SSH公開鍵をコピー] をクリックするとクリップボードにコピーできます。
GPG鍵を登録する場合には、[New GPG Key] をクリックします。すると下の画像のように表示されます。
ここで次のようにします。
- Titleフィールドに鍵を識別する文字列を入力します。
- KeyフィールドにGPG公開鍵をペーストします。
- 最後に[Add GPG key]をクリックします。
GPG公開鍵は次のようにすると表示されます。
$ gpg --list-secret-keys --keyid-format=long
sec> rsa4096/705BFE3F58EABA28 2023-06-19 [SCE]
65D5DB11957CB9C297452B34705BFE3F58EABA28
Card serial no. = 3131 5F500F55
uid [ultimate] SHALO Test <example@foo.bar>
$ gpg --armor --export 鍵ID
-----BEGIN PGP PUBLIC KEY BLOCK-----
~略~
-----END PGP PUBLIC KEY BLOCK-----
この例では、 rsa4096/ に続く 705BFE3F58EABA28 がGPG鍵IDです。
GPG公開鍵は、”BEGIN PGP PUBLIC KEY BLOCK”の行で始まり、”END PGP PUBLIC KEY BLOCK”の行で終わります。
登録すると次のように鍵が表示されます。この例ではSSH認証鍵、SSH署名鍵、GPG鍵が1つずつ登録されています。
git configの設定
git configで署名に使う鍵をあらかじめ指定します。
SSHの場合は以下の2つが必要です。
- gpg.format に ssh を指定します。
- user.signingkeyでSSH公開鍵のファイルパスを指定します。
$ git config --global gpg.format ssh
$ git config --global user.signingkey SSH公開鍵のファイルパス
SSH公開鍵のファイルは、1つのSSH公開鍵だけをテキスト形式で保存したファイルです。
GPGの場合は以下の2つが必要です。
- user.signingkeyで鍵IDを指定します。
- gpg.formatを解除します。
GitHubに登録した鍵 ID がわからなくなってもGitHubでGPG keysの一覧で確認できます。Key ID: に続く文字列が鍵 IDです。
$ git config --global user.signingkey 鍵ID
$ git config --global --unset gpg.format
GPG鍵のサブ鍵を指定する場合、鍵IDの最後に “!” を指定します。
$ git config --global user.signingkey 0123456789ABCDEF!
コミットに署名する
実際にコミットに署名しましょう。まず PC に SHALO AUTHを差します。
SSH鍵を使う場合は、shalo-addで ssh-agent にPKCS#11モジュールをロードしておきます。
ローカルブランチに変更をコミットする場合、次のように -S オプションを追加するだけ自動的に署名されます。
$ git commit -S -m "コミットメッセージ"
常にコミットに署名させる場合はgit config で commit.gpgsign に true を指定します。
GPG鍵を使用する場合はPIN入力を求められるので、SHALO AUTHのPINを入力してください。
コミットを作成したらGitHubのリモートリポジトリにプッシュします。
$ git push
GitHubのCommitsでプッシュしたコミットを確認しましょう。 コミットの右側が“Verified” とマークされています。これをクリックすると署名情報(GPG鍵IDやSSH公開鍵のFingerprint)がさらに表示されます。
あまり馴染みのないコミット署名ですが、最近サポートされた SSH 署名は思ったよりも簡単に導入できることに驚いたのではないでしょうか?
GitHubのウェブサインインにFIDO2要素認証、リモートリポジトリのSSH認証、コミット署名、リモートインスタンスへのログイン、これらすべてを1つの SHALO AUTHで簡単で安全に対応できます。ぜひ SHALO AUTH を活用してみてください。