🔒

その機密情報、大丈夫? git-secretsで機密情報をGitリポジトリにPushしないようにする

2023/06/11に公開

はじめに

たまにある話ですが、〇〇社の〇〇製品の機密情報がGitHubにPushされて、情報が流出してしまったというニュースを見たことがあります。
ほとんどの方が、機密情報を環境変数などにしていますが、万が一何らかのミスで機密情報をGitリポジトリにPushしてしまうと、大変なことになりますね。
本記事では、機密情報をGitリポジトリにPushしないようにするツールであるgit-secretsを紹介します。

git-secretsとは

git-secretsは、awslabsが開発しているツールで、機密情報をGitリポジトリにPushしないようにするためのツールです。

主な機能:

  • ファイルのスキャン:一つまたは複数のファイルをスキャンし、ファイルに秘密情報が含まれている場合、一致したテキストが標準出力に書き出される。

  • リポジトリの全修正履歴のスキャン:リポジトリの全修正履歴をスキャンし、ファイルに秘密情報が含まれている場合、一致したテキストが標準出力に書き出される。

  • 禁止パターンまたは許可パターンの追加:禁止または許可されたパターンを追加することで、検出された秘密情報のリストをカスタマイズできる。

インストール&初期設定

まずは、git-secretsをインストールします。

brew install git-secrets

インストールが完了したら、git-secretsを初期化します。

git secrets --register-aws --global

これで、git-secretsのインストールと初期設定が完了しました。

git-secretsの使い方

ファイルのスキャン

git-secretsを使って、ファイルをスキャンするには、以下のコマンドを実行します。

git secrets --scan

リポジトリの全修正履歴のスキャン

git-secretsを使って、リポジトリの全修正履歴をスキャンするには、以下のコマンドを実行します。

git secrets --scan-history

禁止パターンまたは許可パターンの追加

git-secretsを使って、禁止パターンまたは許可パターンを追加するには、以下のコマンドを実行します。

# 禁止パターンの追加
git secrets --add 'password ='

# 許可パターンの追加
git secrets --add --allowed 'password ='

検証

実際に、機密情報をGitリポジトリにPushしないようにするか、検証してみます。
まず、tmp.txtというファイルを作成し、aws_access_key_idとaws_secret_access_keyを書き込みます。

echo -e "aws_access_key_id = AKIA4GKMAS2DIJADUL24\naws_secret_access_key = 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" > tmp.txt

次に、git secrets --scanを使って、tmp.txtをスキャンします。

-> git secrets --scan
articles/8b7ebdd3a3555e.md:80:echo -e "aws_access_key_id = AKIA4GKMAS2DIJADUL24\naws_secret_access_key = 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" > tmp.txt
tmp.txt:1:aws_access_key_id = AKIA4GKMAS2DIJADUL24

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive

git secrets --scanを使って、tmp.txtをスキャンしたところ、aws_access_key_idとaws_secret_access_keyが検出されました。

次に、git secrets --scan-historyを使って、リポジトリの全修正履歴をスキャンします。

-> git secrets --scan-history
d78f49bd2c15954270f58d4c0ac857c09fba54dd:tmp.txt:1:aws_access_key_id = AKIA4GKMAD2OIJWDUL24
d78f49bd2c15954270f58d4c0ac857c09fba54dd:tmp.txt:2:aws_secret_access_key = 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

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive

git secrets --scan-historyを使って、リポジトリの全修正履歴をスキャンしたところ、aws_access_key_idとaws_secret_access_keyが検出されました。

まとめ

git-secretsを使うことで、機密情報をGitリポジトリにPushしないようにすることができます。
ただプロジェクトメンバーにgit-secretsをインストールしてもらう必要があるので、より簡単に機密情報をGitリポジトリにPushしないようにするには、GitHubのencrypted-secrets とGitHub Actionsを合わせて利用するのが良いと思います。

Discussion