Githubコミットのなりすまし防止

オフショア開発

CRAIDでブリッジエンジニアをしているKakeyaです。以前同じチームで一緒に働いていたエンジニアのRaymondさんが投稿した記事の翻訳記事になります。

こちらが元記事になりますので是非読んでみてください。
翻訳元記事(オフショア子会社Fullspeed Technologies Inc.の技術ブログ)


GitHubで使用しているメールアドレスを知っている人が、あなたになりすましてプッシュを行うことができることをご存知でしたか?

これはGitHubのセキュリティ欠陥ではありません。これはGitの設計そのものです。Gitはもともと、中央に一つのリポジトリを持たない分散型のバージョン管理システムとして作られています。しかし、習慣を変えるのは難しく、多くの企業は自社の資産をしっかり管理したいと考える傾向があります。そのため、分散型システムを中央集権化する動きがGit上で生まれました。Gitの元々の設計では、信頼できる相手からのみデータの取得(プル)や、データの送信(プッシュ)を行うことが前提となっており、信頼できる相手は慣習に従うことに同意しやすいです。

TLDR;

公式のGitドキュメントには、GPGを使用してコミットに署名するための包括的なガイドがあります。

コミットに署名する必要性

なぜ署名するのか?それは、誰でもあなたが使用する1つか2つのメールアドレスを知っていれば、あなたになりすましてコミットを行うことができるからです。これにより、悪意のある個人があなたの名前とメールアドレスを使って低品質または悪意のあるコードを提出する可能性があります。

前提と要件

前提

この記事では、MacOSを使用しており、Terminal.appを通じてコマンドを実行することに慣れていることを前提としています。

Linux、WSL、Android、BusyBoxを使用している場合、以下のインストールはこの記事の範囲外です。

  • Git Credential Manager (GCM)
  • GPG
  • pinentry

ただし、apt、yum、rpm、dpkg、*pkg、dnf、synaptic、pacman、portageなどの対応するパッケージマネージャーを使用して簡単にインストールできるはずです。

インストール要件

brew install git git-credential-manager gpg pinentry pinentry-mac

GitHubの設定 1

「GitHubの設定1」と名付けた理由は、もちろん「GitHubの設定2」が存在するからです。この記事のステップは、読み進めるにつれて必要な情報を順番に提供するように構成されています。

このステップでは、GitHubアカウントを設定し、GitHubが提供するメールアドレスを使用できるようにします。これは、Gitリポジトリを解析するスクリプトが私たちのメールアドレスを収集してスパムやフィッシング攻撃に晒すのを防ぐために重要です。また、これはGitのコミットを保護・安全に保つための一部です。

https://github.com/settings/emails にアクセスし、ページ内に表示されている @users.noreply.github.com を見つけます。このメールアドレスを次のステップで使用するためにメモしておきます。これを「GitHubのプライベートメール」といいます。

「メールアドレスを非公開にする(Keep my email addresses private)」と「コマンドラインからのプッシュでメールアドレスが公開されるのをブロックする(Block command line pushes that expose my email)」のチェックボックスがオンになっていることを確認します。

GPGキーの生成

コミットに署名するにはSSHキーまたはGPGキーが必要です。ここではGPGキーを使用します。

gpg --full-generate-key

デフォルトまたはECC(署名と暗号化)、Curve 25519、1年の有効期限を選択します。期限を設定することを強くお勧めします。例えば、年末までなど。

必要な情報を入力し、GitHubが提供するプライベートメールアドレスを使用することを確認します。これは https://github.com/settings/emails@users.noreply.github.com のパターンを確認できます。
再度、「メールアドレスを非公開にする」と「コマンドラインからのプッシュでメールアドレスが公開されるのをブロックする」のチェックボックスがオンになっていることを確認します。

設定が完了したら、生成したキーをエクスポートし、GitHubにどのキーが自分を証明するかを伝える必要があります。まず、キーIDを取得します。

gpg --list-keys --keyid-format long

