13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsでgit-secretsを利用する

Last updated at Posted at 2021-10-13

git-secretsAWS Labsで提供されているツールの一つです。

AWS Labsはawsが提供しているツールなりスクリプトなりが置いてある場所

git-secretsを利用する事により、AWSアクセスキー、AWSシークレットキーをgitリポジトリにコミットできないようにコミット直前にチェックできるようになります。

他にもファイルを検索したり、独自のルールを設定したい色々と機能があります。

今回はそんなgit-secretsをWindows環境にインストールして利用してみます。

余談

git-secretsって昔はREADMEにWindows環境へのインストール方法が書いてなくてWindowsで使えないのかと思ってましたが。

Writing instructions for how to get git-secrets to work for Windows #87

上記でWindows環境への導入方法が追加されてから、今現在はインストール用のPowerShellスクリプトも用意されています。

Windows環境にgit-secretsをインストールしてみる

Installing git-secrets - Windows

インストール用のPowerShellスクリプト(install.ps1)が用意されているのでコチラを実行します。
前提条件としてgitがインストールされていて、PowerShellスクリプトが実行できるようになっている必要があります。

下記のコマンドをPowerShellで実行して下さい。

【PowerShell】git-secretsのインストール
git clone https://github.com/awslabs/git-secrets
# このスクリプト。install.ps1があるディレクトリをカレントディレクトリにして実行しないと動かないのでcdする。
cd git-secrets 
./install.ps1

スクリプトが正常終了すればインストールは完了です。

ちなみにスクリプトが何をやっているかといえば、

%USERPROFILE%/.git-secretsgit-secretsgit-secrets.1をコピーして、%USERPROFILE%/.git-secretsを環境変数PATHに追加しています。

git-secretsを利用できるようにリポジトリにgit hookを設定する

git-secretsをインストールしただけではコミット時に認証情報が含まれているかチェックしてくれない状態です。

これはgit-secretsgit hookの機能を利用してチェックをおこなっているためです。

チェックするためには、対象となるリポジトリにgit hookをインストールする必要があります。

ここではcheck-repというリポジトリを作成して、このリポジトリに対してgit hookをインストールしてAWSシークレットキーがコミットされたかチェックしてみます。

まずはリポジトリにgit hookをインストールして、git secrets --listgit secretsの設定を確認してみます。

【PowerShell】リポジトリの初期化とgithookのインストール
# gitリポジトリの初期化
git init check-rep
cd ./check-rep 

# git hookのインストール
git secrets --install

# aws認証情報用のパターンをgitconfig(ローカル)に書き込み)
git secrets --register-aws

# リポジトリに設定されているsecretsのconfigを表示
git secrets --list

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 config --local --listを見ればみつかります。
眺めているとなんとなく想像はつきますが、アクセスキー、シークレットキーと判断するためのパターンが設定されています。

一点注意なのは、よくドキュメントでサンプルとして利用されている

  • アクセスキーAKIAIOSFODNN7EXAMPLE
  • シークレットキーwJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

secrets.allowedとして許可設定に含まれているため。

git secretsの動作を確認する用途として、このサンプルアクセスキーを利用してしまうと。
許可設定されているので普通にコミットできてしまう点は認識しておく必要があります。

git hookを設定したリポジトリにシークレットキー(サンプル)をコミットしてみる

先程、AWSアクセスキーシークレットキーを判断するパターンを確認しました。
この条件に引っかかるようなシークレットキーをファイルに書き出してコミットしてみます。

※今回は"aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample"

【PowerShell】シークレットキーをコミットする
# さきほど設定したリポジトリにサンプルファイルを作成
New-Item -Name ./secret -Value "aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample"

git add ./secret
git commit -m test

git commit を実行した段階で下記のエラーが表示されてgit commit が阻害されている事がわかります。

