
こんばんは。
今日は、Gitリポジトリに機密情報などの登録を防ぐgit-secrets
の導入について、まとめてみました。
なぜgit-secretsなのか
Webアプリケーション制作のカリキュラムの中で、AWS(Amazon Web Services)のS3というストレージサービスについて学んでいるのですが、このS3にアクセスするためのAccess key ID
とSecret access key
はソースコードに直接記載してはいけないと強く書かれていました。
その理由は、、、
- 本番環境へデプロイするために、GitHubのRemote RepositoryにPushする必要がある。
- Remote Repositoryは基本的に外部から閲覧可能な状態である。
- つまり、悪意あるユーザーがAccess key IDとSecret access keyを使ってAWSのサービスを不正利用する危険性がある。
ということでした。
この文面だけみたら、「ははぁ、危険なんだなぁ」程度の認識でしたが、不正利用の実態を記した記事を読んでゾッとしたので、今回のテーマに取り上げました。
初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 – Qiita要するに、情報漏洩により「仮想通貨マイニング」などに利用されてしまい、AWSのS3は「使った分だけの費用請求」となることから、多額の請求を受けてしまうということです。
git-secretsの働き
機密情報をコードに書いてはいけないと頭ではわかりました。でも、どんなに気をつけていてもPushしてしまう可能性はゼロではありません。
そんなヒューマンエラーを防いでくれるのが、AWSが公開しているツールのgit-secretsです。
- commit時に、事前に設定された正規表現にマッチする情報が含まれていたら、そのcommitを取り消す。
- 任意のタイミングで、ファイルやディレクトリをスキャンすることもできる。
git-secretsのインストール
macOSのHomebrewを経由してインストールします。
$ brew install git-secrets
導入できたら、設定を適応したいアプリケーションのディレクトリに移動して、git-secretsを有効化します。
$ git secrets --install
git-secretsの制限条件を設定
ターミナルで下記コマンドを実行すると、AWS関連の秘密情報を一括で設定してくれます。これにより、このRepositoryでgit commitコマンドを実行した際に、AWSの秘密情報を含んでいないかチェックしてくれるようになりました。
% git secrets --register-aws --global
具体的にどんな制限が設定されているのか見てみましょう。
% git secrets --list
secrets.providers git secrets --aws-provider
secrets.patterns [A-Z0-9]{20}
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
正規表現にあまり明るくないですが、
- SECRETやACCESSという文字列+半角英数字の羅列
- AWS+ACCOUNT_ID+半角英数字の羅列(これはARNのことでしょうか)
が制限されているということで、AWSに関わる秘密情報はカバーできてそうです。
以降作成するすべてのRepositoryに、git-secretsが適応されるようにするには、以下コマンドを実行します。
% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'
まとめ
簡単ではありますが、git-secretsの導入についてまとめてみました。
冒頭に紹介した記事のとおり、機密情報のpushがどれだけ恐ろしいことか、理解できました。
git-secretsは必ず導入してから、開発を行いたいと思います。