キーIDは通常 pub ed25519/ の後に表示されます。このキーIDをコピーし、以下のコマンドを実行します。

gpg --export --armor {キーID}

ターミナル内のテキストをコピーするか、以下のように pbcopy を使用してクリップボードにエクスポートされたデータを送ります。

gpg --export --armor {キーID} | pbcopy

GitHubの設定 2

キーがクリップボードにコピーされたので、GitHubにGPG公開キーを登録して、署名したコミットを検証できるようにします。

ブラウザで https://github.com/settings/keys を開き、「New GPG key」ボタンをクリックします。コピーしたキーを貼り付けます。

Gitの再設定

GPG署名キーの使用

Gitに署名キーを使用するように設定します。

git config user.signingkey {キーID}

プライベートメールの設定

このタイミングで、Gitがビジネス用のメールを使用しないように再設定するのも良いでしょう。リポジトリはスキャンされ、有効なメールアドレスのスパムやフィッシングのソースになる可能性があります。

git config user.email {github_provided_username}@users.noreply.github.com

署名アプリケーションの設定

GPGアプリケーションのパスを which コマンドで見つけます。

which gpg

返ってきたパスをコピーし、Gitに gpg.program として設定します。例えば、パスが /opt/homebrew/bin/gpg の場合、以下のコマンドを実行します。

git config gpg.program /opt/homebrew/bin/gpg

または、バッククォートを使用してコマンドの出力を引数として使用します。

git config gpg.program `which gpg`

シェルにGPGを認識させる

使用しているシェルが異なるため、ターミナルで一般的に使用される2つのシェルに対応するために、以下のコマンドを実行します。

current_shell=`ps -p $$ | awk 'FNR == 2 {print}' | awk '{print $4}'`; if [[ $current_shell == '-bash' ]]; then echo 'export GPG_TTY=$(tty)' >> ~/.bashrc; elif [[ $current_shell == '/bin/zsh' ]]; then echo 'export GPG_TTY=$(tty)' >> ~/.zshrc; fi

上記のコマンドは、現在のシェルがbashかzshかを確認し、GPG_TTY 環境変数を設定します。これにより、GPGを呼び出す際に適切に動作します。

環境変数の再読み込み

シェルの設定ファイルを再読み込みして、新しい環境変数を有効にします。

bashを使用している場合:

source ~/.bashrc

zshを使用している場合:

source ~/.zshrc

これにより、GPG_TTY 変数が環境変数として利用可能になります。

別の方法として、ターミナルを閉じて再度開くことで設定ファイルを再読み込みさせることもできますが、これは他のエンジニアを混乱させる可能性があるため注意が必要です。

新しいコミットに署名する

新しいコミットに署名するには、単に -S オプションを追加してコミットします。

git commit -S -m "このコミットは設定された署名キーで署名されます"

コミットを自動署名する

コミットごとに -S を追加する手間を省くため、Gitに常にコミットを署名するように設定します。

git config commit.gpgsign true

これで、commit.gpgsigntrue に設定されているため、すべてのコミットが自動的に署名されます。

複数のプロジェクト、メール、キー

複数のプロジェクトやメールアドレス、キーやマシンを使用している場合は、各ローカルプロジェクトリポジトリで git config--local オプションを使用して設定を行うことができます。



オフショア開発ならCRAID!

オフショア開発とは、システム開発業務などを海外の開発会社や海外子会社に委託することです。

CRAIDは東証プライム上場のフリービット株式会社の子会社です。CRAIDのオフショア開発拠点「フルスピードテクノロジーズ」は、当初は月間3000億ものリクエスト処理にも対応できる自社システム開発を行うためのオフショア開発部門として始まりました。各グループ会社の開発やクライアント様の受託開発やラボ型開発も多く手掛けております。

CRAIDやオフショア開発に関して、お気軽にお問い合わせください。

この記事を書いた人

エンジニア3年目です。
バックエンドとインフラやってます。

Kakeyaをフォローする
オフショア開発開発手法
CRAID オフショア開発ブログ
タイトルとURLをコピーしました