その機密情報、大丈夫? git-secretsで機密情報をGitリポジトリにPushしないようにする
はじめに
たまにある話ですが、〇〇社の〇〇製品の機密情報が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