git-all-secrets は以下のことが可能なツールです:
スキャンは、以下のような複数のオープンソースツールによって行われます:
注 - 今後、必要に応じてこのようなツールを追加することができます!
注 - スキャンは、toolName フラグを指定することで、すべてのツールを使用することも、いずれか 1 つのツールを使用することもできます。
すべてのツールを使用してスキャンした場合、ツールの最終的な出力は、すべてのツールからのすべてのファイルの出力を 1 つの統合された出力ファイルに結合します。
git-all-secrets を実行する最も簡単な方法は Docker を使用することです。Docker がまだインストールされていない場合は、インストールすることを強くお勧めします。Docker がインストールされたら、
docker run --rm -it abhartiya/tools_gitallsecrets --help と入力して、入力として受け取れるさまざまなフラグを理解します。docker run -it abhartiya/tools_gitallsecrets -token=<> -org=<> のように入力します。スキャンに使用する特定のツールを指定するには、docker run -it abhartiya/tools_gitallsecrets -token=<> -org=<> -toolName=<> のように入力します。オプションは thog と repo-supervisor です。thogEntropy フラグを指定します:docker run -it abhartiya/tools_gitallsecrets -token=<> -org=<> -toolName=thog -thogEntropy。docker ps -a と入力してコンテナ ID を取得します。docker cp <container-id>:/root/results.txt . と入力して、コンテナからホストに結果ファイルを取得します。-token = GitHub の個人用アクセストークン。認証されていない GitHub API へのリクエストはすぐにレート制限に達する可能性があるため、これが必要です。
-org = スキャンする組織の名前。これにより、組織内のすべての公開リポジトリ、および組織内のすべてのユーザーのすべてのリポジトリと gist がスキャンされます。この組織のメンバーであるユーザーのトークンを使用している場合、そのユーザーに属するすべてのシークレット gist と、そのユーザーがアクセスできる組織内のすべての非公開リポジトリもクローンしてスキャンします。ただし、この組織に属するこのユーザーの非公開リポジトリはクローンおよびスキャンしません。ユーザーの非公開リポジトリをスキャンするには、SSH キーをボリュームにマウントした状態で、user フラグとともに scanPrivateReposOnly フラグを使用してください。
-user = スキャンするユーザーの名前。これにより、このユーザーのすべてのリポジトリと gist がスキャンされます。指定されたトークンがユーザーのトークンである場合、シークレット gist もクローンおよびスキャンされます。ただし、公開リポジトリのみがクローンおよびスキャンされます。このユーザーの非公開リポジトリをスキャンするには、SSH キーをボリュームにマウントした状態で、user フラグとともに scanPrivateReposOnly フラグを使用してください。
-repoURL = スキャンするリポジトリの HTTPS URL。このリポジトリのみをスキャンします。公開リポジトリの場合は、リポジトリの https URL を指定すれば十分です。ただし、非公開リポジトリをスキャンしたい場合は、SSH キーをボリュームにマウントし、scanPrivateReposOnly フラグとともに ssh URL を指定する必要があります。
-gistURL = スキャンする Gist の HTTPS URL。この gist のみをスキャンします。URL を持っていれば、公開 gist かシークレット gist かは関係ありません。シークレット gist であっても、誰かがその HTTPS URL を知っていればアクセスできます。
-output = すべての結果が保存されるファイルの名前。デフォルトは results.txt です。
-cloneForks = 組織およびユーザーリポジトリのフォークをクローンするためのオプションのブール値フラグ。デフォルトは 0、つまりフォークをクローンしません。フォークをクローンする場合は、この値を に設定する必要があります。または、他のフラグと一緒に と指定するだけです。
token フラグは必須です。これは空にできません。
org、user、repoURL、gistURL のすべてを同時に空にすることはできません。これらの値のうち 1 つだけを指定する必要があります。すべてまたは複数の値を一緒に指定した場合、優先順位は org > user > repoURL > gistURL となります。たとえば、-org=secretorg123 と -user=secretuser1 の両方のフラグを同時に指定すると、ツールは org 値と一緒に他のものは必要ないと警告します。特定のユーザーに対してのみ実行するには、org フラグではなく user フラグのみを指定する必要があります。
scanPrivateReposOnly フラグを指定する場合:
プライベートリポジトリをスキャンする最も安全な方法は、SSH URL を使用してクローンすることです。これを実現するには、GitHub ユーザーに追加された適切な SSH キーを配置する必要があります。GitHub にはアカウント設定に関する役立つドキュメントがあります。このキーにパスフレーズが設定されていないことを確認してください。SSH キーを用意したら、ボリュームを介して Docker コンテナにマウントするだけです。以下のコマンドを入力するだけで簡単です:
docker run -it -v ~/.ssh/id_rsa_personal:/root/.ssh/id_rsa abhartiya/tools_gitallsecrets -token=<> -user=<> -scanPrivateReposOnly
または
docker run -it -v ~/.ssh/id_rsa_personal:/root/.ssh/id_rsa abhartiya/tools_gitallsecrets -token=<> -repoURL=<> -scanPrivateReposOnly
ここでは、ローカルに保存されている個人用 SSH キー id_rsa_personal をコンテナ内の /root/.ssh/id_rsa にマッピングしています。これにより、git-all-secrets は ssh 経由でリポジトリをクローンしようとし、コンテナ内の /root/.ssh/id_rsa に保存されている SSH キーを使用します。このようにして、コンテナ内に機密情報を実際に保存することはありません。ローカルマシンからファイルを使用しているだけです。コンテナが破棄されると、このキーへのアクセスは失われます。
GitHub API は、非公開リポジトリが報告される状況を制限しています。管理者ではないユーザーで組織をスキャンしようとする場合、ユーザーにリポジリアクセスを提供するチームを指定する必要があるかもしれません。これを行うには、org フラグとともに teamName フラグを使用します。以下に例を示します:
docker run --it -v ~/.ssh/id_rsa_personal:/root/.ssh/id_rsa abhartiya/tools_gitallsecrets -token=<> -org=<> -teamName <>
git-all-secrets は GitHub Enterprise のスキャンもサポートするようになりました。VPN の背後などに独自の GitHub Enterprise をホストしている場合は、GitHub Enterprise リポジトリにアクセスできる VPN または適切なネットワークに接続していることを確認してください。enterpriseURL は GitHub Enterprise リポジトリをスキャンするために必要なものです。以下にいくつかの例を示します:
例 1:
docker run -it -v ~/.ssh/id_rsa_gitenterprise:/root/.ssh/id_rsa -token <token> -enterpriseURL https://github.<org>.com/api/v3 -repoURL https://github.<org>.com/<user>/<repo>.git
ここでは、GitHub Enterprise の SSH キーをコンテナにマウントし、その後に個人用アクセストークン、リクエストが送信されるエンタープライズ URL、スキャンしたいリポジトリを指定しています。
例 2:
docker run -it -v ~/.ssh/id_rsa_gitenterprise:/root/.ssh/id_rsa -token <token> -enterpriseURL https://github.<org>.com/api/v3 -repoURL https://github.<org>.com/<user>/<repo>.git -toolName thog -thogEntropy
上記では、エントロピー設定を使用してリポジトリに対して truffleHog だけを実行しています。
例 3:
docker run -it -v ~/.ssh/id_rsa_gitenterprise:/root/.ssh/id_rsa -token <token> -enterpriseURL https://github.<org>.com/api/v3 -user <username> -scanPrivateReposOnly
上記では、トークンが提供されたユーザーの非公開リポジトリのみを、すべてのツール(repo-supervisor と thog)でスキャンしていますが、truffleHog のエントロピー設定は使用していません。
rules.json ファイルに独自の正規表現を追加し、docker run の実行時に -v $(pwd)/rules.json:/root/truffleHog/rules.json 引数を使用して含めることができます。git-all-secrets にかなり簡単に統合できます。GitHub リポジトリ内のシークレットを探すために使用できる可能性のある多数のオープンソースツールを調査しました。優れていると思った主要なツールは、gitrob、truffleHog、git-secrets です。
Gitrob はスタンドアロンツールとして設計されており、独自のデータベースと UI を持ち、発見されたすべてのシークレットを表示するため、他のツールとの統合がかなり困難です。また、truffleHog よりも多くの偽陽性を生成します。さらに、発見されたシークレットを実際に強調表示しません。ファイルとその拡張子だけを見て、実際の内容は見ません。そのため、Gitrob は使い始めるのに優れたツールですが、攻撃対象領域がどのように見えるかを理解し、変更があったかどうかを確認するために、ときどき実行することをお勧めします。
次に、シャノンのエントロピーを調べてファイルの実際の内容からシークレットを探し、出力を画面に表示する truffleHog があります。リポジトリ URL またはリポジトリディレクトリを引数として受け取ります。これはかなり優れたツールですが、偽陽性もあります。その他の欠点は次のとおりです:
最後に、AWS シークレットなどをフラグ付けできる git-secrets があります。最も優れている点は、ツールが探すべき既知のシークレットに対して独自の正規表現を追加できることです。主な欠点は、truffleHog のように高エントロピー文字列を見つけるのに適していないことです。また、スキャンできるのはリポジトリである特定のディレクトリのみで、リポジトリのディレクトリからの再帰スキャンはできません。
このように、世の中には優れたツールがありますが、それらを何らかの方法で組み合わせる必要がありました。また、1 つだけでなく複数のリポジトリを再帰的にスキャンする必要性もありました。そして gist はどうでしょうか? 組織やユーザーが存在します。そして組織やユーザー用のリポジトリがあります。ユーザーによる gist もあります。これらすべてをスキャンする必要があります。そして、自動化可能で他のツール/フレームワークで簡単に利用できるようにスキャンする必要があります。
2/9/19 - スキャン中に一部のリポジトリ名をスキップする blacklist フラグを追加しました。@sjqnn さん、PR ありがとうございます。新しい Docker イメージをビルドしてプッシュしました。GLHF!
7/31/18 - pip を使用して trufflehog のインストールを簡素化しました。@mhmdiaa が trufflehog の出力関数に関するバグ(マージとソートが正しく行われていなかった)を修正しました。password などを含むように正規表現ファイルを更新しました。新しい Docker イメージをビルドしてプッシュしました。GLHF!
7/15/18 - 上流に変更があったため、repo-supervisor のフォークを更新しました。最新の Trufflehog を使用して新しい Docker イメージを再ビルドしました。Trufflehog がシークレットを見つけるために使用するすべての正規表現を含む rules.json ファイルを提供しました。-mergeOutput フラグを使用して、両方のツールの出力(JSON)をマージする機能を追加しました。マルチステージビルドと dep を使用して依存関係を管理することで、Docker イメージサイズを大幅に削減しました。これらすべてについて、@mhmdiaa に大きな感謝を送ります!
12/12/17 - 一部の大きなリポジトリでは、truffleHog が失敗して終了します。しかし、そこで止めたくはありません。ユーザーにそのリポジトリのスキャンが失敗したことを通知し、他のリポジトリのスキャンを続行したいと考えています。これは最新の Docker イメージに実装されています。
12/11/17 - gitsecrets を削除しました。truffleHog が正規表現機能をサポートしているためです。rules.json ファイルに正規表現を追加し、Docker イメージを再ビルドするだけで、以前 gitsecrets が提供していた機能が基本的に得られるため、gitsecrets は不要になりました。また、GitHub Enterprise のリポジトリと gist のスキャンサポートを追加しました。@high-stakes が、スレッド数を制限することで Goroutine のバグを(おそらく)修正する PR をマージするのを手伝ってくれました。最後に、組織の非公開リポジトリのスキャンサポートも追加しました。
12/08/17 - truffleHog の独自のフォークを削除しました。現在は上流バージョンと、truffleHog の新しい正規表現機能 + エントロピーモードを使用しています。近いうちに、いくつかの問題が修正されれば、gitsecrets と repo supervisor の両方を truffleHog だけで置き換えられると思います。
12/07/17 - さまざまなフラグに関する詳細と説明をドキュメントに更新しました。
12/05/17 - SSH キーによる非公開リポジトリのスキャンサポートを統合しました。これは長い間要望があった機能で、ついに実現しました。また、Docker イメージのタグスキームを変更しました。今後、最新のイメージには latest タグが付きます。以前のバージョンにはすべて番号が付けられます。これらすべては、SimpliSafe チーム、特に Matthew Cox (https://github.com/matthew-cox) なしでは実現できませんでした。Matt、大きな感謝を送ります!
気持ちを示したい場合、私の BTC ウォレットアドレスは 1PtMhXWCcMZCitcDfaEBe7jnV9sjKoNvq7 です。
1-cloneForks-orgOnly = 組織に属するユーザーリポジトリのクローンをスキップするためのオプションのブール値フラグ。デフォルトは 0、つまり通常の動作です。ユーザーリポジトリをスキャンせず、組織リポジトリのみをスキャンする場合は、この値を 1 に設定する必要があります。または、他のフラグと一緒に -orgOnly と指定するだけです。
-toolName = スキャンに使用するツールを指定するためのオプションの文字列フラグ。デフォルトは all、つまり thog と repo-supervisor の両方がスキャンに使用されます。値は thog または repo-supervisor のいずれかです。
-teamName = スキャン用の非公開リポジトリへのアクセス権を持つ組織チームの名前。このフラグは完全にはテストされていないため、機能を保証できません。
-scanPrivateReposOnly = ユーザーの非公開リポジトリをスキャンするかどうかを指定するためのオプションのブール値フラグ。これを指定すると、ユーザーの公開リポジトリはスキャンされません。また、ボリュームをコンテナにマウントして SSH キーを提供する必要があります。また、これは user フラグ、repoURL フラグ、または org フラグと一緒にのみ機能します。
org フラグが scanPrivateReposOnly フラグと一緒に指定され、orgOnly フラグなしで指定された場合、この組織に属する、ユーザー(そのトークンが提供された)がアクセスできる公開リポジトリと非公開リポジトリの両方がスキャンされます。その後、ユーザー(そのトークンが提供された)の非公開リポジトリのみがスキャンされます。最後に、このユーザー(そのトークンが提供された)のすべての公開 gist とシークレット gist がスキャンされます。要するに、scanPrivateReposOnly フラグは実際には user フラグと repoURL フラグにのみ影響します。
-enterpriseURL = GitHub Enterprise リポジトリをスキャンする場合に、エンタープライズ GitHub URL を指定するためのオプションのフラグ。https://github.org.com/api/v3 のような形式で、SSH キーをコンテナにマウントする必要があります。以下の「GitHub Enterprise のスキャン」を参照してください。
-threads = デフォルト値は 10。システムが十分に強力でない場合にスレッド数を制限するためのものです。ほとんどの場合、これを 10 にしておけば問題ありません。
-thogEntropy = truffleHog から高エントロピーベースのシークレットを取得するかどうかを指定するオプションのフラグ。truffleHog の高エントロピーシークレットは多くのノイズを生成するため、そのノイズが不要で、大きな組織で git-all-secrets を実行している場合は、このフラグを指定しないことをお勧めします。デフォルトは False で、truffleHog は rules.json ファイル内の正規表現に基づいた結果のみを生成します。かなり小さな組織やリポジトリー数が限られているユーザーをスキャンする場合は、このフラグを指定する方が理にかなっています。
-mergeOutput = 使用されたツール(現在は truffleHog と repo-supervisor)の出力をマージして重複排除するためのオプションのフラグ。デフォルト値は False です。
-blacklist = スキャンすべきではないリポジトリ名をカンマ区切りで指定します。
-v フラグを使用して、秘密の SSH キーを含むボリュームをマウントする必要があります。https URL ではなく ssh URL を使用してください。以下の「プライベートリポジトリのスキャン」を参照してください。
teamName を指定する場合、指定された token がチームのメンバーであるユーザーに属していることが重要です。そうしないと予期しない結果が生じる可能性があります。以下の「組織チームのスキャン」を参照してください。
enterpriseURL フラグを指定する場合、リポジトリの https URL を指定しても、常に SSH URL が考慮されます。エンタープライズのクローン/スキャンはすべて ssh URL を介して行われ、https URL は使用されません。
上記の通り、SSH URL をスキャンするために使用する SSH キーにはパスフレーズが設定されていないことを確認してください。
10/14/17 - 新しいイメージ abhartiya/tools_gitallsecrets:v6 をビルドしてプッシュしました。この新しいイメージには、git-secrets と repo-supervisor の新しいバージョンが含まれています。つまり、フォークにすでに加えた追加変更とともに、上流の変更を独自のフォークにマージしました。新しいイメージはこれらの変更を使用しているため、すべてが最新かつ最高の状態です!* 2017/10/14 - 新しいイメージ abhartiya/tools_gitallsecrets:v5 をビルドしてプッシュしました。このイメージは、リポジトリ監視機能を動作不良にさせる可能性があった非常に馬鹿げた厄介なバグを修正しています。Dockerfile で Environment 値の読み取り方法が変更されたため、リポジトリ監視機能がどの node パスを使用すべきか認識できなくなっていました。Node 地獄!
2017/9/29 - orgOnly フラグ付きの新しいイメージ abhartiya/tools_gitallsecrets:v4 をビルドしてプッシュしました。
2017/8/22 - kciredor により -orgOnly トグルを追加: 指定された組織のリポジトリのみ解析し、ユーザーのリポジトリをスキップします。
2017/6/26 - 機密情報が見つからなかった場合にリポジトリ監視機能がエラーを出力していた部分の出力を削除。不要な出力でした!新しいイメージ abhartiya/tools_gitallsecrets:v3 をビルドしてプッシュしました。
2017/6/25 - スキャンに使用するツールを指定するフラグ toolName を追加。新しいイメージ abhartiya/tools_gitallsecrets:v2 をビルドしてプッシュしました。
2017/6/14 - スキャンツールとしてリポジトリ監視機能 (repo-supervisor) を追加。Docker イメージにバージョン番号を更新して追加しました - abhartiya/tools_gitallsecrets:v1
2017/6/14 - 組織およびユーザーのリポジトリのフォークを避けるためのフラグ cloneForks を追加。デフォルトでは false です。フォークもスキャンしたい場合は、値を 1 に設定してください(例:-cloneForks=1)。