git-secretsでgit経由の情報漏洩を防ぐ


AWSの学習を始めたので、`git-secrets'で安全な運用ができるように
学習しました。忘れないようにまとめておきます。

git-secretsとは

Prevents you from committing passwords and other sensitive information to a git repository.

パスワードやその他センシティブな情報をコミットから貴方を守ります。
コミット時や任意のタイミングで、コミット内容やmessageに機密情報が含まれないかをチェックすることができます。
情報漏洩が何かと問題に上がる昨今、こういったツールで管理することは大切ですね。

インストール

$brew install git-secrets

コマンド概要(Synopsis)

git secrets --scan [-r|--recursive] [--cached] [--no-index] [--untracked] [<files>...]
git secrets --scan-history
git secrets --install [-f|--force] [<target-directory>]
git secrets --list [--global]
git secrets --add [-a|--allowed] [-l|--literal] [--global] <pattern>
git secrets --add-provider [--global] <command> [arguments...]
git secrets --register-aws [--global]
git secrets --aws-provider [<credentials-file>]

AWSのための初期設定

AWSに適した設定を行ってくれる専用のコマンドがあるので、これを入力します。

$ git secrets --register-aws --global

実際にどのような検査パターンになっているのでしょうか?
現在の検査パターンを知るには、 git secret --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

secrets.patternsで検査されたものは弾かれ、secrets.allowedで指定されたものは特別に許可する、というものになっています。


詳しい設定内容はこちら・AWS Access Key IDと思われるもの (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
・AWS Secret Access Key の割り当てと思われるもの。 任意の引用符で囲まれた ":" または "="
・AWS account ID の割り当てと思われるもの。任意の引用符で囲まれた ":" または "="
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)
・ ~/.aws/credentials で指定されたもの
が弾かれて、
・サンプルとして割り当てられたAWS keyのパターンの許可(AKIAIOSFODNN7EXAMPLE そして
が許可される設定となります。

--globalをつけることで、ユーザーの共通設定となります。

$ git secrets --install ~/.git-templates/git-secrets

リポジトリ用のgit hooksを~/.git-templates/git-secretsにインストールします。

$ git config --global init.templatedir '~/.git-templates/git-secrets'

インストールしたテンプレートをconfigで設定します。

これでAWSに関しては基本的なところはコミットしても弾かれるようになります。🎉

その他コマンド

scan

指定したファイル/フォルダを検査してくれます。
commitはしないけどチェックしたい、といった場合に有効ですね。

$ git secrets --scan test.txt // ファイルの検査
$ git secrets --scan testDir // ディレクトリの検査 
$ git secrets --scan -r testDir // 再帰的にディレクトリを検査

scanするファイルは git ls-filesでリストアップされるものだけが対象なので、.gitignoreに書かれているファイルなどは
対象外です。便利。
ちなみに、 --no-indexオプションをつけると、gitファイルでなくても検査してくれます。

scan-history

過去のコミット履歴を検査してくれます。
途中でgit-secretsを導入した場合などに活躍します。

$ git secrets --scan-history

add

禁止、許可する正規表現パターンを追加できます。

$git secrets --add "secret\s*=\s*"

SourceTreeでの操作

【追記】
SourceTreeでgit-secretsをインストールした状態で何か操作をしようとすると、

git: 'secrets' is not a git command. See 'git --help'.

というエラーが出てしまいます。
これを解決するには、

  • git実行プログラムと同じ階層にgit-secrets実行プラグラムをおく(もしくはシンボリックリンクを貼る)
  • soureTreeのgit実行プログラムを同じ階層に貼る。

で解決できます。

#gitの場所
$ which git
/usr/bin/git  

#git-secretsの場所
$ which git-secrets
/usr/local/bin/git-secrets 

in #実行プログラムを同じ階層にコピー 
cp /usr/bin/git /usr/local/bin

*もしMacで権限エラーなどが出る場合は、SIPが有効になっている可能性があります。
【上級者向け】System Integrity Protection (SIP) を無効にする方法

そして、SourceTreeの【環境設定】->【Git】->【システムのGitを使用する】で、
gitのパスを指定しましょう。(ここでは/usr/bin/git)

参考文献

実践Terraform AWSにおけるシステム設計とベストプラクティスbインプレスR&D 三省堂書店オンデマンド
git-secretsはじめました
AWSアクセスキーをGitリポジトリに混入させないために git-secrets を導入した
クラウド破産しないように git-secrets を使う