コミット時のエラーメッセージ
[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のAWSアクセスキーとシークレットキーのチェック機能が追加された事が確認できました。

テンプレートに登録してリポジトリの初期化時にgit hookのインストールを自動で実行するようにする

リポジトリごとに毎回git hookをインストールしてもよいのですが、git cofingで用意されているinit.templateDirにテンプレート登録することで、git initgit clone時に自動的にgit-secrets用のgit hookをインストールする事ができます。

※2021年10月現在の注意点

この手順で利用するコマンドについて。

コマンドプロンプト と Windows PowerShellgit secrets --install ~/.git-templates/git-secretsがうまく動かない事を確認しています。

ですのでここでのコマンドGit for WindowsをインストールしたときについてくるGit Bashを利用して実施して下さい。

【GitBash】リポジトリ初期化時に自動でインストールするようにテンプレート設定
# 下記はGitBashで実行して下さい
# 前回はリポジトリごとにgit config(ローカル)を設定していましたが globalをつけて git config(グローバル)に設定を書き込み
git secrets --register-aws --global

# テンプレートファイルを生成
git secrets --install ~/.git-templates/git-secrets

# git configのinit.templateDirに生成したテンプレート使うように設定
git config --global init.templateDir ~/.git-templates/git-secrets

上記のコマンドを実行することで、シークレットチェック用のパターンをgit config(グローバル)に設定し、どのリポジトリでも同様の設定を利用するようにしています。

またgit config(グローバル)init.templateDirにテンプレートを設定することによりリポジトリ初期化時に~/.git-templates/git-secretsをテンプレートとして利用するように登録しています。

ここまでの設定したあとにリポジトリ初期化を実行すると、自動でgit hookがインストールされている事を確認できます。

【PowerShell】
git init check-rep
cd ./check-rep 

New-Item -Name ./secret -Value "aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample"

git add ./secret
git commit -m test

コミット時にチェックエラーが表示される事を確認できるかと思います。

git secrets --install ~/.git-templates/git-secretsがWindows環境ではバグってる

2021年10月現在。

git secrets --install ~/.git-templates/git-secretsコマンドを実行してgit-secrets用のテンプレートを生成しますが。

コマンドプロンプトWindows PowerShellで実施すると期待を裏切り。

カレントディレクトリに ~/.git-templates/git-secrets というテンプレートを作成します。

ホームディレクトリにテンプレートを作成しないで~(チルダ)というフォルダの下にテンプレートファイルを作成してしまう……

image.png

これはなかなかに残念な感じ。

試した所、Git Bashだと問題なくホームディレクトリにテンプレートを作成してくれますが。
コマンドプロンプトWindows PowerShellGit CMDだとうまく動かないようです。

template install fails on Windows #123

PowerShell 7の場合は、試験的な機能PSNativePSPathResolutionを利用すれば問題なさそうですが、PowerShell 7.3からは試験的な機能PSNativePSPathResolutionは削除されました。

git hookの設定を解除する

一度git-secretsで管理するように設定したリポジトリをgit-secretsの管理から外したい場合はgit hookの設定を削除する必要があります。

git secretsのコマンドからアンインストールできれば便利そうですが、現状ではマニュアルでファイルを削除して対応する方法しかないようです。

対象リポジトリからgit hookを削除する場合

対象リポジトリの下記3ファイルを削除すれば問題ないようです。

  • .git/hooks/commit-msg
  • .git/hooks/pre-commit
  • .git/hooks/prepare-commit-msg

気になるようだったらgit config(ローカル)に追加したsecrets.*な設定も削除して下さい。

テンプレート登録を解除する場合

git secrets --register-aws --globalでグローバルに設定して、init.templateDirにテンプレート登録を実施し、自動でgit hookをインストールしている場合は下記方法で解除できます。

  1. git config(グローバル)に書き込んだsecrets.*な設定の削除
  2. git config(グローバル)に書き込んだinit.templateDirな設定の削除
  3. ~/.git-templatesの削除

git config --global --editを実行するとエディタが起動するので、直接gitconfigのパラメータを更新することができます。

こちらから登録したsecrets.*のパラメータとinit.templateDirを削除して下さい。
最後に、テンプレートファイル~/.git-templatesも削除すれば完了です。

もしくはgit configのグローバルな設定は~/.gitconfigファイルに書き込まれているためこのファイルからsecrets.*init.templateDirな設定を削除して下さい。

あとgit config --global --unset,git config --global --unset-allコマンドにパラメータ名をそれぞれ渡す方法でも削除できます。

【削除対象】gitconfigの設定
[secrets]
        providers = git secrets --aws-provider
        patterns = (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
        patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
        patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
        allowed = AKIAIOSFODNN7EXAMPLE
        allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[init]
        templateDir = C:/Users/Administrator/.git-templates/git-secrets

git secrets --scan

今まではコミット時にチェックを実施していましたが。
git secrets --scan を利用することにより、ファイルに対してチェックを実施できます。

scna
# リポジトリ中で実行すればリポジトリのファイル全スキャン
git secrets --scan
# ファイル名を指定すれば対象のみをスキャン
git secrets --scan ./secret
# `git secrets --scan -`とすれば下記のような事もできる
Write-Output 'aws_secret_access_key = GitSecretsCommitTestCaseSampleKeysSample' | git secrets --scan -

総評

今回は紹介していませんが、git-secretsには自分でプロバイダを追加して、指定したルールでファイルをチェックする機能を提供しており。

設定さえすればAWSアクセスキー、シークレットキーに限らず、特定の機密情報のコミットを防ぐような事も実現できます。

一度設定したリポジトリを対象から外す際は、リポジトリのgit hook設定を元に戻したりと少し戸惑うかもしれませんが。

便利に利用できるツールになるかと思います。

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?