.. contents:: :depth: 2
::
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>]
git-secrets は、コミット、コミットメッセージ、および --no-ff マージをスキャンして、シークレットがgitリポジトリに追加されるのを防ぎます。コミット、コミットメッセージ、または --no-ff マージ履歴内のいずれかのコミットが、設定された禁止正規表現パターンのいずれかに一致する場合、そのコミットは拒否されます。
git-secrets は、git secrets を実行したときに git によって認識されるように、PATHのどこかに配置する必要があります。
*nix (Linux/macOS)
提供されているMakefileの ``install`` ターゲットを使用して、``git secrets`` とmanページをインストールできます。PREFIX変数とMANPREFIX変数を使用して、インストールパスをカスタマイズできます。
::
make install
Windows
~~~~~~~
提供されている ``install.ps1`` PowerShellスクリプトを実行します。これにより、必要なファイルがインストールディレクトリ(デフォルトでは ``%USERPROFILE%/.git-secrets``)にコピーされ、そのディレクトリが現在のユーザーの ``PATH`` に追加されます。
::
PS > ./install.ps1
Homebrew(macOSユーザー向け)
::
brew install git-secrets
.. warning::
**まだ完了していません!** ``git secrets --install`` を使用する予定の**すべてのリポジトリに対してgitフックをインストールする必要があります。**
以下は、各コミット時にgitリポジトリがシークレットをスキャンされるようにするための簡単な例です::
cd /path/to/my/repo
git secrets --install
git secrets --register-aws
今後初期化またはクローンするすべてのリポジトリにフックを追加したい場合は、設定テンプレートを追加します。
::
git secrets --register-aws --global
ローカルリポジトリすべてにフックを追加します。
::
git secrets --install ~/.git-templates/git-secrets
git config --global init.templateDir ~/.git-templates/git-secrets
セキュリティ資格情報をスキャンするためのカスタムプロバイダーを追加します。
::
git secrets --add-provider -- cat /path/to/secret/file/patterns
git-secretsを使用すると、全リビジョンを含むリポジトリをスキャンすることもできます:
::
git secrets --scan-history
操作モード
これらの各オプションは、コマンドラインの最初に指定する必要があります。
``--install``
リポジトリにgitフックをインストールします。フックがインストールされると、そのリポジトリではコミットおよび非fast-forwardマージでシークレットがコミットされるのを防ぎます。
``--scan``
1つ以上のファイルをシークレットについてスキャンします。ファイルにシークレットが含まれている場合、スキャン対象ファイルから一致したテキストがstdoutに書き込まれ、スクリプトは0以外のステータスで終了します。一致した各行は、一致したファイル名、コロン、一致した行番号、コロン、そして一致したテキストの行として書き込まれます。ファイルが指定されない場合、``git ls-files`` によって返されるすべてのファイルがスキャンされます。
``--scan-history``
すべてのリビジョンを含めてリポジトリをスキャンします。ファイルにシークレットが含まれている場合、スキャン対象ファイルから一致したテキストがstdoutに書き込まれ、スクリプトは0以外のステータスで終了します。一致した各行は、一致したファイル名、コロン、一致した行番号、コロン、そして一致したテキストの行として書き込まれます。
``--list``
現在のリポジトリまたはグローバルgit configの ``git-secrets`` 設定を一覧表示します。
``--add``
禁止パターンまたは許可パターンを追加します。
``--add-provider``
シークレットプロバイダーを登録します。シークレットプロバイダーは、呼び出されると ``git-secrets`` が禁止として扱うべき禁止パターンを出力する実行可能ファイルです。
``--register-aws``
git configに一般的なAWSパターンを追加し、``~/.aws/credentials`` に存在するキーがいずれのコミットにも含まれないようにします。次のチェックが追加されます:
- AWSアクセスキーID: ``(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}``
- Amazon Bedrock APIキー。長期有効: ``ABSK[A-Za-z0-9+/]{109,}=*``、短期有効: ``bedrock-api-key-YmVkcm9jay5hbWF6b25hd3MuY29t``
- AWSシークレットアクセスキーの割り当て: ":" または "=" で囲まれ、オプションで引用符で囲まれます
- AWSアカウントIDの割り当て: ":" または "=" で囲まれ、オプションで引用符で囲まれます
- サンプルAWSキー(``AKIAIOSFODNN7EXAMPLE`` および ``wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY``)の許可パターン
- ``~/.aws/credentials`` から既知の資格情報
.. note::
このコマンドで登録されたパターンは、ほとんどのAWS資格情報をキャッチするはずですが、**すべて**をキャッチすることを保証するものではありません。``git-secrets`` は追加の保険手段として使用すべきであり、資格情報をリポジトリにコミットしないようにするための十分な注意を払う必要があります。
``--aws-provider``
INIファイル内の資格情報を出力するシークレットプロバイダー。オプションでINIファイルへのパスを指定できます。
``--install`` のオプション
-f, --force
既存のフックがあれば上書きします。
<target-directory>
指定された場合、指定されたディレクトリにgitフックをインストールします。<target-directory> が指定されない場合は、カレントディレクトリが使用されます。
指定された ``<target-directory>`` がgitリポジトリ内にない場合、ディレクトリが作成され、フックは ``<target-directory>/hooks`` に配置されます。これは、``git init --template <target-directory>`` を使用してgitテンプレートディレクトリを作成するのに便利です。
既に初期化されているリポジトリで ``git init`` を実行できます。「git initドキュメント(https://git-scm.com/docs/git-init)」より:
gitのドキュメントより: 既存のリポジトリで ``git init`` を実行しても安全です。既存のものは上書きされません。``git init`` を再実行する主な理由は、新しく追加されたテンプレートを適用するためです(または ``--separate-git-dir`` が指定された場合にリポジトリを別の場所に移動するため)。
次のgitフックがインストールされます:
1. ``pre-commit``: コミットで変更されたファイルが禁止パターンを使用していないかチェックするために使用されます。
2. ``commit-msg``: コミットメッセージに禁止パターンが含まれているかを判断するために使用されます。
3. ``prepare-commit-msg``: マージコミットが、履歴のどの時点でも禁止パターンを含む履歴を導入するかどうかを判断するために使用されます。このフックは非fast-forwardマージの場合にのみ呼び出されることに注意してください。
.. note::
Gitでは、フックごとに1つのスクリプトのみを実行できます。リポジトリに ``pre-commit.d`` や ``commit-msg.d`` のようなDebianスタイルのサブディレクトリが存在する場合、gitフックはこれらのディレクトリにインストールされます。これは、対応するフックがこれらのディレクトリ内のすべてのスクリプトを実行するように設定されていることを前提としています。これらのgitサブディレクトリが存在しない場合、gitフックはgitリポジトリの ``.git/hooks`` ディレクトリにインストールされます。
例 ^^^^^^^^
カレントディレクトリにgitフックをインストール::
cd /path/to/my/repository
git secrets --install
カレントディレクトリ以外のリポジトリにgitフックをインストール::
git secrets --install /path/to/my/repository
git-secrets がインストールされたgitテンプレートを作成し、そのテンプレートをgitリポジトリにコピー::
git secrets --install ~/.git-templates/git-secrets
git init --template ~/.git-templates/git-secrets
既存のフックがあれば上書き::
git secrets --install -f
--scan のオプション
``-r, --recursive``
指定されたファイルを再帰的にスキャンします。ディレクトリが見つかった場合、そのディレクトリがスキャンされます。``-r`` が指定されない場合、ディレクトリは無視されます。
``-r`` は ``--cached``、``--no-index``、または ``--untracked`` と一緒に使用できません。
``--cached``
インデックスファイルに登録されているblobを検索します。
``--no-index``
gitで管理されていないカレントディレクトリ内のファイルを検索します。
``--untracked``
ワーキングツリー内の追跡ファイルに加えて、``--scan`` は追跡されていないファイルも検索します。
``<files>...``
シークレットをスキャンするディスク上の1つ以上のファイルへのパス。
ファイルが指定されない場合、``git ls-files`` によって返されるすべてのファイルがスキャンされます。
例
^^^^^^^^
リポジトリ内のすべてのファイルをスキャン::
git secrets --scan
単一のファイルをシークレットについてスキャン::
git secrets --scan /path/to/file
ディレクトリを再帰的にシークレットについてスキャン::
git secrets --scan -r /path/to/directory
複数のファイルをシークレットについてスキャン::
git secrets --scan /path/to/file /path/to/other/file
globを使ってスキャンすることもできます::
git secrets --scan /path/to/directory/*
標準入力からスキャン::
echo 'hello!' | git secrets --scan -
``--list`` のオプション
--global
グローバルgit config内のgit-secrets設定のみを一覧表示します。
--add のオプション
``--global``
グローバルgit configにパターンを追加します。
``-l, --literal``
指定されたパターン内の正規表現特殊文字をエスケープし、パターンをリテラルとして検索します。
``-a, --allowed``
パターンを禁止ではなく許可としてマークします。許可パターンは誤検出を除外するために使用されます。
``<pattern>``
検索する正規表現パターン。
例
^^^^^^^^
現在のリポジトリに禁止パターンを追加::
git secrets --add '[A-Z0-9]{20}'
グローバルgit configに禁止パターンを追加::
git secrets --add --global '[A-Z0-9]{20}'
リテラルとしてスキャンされる文字列を追加 (``+`` はエスケープされます)::
git secrets --add --literal 'foo+bar'
許可パターンを追加::
git secrets --add -a 'allowed pattern'
``--register-aws`` のオプション
--global
AWS固有の設定変数をグローバルgit configに追加します。
--aws-provider のオプション
``[<credentials-file>]``
指定された場合、スキャンするINIファイルのカスタムパスを指定します。指定されない場合、``~/.aws/credentials`` が使用されます。
``--add-provider`` のオプション
--global
プロバイダーをグローバルgit configに追加します。
<command>
呼び出すプロバイダーコマンド。呼び出されると、コマンドは禁止パターンを改行で区切ってstdoutに出力することが期待されます。追加の引数はコマンドに渡されます。
例 ^^^^^^^^
引数付きのシークレットプロバイダーを登録::
git secrets --add-provider -- git secrets --aws-provider
ファイルからシークレットを出力::
git secrets --add-provider -- cat /path/to/secret/file/patterns
コミットまたはコミットメッセージに禁止パターンが含まれているかどうかを判断するために、egrep 互換の正規表現が使用されます。これらの正規表現は git config コマンドを使って定義します。システムによって異なるバージョンのegrepが使用されることに注意してください。例えば、macOSでは、Ubuntuなどとは異なるバージョンの egrep が使用されます(BSD vs GNU)。
git secrets --add <pattern> を使用して、git configに禁止正規表現パターンを追加できます。
正規表現が誤検出にマッチすることがあります。たとえば、gitコミットSHAはAWSアクセスキーによく似ています。次のコマンドを使用して、誤検出として多くの異なる正規表現パターンを指定できます:
::
git secrets --add --allowed 'my regex pattern'
リポジトリのルートディレクトリにある .gitallowed ファイルに正規表現パターンを追加して、誤検出をフィルタリングすることもできます。# で始まる行はスキップされ(コメント行)、空行もスキップされます。
まず、git-secretsは禁止パターンに一致する行をファイルからすべて抽出します。一致結果には、一致したファイルの完全パス、その後に ':'、一致した行番号、その後にパターンに一致したファイルの行全体が含まれます。次に、許可正規表現が定義されている場合、git-secretsは一致したすべての行が登録された許可正規表現の少なくとも1つに一致するかどうかを確認します。シークレットとしてフラグが立てられたすべての行が許可マッチによって打ち消された場合、対象テキストにはシークレットは含まれていません。一致した行のいずれかが許可正規表現に一致しない場合、git-secretsはコミット/マージ/メッセージを失敗させます。
.. important::
禁止パターンをあまりに貪欲に追加するのが悪い習慣であるのと同様に、許可パターンをあまりに寛容に追加するのも悪い習慣です。パターンが意図したとおりに機能することを確認するために、``git secrets --scan $filename`` を使用してアドホックにテストしてください。
既知のシークレットのセットに対して正確なパターンマッチをチェックしたい場合があります。たとえば、~/.aws/credentials に存在する資格情報がコミットに現れないようにしたい場合です。このような場合、これらのシークレットをgit config内のgitリポジトリ全体に分散させるよりも、1か所に残しておく方がよいでしょう。「シークレットプロバイダー」を使用すると、これらの種類の資格情報を取得できます。シークレットプロバイダーは、呼び出されると禁止パターンを改行で区切って出力する実行可能ファイルです。
--add-provider コマンドを使用してシークレットプロバイダーを追加できます::
git secrets --add-provider -- git secrets --aws-provider
-- の使用に注意してください。これにより、プロバイダーに関連付けられた引数が、シークレットのスキャン時に呼び出されるたびにプロバイダーに渡されるようになります。
例を見てみましょう。次の対象テキスト(/tmp/example に格納)を考えます::
This is a test!
password=ex@mplepassword
password=******
More test...
そして、次の登録パターンが与えられます:
::
git secrets --add 'password\s*=\s*.+'
git secrets --add --allowed --literal 'ex@mplepassword'
git secrets --scan /tmp/example を実行すると、次のエラー出力になります::
/tmp/example:3:password=******
[ERROR] Matched prohibited pattern
Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- Use --no-verify if this is a one-time false positive
分解すると、禁止パターン値 password\s*=\s*.+ は次の行に一致します::
/tmp/example:2:password=ex@mplepassword
/tmp/example:3:password=******
...しかし、最初の行は許可正規表現 ex@mplepassword に一致するためフィルタリングされます。一致しなかった残りの行があるため、これはシークレットと見なされます。
一致行はファイル名と行番号で始まる行に配置されるため(例: /tmp/example:3:...)、許可パターンでファイル名と行番号を考慮した正規表現を作成できます。たとえば、次のようにしてファイル全体をホワイトリストに登録できます::
git secrets --add --allowed '/tmp/example:.*'
git secrets --scan /tmp/example && echo $?
# Outputs: 0
または、行が変更される可能性が低い場合、次のようにファイルの特定の行番号を許可することもできます:
::
git secrets --add --allowed '/tmp/example:3:.*'
git secrets --scan /tmp/example && echo $?
# Outputs: 0
許可パターンを作成する際には、許可パターンが比較される対象テキストにファイル名が含まれているために、許可パターンが誤って一致しないように注意してください。
コミット、マージ、またはコミットメッセージで誤検出が発生した場合は、--no-verify オプションを使用してください。これにより、gitフックの実行がスキップされ、コミットまたはマージを行うことができます。
Michael Dowling <https://github.com/mtdowling>_https://github.com/awslabs/git-secrets <https://github.com/awslabs/git-secrets>_ にあります。Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.