DumpsterDiver は、大量のデータを分析し、AWS Access Key、Azure Share Key、SSHキーなどのキーやパスワードといったハードコードされたシークレットを検索するツールです。また、単純な条件(例:少なくとも10件のメールアドレスを含むCSVファイルのみを報告する)を用いた単純な検索ルールを作成することもできます。 このツールの主なアイデアは、潜在的なシークレット漏洩を検出することです。実際の動作はデモビデオでご覧いただけます。また、すべての機能についてはこちらの記事をお読みください。
usage: DumpsterDiver.py [-h] -p LOCAL_PATH [-r] [-a] [-s] [-o OUTFILE]
[--min-key MIN_KEY] [--max-key MAX_KEY]
[--entropy ENTROPY] [--min-pass MIN_PASS]
[--max-pass MAX_PASS]
[--pass-complex {1,2,3,4,5,6,7,8,9}]
[--exclude-files EXCLUDE_FILES [EXCLUDE_FILES ...]]
[--bad-expressions BAD_EXPRESSIONS [BAD_EXPRESSIONS ...]]
-p LOCAL_PATH - 分析対象のファイルが含まれるフォルダへのパス-a, --advance - このフラグを設定すると、すべてのファイルが rules.yaml ファイルで指定されたルールを使用して追加分析されます。-r, --remove - このフラグを設定すると、シークレット(または -a フラグが設定されている場合は興味深いもの)を含まないファイルが削除されます。-s, --secret - このフラグを設定すると、すべてのファイルがハードコードされたパスワードを探すために追加分析されます。-o OUTFILE - JSON形式の出力ファイルDumpsterDiver を実行するには、Python ライブラリをインストールする必要があります。次のコマンドを実行してインストールできます:
$> pip install -r requirements.txt
Python 2 と 3 を別々にインストールしている場合は、pip3 または pip3.6 を使用してください。
すべてのニーズに合う単一のツールは存在せず、DumpsterDiver も例外ではありません。検索をカスタマイズするには次の2つの方法があります:
config.yaml ファイルの使用--min-key MIN_KEY - 分析する最小キー長を指定します(デフォルトは20)。--max-key MAX_KEY - 分析する最大キー長を指定します(デフォルトは80)。--entropy ENTROPY - 高エントロピーのしきい値を指定します(デフォルトは4.3)。また、単一単語内の文字のエントロピーを計算できる別個のスクリプトも追加されています。これにより、DumpsterDiver をニーズに合わせてより適切にカスタマイズできます。次のコマンドで確認できます:
$> python3 entropy.py f2441e3810794d37a34dd7f8f6995df4
この方法は、何を探しているかがわかっている場合に非常に便利です。以下にいくつかの例を示します:
$> python3 DumpsterDiver.py -p [PATH_TO_FOLDER] --min-key 40 --max-key 40 --entropy 4.3
$> python3 DumpsterDiver.py -p [PATH_TO_FOLDER] --min-key 66 --max-key 66 --entropy 5.1
$> python3 DumpsterDiver.py -p [PATH_TO_FOLDER] --min-key 76 --max-key 76 --entropy 5.1
aws_access_key_id または aws_secret_access_key の出現を探す場合:$> python3 DumpsterDiver.py -p ./test/ --grep-words *aws_access_key_id* *aws_secret_access_key* -a
grep ワードの前後にワイルドカードが意図的に使用されていることに注意してください。これにより、
"aws_access_key_id"やaws_access_key_id=のような表現も報告されます。
エントロピーを使用してパスワードを見つけるのはあまり効果的ではなく、多くの誤検出を発生させます。そのため、DumpsterDiver はハードコードされたパスワードを見つけるために異なるアプローチを採用しています。passwordmeter を使用してパスワードの複雑さを検証します。この検索をカスタマイズするには、次のコマンドを使用できます:
--min-pass MIN_PASS - 分析する最小パスワード長を指定します(デフォルトは8)。構文に -s フラグを追加する必要があります。--max-pass MAX_PASS - 分析する最大パスワード長を指定します(デフォルトは12)。構文に -s フラグを追加する必要があります。--pass-complex {1,2,3,4,5,6,7,8,9} - 1(簡単なパスワード)から9(非常に複雑なパスワード)までのパスワード複雑さのしきい値を指定します(デフォルトは8)。構文に -s フラグを追加する必要があります。例えば、複雑なパスワード(大文字、小文字、特殊文字、数字を含み、長さが10〜15文字)を見つけたい場合、次のコマンドを使用できます:
$> python3 DumpsterDiver.py -p [PATH_TO_FOLDER] --min-pass 10 --max-pass 15 --pass-complex 8
特定のファイルのスキャンをスキップしたい場合があります。そのために、次のパラメータを使用できます:
--exclude-files - 分析すべきでないファイル名または拡張子を指定します。ファイル拡張子には . 文字を含める必要があります(例:.pdf)。複数のファイル名と拡張子はスペースで区切ります。
--bad-expressions - 悪い表現を指定します。DumpsterDiver がファイル内にそのような表現を見つけた場合、そのファイルは分析されません。複数の悪い表現はスペースで区切ります。
複数のファイル名、悪い表現、または grep ワードを別のファイルを使用して指定する場合、次の bash のトリックを使用できます:
$> python3 DumpsterDiver.py -p ./test/ --exclude-files `while read -r line; do echo $line; done < blacklisted_files.txt`
複数のコマンドラインパラメータを使用する代わりに、上記のすべてのパラメータの値を config.yaml ファイルで一度に指定できます。
DumpsterDiver は高度な検索もサポートしています。ワイルドカードを使用した単純な grep に加えて、このツールでは条件を作成できます。例えば、企業メールの漏洩を探しているとします。さらに、少なくとも100件のメールアドレスを含む大規模な漏洩のみに関心があるとします。この目的のために、rules.yaml ファイルを次のように編集します:
filetype: [".*"]
filetype_weight: 0
grep_words: ["*@example.com"]
grep_words_weight: 10
grep_word_occurrence: 100
別のシナリオとして、.db または .sql ファイル内で「pass」、「password」、「haslo」、「hasło」(ポーランド企業のリポジトリを分析する場合)といった用語を探しているとします。その場合、rules.yaml ファイルを次のように変更することで実現できます:
filetype: [".db", ".sql"]
filetype_weight: 5
grep_words: ["*pass*", "*haslo*", "*hasło*"]
grep_words_weight: 5
grep_word_occurrence: 1
ルールは、合計重み(filetype_weight + grep_words_weight)が >=10 の場合にのみトリガーされることに注意してください。
DumpsterDiver の Docker イメージが利用可能です。次のように実行します:
$> docker run -v /path/to/my/files:/files --rm rzepsky/dumpsterdiver -p /files
設定ファイル(config.yaml または rules.yaml)の1つを上書きしたい場合:
$> docker run -v /path/to/my/config/config.yaml:/config.yaml /path/to/my/config/rules.yaml:/rules.yaml -v /path/to/my/files:/files --rm rzepsky/dumpsterdiver -p /files
より良いアイデアをお持ちですか?このプロジェクトを手伝っていただけますか?Twitter @Rzepsky でご連絡ください。ここに貢献者が来てくれるのをとても嬉しく思います!
このプロジェクトの開発を支援してくださったすべての方々に心から感謝します:
LICENSE ファイルを参照してください。