GitHubやGitLabなどインターネット上のソースコードホスティングサービスが人気を集めています。
これらのサービスには、サーバーの管理が必要ないという利点がありますが、うっかりパブリックリポジトリにソースコードを公開してしまうと、中に含まれる機密情報が全世界に知られてしまうという危険性も持っています。
特にAWSのアクセスキーなど各種有料サービスを利用するための認証情報が流出すると、悪意のユーザーに不正に使用されて、クラウド破産につながる危険性さえ存在するのです。
本日紹介する「git-secrets」はこのような機密情報の漏洩を事前に防ぐための専用ツールです。
認証情報のパターンに一致するテキストがソースコードに含まれている場合、gitのコミットを防ぐことで、リポジトリに危険な情報が入り込むことを事前に防いでくれます。
以下使用方法を説明します。
git-secretsの使用方法
git-secretsは単なるシェルスクリプトです。「git-secrets」ファイルをパスが通ったディレクトリにコピーするだけでインストールが完了しますが、以下のコマンドを使うのが正式とされています。
git clone https://github.com/awslabs/git-secrets.git cd git-secrets make install
MacでHomebrewを使っている場合、以下の方法も使用可能です。
brew install git-secrets
実際に使い始めるにはgitリポジトリ内で「git secrets --install」を実行する必要があります。
cd /path/to/my/repo git secrets --install git secrets --register-aws
この状態で例えば、以下の機密情報を含むsecret.txtを作成します。
aws_secret_access_key = WJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
git commitを実行するとエラーで弾かれることがわかります。
$ git commit -a secret.txt:1:aws_secret_access_key = WJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY [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 --no-index
現在の設定は「git secrets --list」コマンドで確認できます。
$ git secrets --list secrets.providers git secrets --aws-provider secrets.patterns (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16} secrets.patterns ("|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)("|')?\s*(:|=>|=)\s*("|')?[A-Za-z0-9/\+=]{40}("|')? secrets.patterns ("|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?("|')?\s*(:|=>|=)\s*("|')?[0-9]{4}\-?[0-9]{4}\-?[0-9]{4}("|')? secrets.allowed AKIAIOSFODNN7EXAMPLE secrets.allowed wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
すなわち、先ほど実行した「git secrets --register-aws」で、AWS用のデフォルトの除外パターン「secrets.patterns」および「secrets.allowed」が組み込まれていたことがわかります。
もちろん手動で除外パターンを追加することもできます。
git secrets --add --global '[A-Z0-9]{20}'
その他、除外設定をリポジトリ単位ではなく、全てのリポジトリで有効にしたり、gitの履歴を含めて機密情報をチェックしたりといった動作も可能です。
詳しくは公式サイトでご確認ください。
まとめ
git-secretsを利用すればgitリポジトリに機密情報が紛れ込むのを防ぐことができます。AWSや各種サービスの認証情報、DBやシステムのパスワードが流出するのを防ぎたい方は試してみることをおすすめします。