
AWS向けの自動化されたセキュリティ検出事項のエンリッチメントおよび影響評価ツール。リソースコンテキスト、関連付け、タグを用いて脆弱性データを強化し、優先順位付けされた修復のためのコンテキストに基づいた影響スコアを計算します。
MetaHub は、脆弱性管理のためのコンテキストに基づいたセキュリティ検出事項の充実化と影響評価を自動化するツールです。AWS Security Hub や ASFF 互換のセキュリティスキャナーと一緒に使用できます。意味のない重大度に頼るのはやめて、あなたのコンテキストに基づいた影響スコアの定義に切り替えましょう。
MetaHub は、影響コンテキストに基づいた脆弱性管理のためのオープンソースセキュリティツールです。あなたの環境とニーズ、すなわちコンテキストに基づいてセキュリティ検出事項をコンテキスト化するプロセスを自動化し、所有者を特定し、それに基づいて影響スコアを計算します。このスコアは、優先順位付け(どこから始めるべきか?)や、修復、アラート、チケットなどの自動化を定義するために使用できます。このツールはAWS環境向けで、AWS Security Hub または ASFF 互換のスキャナー(Prowler など)と一緒に使用できます。
ℹ️ 新しい Powerpipe を使用した MetaHub ダッシュボード を試して拡張しましょう!
MetaHub は、影響を受けるアカウント内の影響を受けるリソースに接続することで、あなたのコンテキストを記述します。AWS アカウントと組織、影響を受けるリソースのタグ、関連する CloudTrail イベント、影響を受けるリソースの設定、そしてそれらの関連付けすべてに関する情報を記述できます。EC2 インスタンスに影響するセキュリティ検出事項をコンテキスト化している場合、MetaHub はそのインスタンス自体だけでなく、その IAM ロールにも接続します。そこから、それらのロールに関連付けられた IAM ポリシーにも接続します。また、セキュリティグループとそのすべてのルール、インスタンスが実行されている VPC とサブネット、ボリューム、Auto Scaling グループなどにも接続します。フィルター を適用して、同じプロパティを持つ他のリソースを自動的に検出し、詳細な調査を行うことができます。
コンテキストからすべての情報を取得した後、MetaHub はすべてのリソースの影響条件を評価します:露出、アクセス、暗号化、ステータス、環境、アプリケーション、所有者。これらの計算に基づき、リソースに影響するセキュリティ検出事項 の情報とすべてをまとめて、MetaHub は各検出事項と影響を受けるリソースに対してスコアを生成します。
MetaHub によって生成された次のダッシュボードをご確認ください。影響を受けるリソース、それらに影響するすべてのセキュリティ検出事項のグループ化、各検出事項の元の重大度が表示されています。その後に、スコアと、そのスコアを生成するためにMetaHub が評価したすべての基準が表示されています。この情報はすべてフィルタリング、並べ替え、グループ化、ダウンロード、カスタマイズが可能です。
以下は EC2 インスタンスの JSON 出力 です。MetaHub がすべてのコンテキスト情報を associations、config、tags、account、cloudtrail の下にまとめて整理し、最後に impact キーにスコアと、そのスコアを生成するために評価されたすべての基準が含まれている様子をご確認ください。
MetaHub は、調査、抑制、更新、他のツールとの統合のために、セキュリティ検出事項を一覧表示、管理、出力するためのさまざまな方法を提供します。これは CLI ツールとして、または AWS Lambda 関数 などの自動化ワークフロー内で使用するように設計されています。さまざまな出力をサポートしており、一部はプログラム用 JSON ですが、強力な html、xlsx、csv も含まれており、これらはカスタマイズ可能です。
AWS Security Hub を使用している場合、MetaHub はシームレスに統合され、その機能を拡張します。Security Hub カスタムアクションとして使用したり、AWS Security Hub フィルターをサポートしたり、検出事項のワークフローステータスを管理したり、AWS Security Hub で直接検出事項を充実化することも可能です。
MetaHub は AWS で使用するように設計されており、マルチアカウント構成をサポートしています。AWS Security Hub の master アカウントと child/service アカウントにロールを引き受けることで、任意の環境からツールを実行できます。これにより、AWS Security Hub のマルチアカウント実装を使用して複数のアカウントから集約されたデータを取得すると同時に、影響を受けるリソースが実行されているアカウントからデータを取得して、それらの検出事項を充実化することもできます。詳細については Security Hub の設定 を参照してください。
デフォルトのフィルターで AWS Security Hub からセキュリティ検出事項を読み取り、デフォルトのコンテキストオプションを実行します。```bash ./metahub
AWS Security Hubから特定の(Idでフィルタリングされた)セキュリティ検出結果を読み取り、デフォルトのコンテキストオプションを実行します:```bash
./metahub --sh-filters Id=arn:aws:securityhub:us-east-1:123456789012:security-control/CloudFront.1/finding/8bd4d049-dcbc-445b-a5d1-595d8274b4c1
AWS Security Hubから、リソースに影響を与え、かつACTIVEであるすべてのセキュリティ検出結果を読み取り(ResourceIdとRecordStateでフィルタリング)、デフォルトのコンテキストオプションを実行します:```bash ./metahub --sh-filters RecordState=ACTIVE ResourceId=arn:aws:ec2:eu-west-1:123456789012:subnet/subnet-0b7d243ff90ebc03e
AwsAccountIdとRecordStateでフィルタリングされた、タグ`Environment`が値`stg`であるリソースに対して、AWSアカウントに影響を与えるACTIVEなセキュリティ検出結果をすべて読み取り、コンテキストオプション`config`と`tags`を実行します:```bash
./metahub --sh-filters RecordState=ACTIVE AwsAccountId=123456789012 --mh-filters-tags Environment=stg --context config tags
Prowlerからセキュリティ結果を入力ファイルとして読み取り、デフォルトのコンテキストオプションを実行します:```bash python3 prowler.py aws -M json-asff -q ./metahub --inputs file-asff --input-asff /path/to/prowler-findings.json.asff
Powerpipeからのセキュリティ検出結果を入力ファイルとして読み取り、デフォルトのコンテキストオプションを実行します:```bash
powerpipe benchmark run aws_compliance.benchmark.all_controls --export asff
./metahub --inputs file-asff --input-asff /path/to/powerpipe-findings.json.asff
Trivy からセキュリティ所見を入力ファイルとして読み取り、デフォルトのコンテキストオプションを実行します。```bash export AWS_REGION=us-west-1 export AWS_ACCOUNT_ID=012345678901 trivy image --format template --template "@contrib/asff.tpl" -o trivy-findings.json.asff public.ecr.aws/n2p8q5p4/metahub:stable ./metahub --inputs file-asff --input-asff /path/to/trivy-findings.json.asff
# Context
**MetaHub**において、**コンテキスト**とは、影響を受けるリソースに関する情報(**設定**、**関連付け**、**ログ**、**タグ**、**アカウント**など)を指します。
MetaHubは影響を受けるリソースだけでなく、関連付けられたリソースやアタッチされたリソースも分析します。例えば、セキュリティグループにセキュリティ検出結果がある場合、**MetaHub**はそのセキュリティグループと、それを使用しているEC2インスタンスなど、関連するすべてのものを分析します。関連付けられたリソースごとに、**MetaHub**はそのコンテキストを取得します。セキュリティグループがEC2インスタンスにアタッチされている場合、**MetaHub**はインスタンスとそのすべての関連付け(IAMロールやポリシーなど)を分析します。単一のセキュリティグループのセキュリティ検出結果から、**MetaHub**はセキュリティグループ、EC2インスタンス、IAMロール、IAMポリシーのコンテキストを取得します。これは、セキュリティ検出結果の影響を理解するために重要です。
**コンテキスト**モジュールには5つの主要な部分があります:[**config**](#config)([**associations**](#associations)を含む)、[**tags**](#tags)、[**cloudtrail**](#cloudtrail)、[**account**](#account)です。デフォルトでは**config**、**tags**、**account**のみが有効ですが、`--context`オプションを使用してこの動作を変更できます(例:すべてのコンテキストキーを有効にするには`--context config tags cloudtrail account`、configとassociationsキーのみを有効にするには`--context config`を使用)。
## Config
`config`キーの下には、影響を受けるリソースの重要な設定があります。例えば、影響を受けるリソースがS3バケットの場合、バケットポリシー、ACL、暗号化設定などに関する情報が含まれます。影響を受けるリソースがEC2インスタンスの場合、キー、パブリックおよびプライベートIP、メタデータなどに関する情報が含まれます。**MetaHub**が取得する設定情報はリソースタイプごとに定義されています。さらに設定情報を追加したい場合は、[contributing](#contributing)を参照してください。
`--mh-filters-config <key> {True/False}`オプションを使用して、config出力に基づいて検出結果をフィルタリングできます([config filters](#config-filters)を参照)。
<details>
<summary>S3バケットのconfigキーの例</summary>```json
"config": {
"resource_policy": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Test",
"Effect": "Allow",
"Principal": {
"Service": "config.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::metahub-bucket",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "123456789012"
}
}
},
]
},
"website_enabled": false,
"bucket_acl": [
{
"Grantee": {
"DisplayName": "gabriel.soltz",
"ID": "1234564bd76c6c64080717b68eafaa588b41706daaf22d3d0705b398bd7cbd57",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
],
"cannonical_user_id": "1234564bd76c6c64080717b68eafaa588b41706daaf22d3d0705b398bd7cbd57",
"public_access_block_enabled": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
},
"account_public_access_block_enabled": false,
"public": false,
"bucket_encryption": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
},
"BucketKeyEnabled": false
}
]
},
associationsキーには、影響を受けるリソースの関連リソースがすべて格納されています。例えば、影響を受けるリソースがEC2インスタンスの場合、セキュリティグループ、IAMロール、ボリューム、VPC、サブネット、Auto Scalingグループなどのリソースが見つかります。影響を受けるリソースがIAMロールの場合、IAMポリシー、IAMユーザー、IAMグループなどが含まれます。MetaHubは関連付けを見つけるたびに、関連リソースに再度接続し、そのコンテキストを取得します。関連付けは、セキュリティの検出事項のコンテキストと影響を理解するために重要です。
オプション --mh-filters-config <key> {True/False} を使用して、関連付けの出力に基づいて検出事項をフィルタリングできます(configフィルターを参照)。
tags キーの下には、影響を受けるリソースに関連付けられたすべてのタグを確認できます。MetaHub は AWS Resource Groups Tagging API に依存して、リソースに関連付けられたタグを問い合わせます。すべてのAWSリソースタイプがこのAPIをサポートしているわけではないことに注意してください。サポートされているサービスを確認できます。
タグは、コンテキストを理解する上で重要な要素です。タグ戦略には、多くの場合次のようなものが含まれます:
適切なタグ戦略に従えば、フィルタリングして興味深い出力を生成できます。例えば、特定のチームに関連するすべての結果をリストし、そのデータをそのチームに直接提供できます。
タグ出力に基づいて結果をフィルタリングするには、オプション --mh-filters-tags TAG=VALUE を使用できます(タグフィルターを参照)。
cloudtrailキーの下に、影響を受けたリソースに関連する重要なCloudTrailイベント(作成イベントなど)があります。検索対象となるCloudTrailイベントはリソースタイプごとに定義されており、設定ファイルresources.pyを編集することで追加、削除、変更が可能です。例えば、影響を受けたリソースがSecurity Groupタイプの場合、MetaHubは次のイベントを検索します:CreateSecurityGroup(セキュリティグループ作成イベント)とAuthorizeSecurityGroupIngress(セキュリティグループルール承認イベント)。
account キーの下には、影響を受けるリソースが実行されているアカウントに関する情報(AWS Organizations の一部かどうかや、連絡先情報など)があります。
MetaHubのインパクトモジュールは、影響を受けるリソースの7つの主要なプロパティ(露出、アクセス、暗号化、ステータス、環境、アプリケーション、所有者)を理解し、それらの値を、同じリソースに影響を与えるすべてのセキュリティ検出結果の値とそれらの重大度と組み合わせて、スコアを生成することに焦点を当てています。インパクトスコアは0から100までの数値で、100が最高のインパクトです。
露出は、影響を受けるリソースが他のネットワークに対してどのように公開されているかを評価します。たとえば、影響を受けるリソースが実質的に公開されているか、単に公開されているか、VPCの一部であるか、パブリックIPを持っているか、ファイアウォールやセキュリティグループで保護されているかなどです。
アクセスはリソースポリシーレイヤーを評価します。MetaHubは利用可能なすべてのポリシー(IAM管理ポリシー、IAMインラインポリシー、リソースポリシー、バケットACL、およびそのポリシーも分析されるIAMロールなどの他のリソースとの関連付け)をチェックします。無制限のポリシーは、それ自体の問題であるだけでなく、それを使用している他のリソースにも影響を与えます。
暗号化は各リソースタイプに基づいて異なる暗号化レイヤを評価します。例えば、一部のリソースでは、at_rest と in_transit の暗号化設定が両方とも有効かどうかを評価します。
| 可能なステータス | 値 | 説明 |
|---|---|---|
| 🔴 unencrypted |
ステータスは、影響を受けるリソースのアタッチメントや機能の状態を評価します。例えば、EC2インスタンスではリソースがrunning、stopped、またはterminatedかどうかを評価しますが、EBSボリュームやセキュリティグループのようなリソースでは、それらのリソースが他のリソースにアタッチされているかどうかを評価します。
環境は、影響を受けるリソースが実行されている環境を評価します。デフォルトでは、MetaHub は production、staging、development の3つの環境を定義していますが、必要に応じて環境の追加、削除、変更が可能です。MetaHub は、影響を受けるリソースのタグ、アカウント ID、またはアカウントエイリアスに基づいて環境を評価します。設定ファイルで独自の環境定義と戦略を定義できます(設定のカスタマイズ を参照)。
アプリケーションは、影響を受けるリソースが属するアプリケーションを評価します。MetaHubはAWSのmyApplications機能に依存しており、これはタグawsApplicationに依存しますが、例えばアプリケーションやサービスを定義するために使用する他のタグ(Serviceなど)を定義したり、アカウントIDやエイリアスに依存することで、この機能をコンテキストに基づいて拡張できます。アプリケーションの定義と戦略は設定ファイルで定義できます(カスタマイズ設定を参照)。
| ステータスの可能性 | 値 | 説明 |
|---|---|---|
| 🔵 不明 | - | リソースのアプリケーション確認ができませんでした。 |
Ownerは所有権の検出に焦点を当てています。さまざまな方法で影響を受けるリソースの所有者を特定できます。この情報を使用して、セキュリティ発見を正しい所有者に自動的に割り当てたり、エスカレーションしたり、この情報に基づいて意思決定を行うことができます。リソースの所有者を自動的に特定する方法は、セキュリティチームにとって重要です。それにより、最も重要な問題に集中し、自動化されたワークフローで可能な限り迅速に適切な担当者に割り当てることができます。所有者の定義と戦略は構成ファイルで定義できます(カスタマイズ構成を参照)。
| 可能なステータス | 値 | 説明 |
|---|---|---|
| 🔵 不明 | - | リソースの所有者を確認できませんでした。 |
インパクトスコアの計算の一環として、リソースに影響を与えるセキュリティ検出事項の総数とその重大度も評価します。この指標を算出するために以下の式を使用します。```sh (SUM of all (Finding Severity / Highest Severity) with a maximum of 1)
例えば、影響を受けるリソースに2つのファインディングがあり、1つは`HIGH`、もう1つは`LOW`の深刻度である場合、**Impact Findings Score**は次のようになります:```sh
SUM(HIGH (3) / CRITICAL (4) + LOW (0.5) / CRITICAL (4)) = 0.875
MetaHub は、AWS Security Hub または ASFF 互換のセキュリティスキャナーからセキュリティ検出結果を読み取ります。その後、影響を受けたアカウント内の該当リソースに直接クエリを実行して、追加のコンテキストを提供します。そのコンテキストに基づいて、影響を計算します。最後に、ニーズに応じて異なる出力を生成します。
MetaHub のユースケースには以下が含まれます:
MetaHub は設定ファイルを使用して、一部のチェックの動作、デフォルトフィルターなどをカスタマイズできるようにします。設定ファイルは lib/config/ にあります。
カスタマイズ可能な項目:
lib/config/configuration.py: このファイルには MetaHub のデフォルト設定が含まれています。デフォルトのフィルター、デフォルトの出力モード、環境定義などを変更できます。
lib/config/impact.py: このファイルには影響評価基準の値とその重みが含まれています。必要に応じて値と重みを変更できます。
lib/config/reources.py: このファイルには、すべてのリソースタイプの定義(例:どの CloudTrail イベントを探すか)が含まれています。
MetaHub は Python3 プログラムです。システムに Python3 がインストールされ、requirements.txt ファイルに記述されている必要な Python モジュールがインストールされている必要があります。
要件は、手動で(pip3 を使用して)または Python 仮想環境(推奨方法)を使用してシステムにインストールできます。
git clone [email protected]:gabrielsoltz/metahub.gitcd metahubpython3 -m venv venv/metahubsource venv/metahub/bin/activatepip3 install -r requirements.txt./metahub -hdeactivate次回以降は、プログラムを使用するために手順 4 と 6 のみが必要です。
または、Docker を使用してこのツールを実行することもできます。
MetaHub は Docker イメージとしても利用可能です。公開 Docker イメージから直接実行するか、ローカルでビルドできます。
MetaHub コンテナで利用可能なタグは次のとおりです:
latest: master ブランチと同期<x.y.z>: リリースは こちら で確認できますstable: このタグは常に最新のリリースを指します。公開レジストリから実行するには、次のコマンドを実行できます:```sh docker run -ti public.ecr.aws/n2p8q5p4/metahub:latest ./metahub -h
## AWS認証情報とDocker
すでにAWSホストマシンにログインしている場合、同じ認証情報をDockerコンテナ内でシームレスに使用できます。これは、必要な環境変数をコンテナに渡すか、認証情報ファイルをマウントすることで実現できます。
たとえば、次のコマンドを実行します。```sh
docker run -e AWS_DEFAULT_REGION -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN -ti public.ecr.aws/n2p8q5p4/metahub:latest ./metahub -h
一方、ホストマシンにログインしていない場合は、コンテナ内で再度ログインする必要があります。
または、ローカルでビルドすることもできます:```sh git clone [email protected]:gabrielsoltz/metahub.git cd metahub docker build -t metahub . docker run -ti metahub ./metahub -h
# Lambdaでの実行
**MetaHub** は Lambda/Serverless 対応です!追加のインフラストラクチャなしで、MetaHub を AWS Lambda 関数上で直接実行できます。
Lambda 関数で MetaHub を実行すると、定義したトリガーに基づいて実行を自動化できます。例えば、以下が可能です:
- 新しいセキュリティ検出結果があるたびに MetaHub Lambda 関数をトリガーし、その検出結果を AWS Security Hub にリッチ化して反映させる。
- 新しいセキュリティ検出結果があるたびに MetaHub Lambda 関数をトリガーし、コンテキストに基づいて抑制する。
- MetaHub Lambda 関数をトリガーし、コンテキストに基づいてセキュリティ検出結果の影響を受ける所有者を特定し、社内システムを使用して割り当てる。
- MetaHub Lambda 関数をトリガーし、リッチ化されたコンテキストを含むチケットを作成する。
## Lambda のデプロイ
Lambda 関数をデプロイするための Terraform コードは `terraform/` フォルダに用意されています。
以下のコマンドを実行するだけです:```sh
cd terraform
terraform init
terraform apply
このコードは、Lambdaコード用のzipファイルと、Lambdaレイヤーとして使用するPython依存関係用のzipファイルを作成します。また、Lambda関数と必要なリソースもすべて作成します。
Terraformコードは、Security Hubカスタムアクションと、カスタムアクションが実行されたときにLambda関数をトリガーするEventBridgeルールも作成します。以下を参照してください。
LambdaのMetaHubオプションは、ファイルlib/lambda.pyを編集してカスタマイズできます。フィルター、Meta*オプションなど、MetaHubのデフォルトオプションを変更できます。
Terraformは、Lambda関数がローカル(同じアカウント内)で実行するために必要な最小限の権限を作成します。Lambdaに他のアカウントのロールを引き受けさせたい場合(たとえば、他のアカウントからの検出結果を集約しているSecurity HubマスターアカウントでLambdaを実行する場合など)、Lambda関数の設定にオプション --mh-assume-role を追加し(前の手順を参照)、対応するポリシーをLambdaのロールに追加して、Lambdaがそのロールを引き受けられるようにする必要があります。
MetaHub は、Security Hubカスタムアクションとして実行できます。これにより、選択した検出結果、または選択した一連の検出結果に対して、Security Hubコンソールから直接MetaHubを実行できます。
カスタムアクションは、Lambda関数をトリガーし、そのLambda関数が選択された検出結果に対してMetaHubを実行します。
Security Hubカスタムアクションを使用してLambdaをトリガーすると、Lambdaはそのコンテキストのために選択された検出結果を読み取り、各検出結果に対して1回ずつ実行されます。デフォルトでは、検出結果に対してアクションは実行されませんが、この動作は変更できます。Lambdaの動作をカスタマイズするを参照してください。
Security Hubカスタムアクションは、Terraformコードの一部としてデプロイされます。詳細については、Lambdaのデプロイを参照してください。
ローカルマシン(またはMetaHubを実行する場所)にAWS認証情報が設定されていることを確認してください。
たとえば、aws configureオプションを使用できます。```sh
aws configure
または、資格情報を環境変数にエクスポートすることもできます。```sh
export AWS_DEFAULT_REGION="us-east-1"
export AWS_ACCESS_KEY_ID= "ASXXXXXXX"
export AWS_SECRET_ACCESS_KEY= "XXXXXXXXX"
export AWS_SESSION_TOKEN= "XXXXXXXXX"
シングルAWSアカウント構成(AWS Security Hubが異なるアカウントからの検出結果を集約していない)でMetaHubを実行している場合、追加のオプションは必要ありません。MetaHubは環境内の認証情報を使用します。ただし、IAM設計上必要な場合は、ログインしている同じアカウントでロールを引き受けることも可能です。その場合は、--sh-assume-roleオプションでロールを指定し、--sh-accountにログインしているAWSアカウントIDと同じ値を指定してください。
--sh-region: Security Hubが実行されているAWSリージョン。リージョンを指定しない場合、環境で設定されているリージョンが使用されます。AWS Security Hubのクロスリージョン集約を使用している場合は、そのリージョンを--sh-regionオプションとして指定することで、すべての検出結果をまとめて取得できます。
--sh-account および --sh-assume-role: Security Hubが実行されているAWSアカウントIDと、そのアカウントで引き受けるAWS IAMロール。これらのオプションは、ログインしているAWSアカウントとは異なるアカウントでAWS Security Hubが実行されている場合や、複数のAWSアカウント構成でAWS Security Hubを実行している場合に役立ちます。両方のオプションを一緒に使用する必要があります。指定するロールには、AWS Security Hubで検出結果を取得および更新(必要な場合)するための十分なポリシーが必要です。--sh-accountを指定しない場合、MetaHubはログインしているアカウントを使用します。
--sh-profile: AWS Security Hubに使用するAWSプロファイル名を指定することもできます。このオプションを使用する場合、--sh-accountや--sh-assume-roleを指定する必要はありません。MetaHubはプロファイルの認証情報を使用します。--sh-accountとを使用する場合、それらのオプションがよりも優先されます。
これは、AWS Security Hubから読み取りおよび書き込みを行うために必要な最小限のIAMポリシーです。MetaHubで検出結果を更新する必要がない場合は、securityhub:BatchUpdateFindingsアクションを削除しても構いません。```sh
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"security hub:GetFindings",
"security hub:ListFindingAggregators",
"security hub:BatchUpdateFindings",
"iam:ListAccountAliases"
],
"Resource": [
"*"
]
}
]
}
# コンテキストの設定
複数のAWSアカウント設定(AWS Security Hubが複数のAWSアカウントからの検出結果を集約している)でMetaHubを実行している場合、影響を受けるリソースがAWS Security Hubの検出結果と同じAWSアカウントに存在しないため、コンテキストクエリで引き受けるロールを指定する必要があります。`--mh-assume-role` は、影響を受けるアカウント内のリソースに直接接続するために使用されます。このロールには、リソースを記述できる十分なポリシーが必要です。
## コンテキスト用IAMポリシー
コンテキストに必要な最小ポリシーには、管理ポリシー `arn:aws:iam::aws:policy/SecurityAudit` と以下のアクションが含まれます:
- `tag:GetResources`
- `lambda:GetFunction`
- `lambda:GetFunctionUrlConfig`
- `cloudtrail:LookupEvents`
- `account:GetAlternateContact`
- `organizations:DescribeAccount`
- `iam:ListAccountAliases`
# 入力
MetaHubは、AWS Security HubのAPIを使用してセキュリティ検出結果を直接読み取ることができます。Security Hubを使用していない場合は、ASFF互換のスキャナーを使用できます。ほとんどのクラウドセキュリティスキャナーは、Prolwer、Steampipe、TrivyなどのASFF形式をサポートしています。
入力ASFFファイルから読み取る場合は、オプション(`--inputs file-asff`)を使用してファイルのパスを指定する必要があります。スペースで区切って複数のファイルを指定できます。:```sh
./metahub.py --inputs file-asff --input-asff path/to/the/file.json.asff path/to/the/file2.json.asff
また、AWS Security Hubの検出結果と入力ASFFファイルを組み合わせて、両方の入力を指定することもできます(--inputs file-asff securityhub)。MetaHubはすべての検出結果を一緒に処理し、単一の出力を生成します。:```sh
./metahub.py --inputs file-asff securityhub --input-asff path/to/the/file.json.asff
ファイルを入力として使用する場合、検出結果をフィルタリングするためのオプション `--sh-filters` は使用できません。このオプションは AWS API に依存してフィルタリングを行うためです。また、`--update-findings` や `--enrich-findings` のオプションは使用できません。これらの検出結果は AWS Security Hub に存在しないためです。両方のソースから同時に読み取る場合、AWS Security Hub からの検出結果のみが更新されます。
MetaHub は、ASFF 形式が正しくフォーマットされていない場合のための **修正メカニズム** も実装しています。これは、ASFF を可能な限り有用にするためのベストエフォートアプローチですが、完璧ではなく、ソーススキャナーで修正される必要があります。
- キー `Region` が Resources および Root Level に存在しない場合、MetaHub は影響を受けるリソースの ARN に基づいてリージョンを計算します。
- ASFF ファイルが ASFF リソースタイプを正しく設定していない場合、MetaHub はライブラリ [aws-arn](https://github.com/gabrielsoltz/aws-arn) を使用して、影響を受けるリソースの ARN に基づいてリソースタイプを計算します。
- `SeverityLabel`、`Workflow`、`RecordState`、`Compliance`、`Id`、`ProductArn`、`StandardsControlArn` などの他のフィールドが欠落している場合、MetaHub はそれらを `Unknown` に設定します。
# 出力
**MetaHub** は、さまざまなプログラム的および視覚的出力を生成できます。デフォルトでは、すべての出力モードが有効です: `json-short`、`json-full`、`json-statistics`、`json-inventory`、`html`、`csv`、`xlsx`。特定の出力モードのみを生成したい場合は、オプション `--output-modes` を使用して目的の出力モードを指定できます。出力は、実行日時とともに `outputs/` フォルダに保存されます。
例えば、出力 `json-short` のみを生成したい場合は、次のようにします:```sh
./metahub.py --output-modes json-short
json-short、json-full、htmlの出力を生成したい場合は、次のように使用できます:```sh
./metahub.py --output-modes json-short json-full html
**MetaHub** は、同じリソースに影響するセキュリティ検出結果を `findings` キーの下にまとめて整理することで、シャドーイング(2つのチェックが同じ問題を参照しているが、一方が他方よりも汎用的な方法である場合)と重複(複数のスキャナーを使用し、複数のスキャナーから同じ問題が発生する場合)を避けようとしています。この動作は、出力 `json-short`、`json-full`、`html` で明確に確認できます。
- [JSON](#json)
- [HTML](#html)
- [CSV](#csv)
- [XLSX](#xlsx)
- [SQLite](#sqlite)
## JSON
> :info: JSON 出力を対話的に探索するには、ツール [fx](https://github.com/antonmedv/fx) を使用できます。
### JSON-Full
影響を受けるリソースを、その ARN をキーとして表示し、それに影響する検出結果を `findings` キーの下にリストとして表示します。検出結果に加えて、次のキーも取得できます: `ResourceType`、`Region`、`AwsAccountId`、`associations`、`config`、`tags`、`account`、`cloudtrail`、および `impact`。```json
"arn:aws:ec2:eu-west-1:1234567890:instance/i-0a40b2be25dbac0ac": { --> The affected resource ARN
"findings": [ --> The findings affecting the resource
{
"EC2 instances should use Instance Metadata Service Version 2 (IMDSv2)": { --> The finding title
"SeverityLabel": "HIGH", --> The finding severity label
"Workflow":{ --> The finding workflow
"Status": "NEW",
},
"RecordState": "ACTIVE", --> The finding record state
"Compliance":{ --> The finding compliance
"Status": "FAILED",
},
"Id": "arn:aws:securityhub:eu-west-1:123456789012:security-control/EC2.8/finding/a1d4f19f-453e-4c3c-b486-8443c73e84f1",
"ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/securityhub",
}
},
{"EC2 instances should be managed by AWS Systems Manager": {...}}, --> Another finding title
{"EC2 instances should not have a public IPv4 address": {...}} --> Another finding title
],
"ResourceType": "AwsEc2Instance", --> The affected resource type
"Region": "eu-west-1", --> The affected resource region
"AwsAccountId": "1234567890", --> The affected resource account id
"associations": { --> The associations of the affected resource
"security_groups": {}, --> The security groups associated with the affected resource
"iam_roles": {}, --> The IAM roles associated with the affected resource
"volumes": {}, --> The volumes associated with the affected resource
"autoscaling_groups": {}, --> The autoscaling groups associated with the affected resource
"vpcs": {}, --> The VPCs associated with the affected resource
"subnets": {}, --> The subnets associated with the affected resource
},
"config": { --> The configuration of the affected resource (based on it's type)
"public_ip": "200.200.200.200", --> The public IP of the affected resource, if any
"private_ip": "10.10.10.10", --> The private IP of the affected resource, if any
"key": "ssh-key", --> The key used for the affected resource, if any
"metadata_options": { --> The metadata options of the affected resource, if any
"State": "applied",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 1,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
},
},
"tags": { --> The tags of the affected resource
"Name": "test", --> The tag key and value
"Env": "prod",
"awsApplication": "arn:aws:resource-groups:eu-west-1:1234567890:group/app1/0c8vpbjkzeeffsz2cqgxpae7b2"
},
"account": { --> The account of the affected resource
"Alias": "prod", --> The account alias
"AlternateContact": {}, --> The alternate contact of the account, if any
"Organizations": { --> The organization of the account, if any
"Id": "o-1234567890",
"Arn": "arn:aws:organizations::1234567890:organization/o-1234567890/o-1234567890",
"MasterAccountId": "1234567890",
"MasterAccountArn": "arn:aws:organizations::1234567890:account/o-1234567890/1234567890",
"MasterAccountEmail": "",
"Details": {
"ParentId": "p-k1234567890",
"ParentType": "ROOT",
"OU": "ROOT",
"Policies": { --> The policies of the account, if any
"p-FullAWSAccess": {...} --> The policy name and policy
}
}
},
},
"cloudtrail": { --> The CloudTrail events affecting the affected resource
"RunInstances": { --> The CloudTrail event name
"Username": "test", --> The username of the event, if any
"EventTime": "2021-01-01T00:00:00Z",
"EventId": "12345678-1234-1234-1234-123456789012",
}
},
"impact": { --> The impact of the affected resource
"exposure": {...}, --> The exposure impact
"access": {...}, --> The access impact
"encryption": {...}, --> The encryption impact
"status": {...}, --> The status impact
"environment": {...}, --> The environment impact
"application": {...}, --> The application impact
"owner": {...}, --> The owner impact
"findings": {...}, --> The findings impact
"score": {...} --> The total impact score
}
}
影響を受けるリソースを、ARNをキーとして表示し、そのリソースに影響を与える findings を findings キーの下にリストとして表示します。findings に加えて、以下のキーも取得できます: ResourceType, Region, AwsAccountId, associations, config, tags, account, cloudtrail, impact.```json
"arn:aws:ec2:eu-west-1:1234567890:instance/i-0a40b2be25dbac0ac": { --> The affected resource ARN
"findings": [ --> The findings affecting the resource
"EC2 instances should use Instance Metadata Service Version 2 (IMDSv2)", --> The finding title
"EC2 instances should be managed by AWS Systems Manager", --> The finding title
"EC2 instances should not have a public IPv4 address" --> The finding title
],
"ResourceType": "AwsEc2Instance", --> The affected resource type
"Region": "eu-west-1", --> The affected resource region
"AwsAccountId": "1234567890", --> The affected resource account id
"associations": { --> The associations of the affected resource
"security_groups": {}, --> The security groups associated with the affected resource
"iam_roles": {}, --> The IAM roles associated with the affected resource
"volumes": {}, --> The volumes associated with the affected resource
"autoscaling_groups": {}, --> The autoscaling groups associated with the affected resource
"vpcs": {}, --> The VPCs associated with the affected resource
"subnets": {}, --> The subnets associated with the affected resource
},
"config": { --> The configuration of the affected resource (based on it's type)
"public_ip": "200.200.200.200", --> The public IP of the affected resource, if any
"private_ip": "10.10.10.10", --> The private IP of the affected resource, if any
"key": "ssh-key", --> The key used for the affected resource, if any
"metadata_options": { --> The metadata options of the affected resource, if any
"State": "applied",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 1,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
},
},
"tags": { --> The tags of the affected resource
"Name": "test", --> The tag key and value
"Env": "prod",
"awsApplication": "arn:aws:resource-groups:eu-west-1:1234567890:group/app1/0c8vpbjkzeeffsz2cqgxpae7b2"
},
"account": { --> The account of the affected resource
"Alias": "prod", --> The account alias
"AlternateContact": {}, --> The alternate contact of the account, if any
"Organizations": { --> The organization of the account, if any
"Id": "o-1234567890",
"Arn": "arn:aws:organizations::1234567890:organization/o-1234567890/o-1234567890",
"MasterAccountId": "1234567890",
"MasterAccountArn": "arn:aws:organizations::1234567890:account/o-1234567890/1234567890",
"MasterAccountEmail": "",
"Details": {
"ParentId": "p-k1234567890",
"ParentType": "ROOT",
"OU": "ROOT",
"Policies": { --> The policies of the account, if any
"p-FullAWSAccess": {...} --> The policy name and policy
}
}
},
},
"cloudtrail": { --> The CloudTrail events affecting the affected resource
"RunInstances": { --> The CloudTrail event name
"Username": "test", --> The username of the event, if any
"EventTime": "2021-01-01T00:00:00Z",
"EventId": "12345678-1234-1234-1234-123456789012",
}
},
"impact": { --> The impact of the affected resource
"exposure": {...}, --> The exposure impact
"access": {...}, --> The access impact
"encryption": {...}, --> The encryption impact
"status": {...}, --> The status impact
"environment": {...}, --> The environment impact
"application": {...}, --> The application impact
"owner": {...}, --> The owner impact
"findings": {...}, --> The findings impact
"score": {...} --> The total impact score
}
}
### JSON-Inventory
すべてのリソースとそのARNのリストを表示します。```json
[
"arn:aws:sagemaker:us-east-1:ofuscated:notebook-instance/obfuscated",
"arn:aws:sagemaker:eu-west-1:ofuscated:notebook-instance/obfuscated"
]
各フィールド/値の統計を表示します。出力では、各フィールド/値とその出現回数が表示されます。例えば、以下の出力は6件の結果の統計を示しています。```json { "Title": { "SageMaker.1 Amazon SageMaker notebook instances should not have direct internet access": 2, "SageMaker.2 SageMaker notebook instances should be launched in a custom VPC": 2, "SageMaker.3 Users should not have root access to SageMaker notebook instances": 2 }, "SeverityLabel": { "HIGH": 6 }, "Workflow": { "NEW": 6 }, "RecordState": { "ACTIVE": 6 }, "Compliance": { "FAILED": 6 }, "ProductArn": { "arn:aws:security hub:eu-west-1::product/aws/security hub": 3, "arn:aws:security hub:us-east-1::product/aws/security hub": 3 }, "ResourceType": { "AwsSageMakerNotebookInstance": 6 }, "AwsAccountId": { "obfuscated": 6 }, "Region": { "eu-west-1": 3, "us-east-1": 3 }, "ResourceId": { "arn:aws:sagemaker:eu-west-1:ofuscated:notebook-instance/obfuscated": 3, "arn:aws:sagemaker:us-east-1:ofuscated:notebook-instance/obfuscated": 3 } }
## HTML
リッチなHTMLレポートを作成し、あなたのコンテキストをその一部として追加することができます。
HTMLレポートは多くの方法でインタラクティブです:
- 列の追加/削除が可能です
- 任意の列でソートおよびフィルタリングが可能です
- 任意の列で自動フィルタリングが可能です
- 検出結果のグループ化/グループ解除が可能です
- そのデータをxlsx、CSV、HTML、およびJSONでダウンロードすることもできます
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/21d785d2413698ed7cb3e9dc7e9b51dc6550395a598d777abc9fc358f8a23573.png" alt="HTML表示例"/>
</p>
## CSV
CSVレポートを作成し、あなたのコンテキストをその一部として追加することができます。
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/66f15350123702e1cc317e47938401853bdcb1d86dad0ad4e48e73f15e00dd76.png" alt="CSV表示例"/>
</p>
## XLSX
CSVと似ていますが、より多くのフォーマットオプションがあります。
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/953a77917dc5b06e5185e6cb882ba7e711d785861e184599f10cd472efc42db9.png" alt="XLSX表示例"/>
</p>
## HTML、CSV、XLSX出力のカスタマイズ
`--output-tag-columns` および `--output-config-columns`(列のリストとして)オプションを使用して、HTML、CSV、XLSX出力でコンテキストキーを列として展開する方法をカスタマイズできます。指定したキーが対象リソースに存在しない場合、それらは空になります。デフォルトでは、設定ファイルでこれらの列を設定することもできます([設定のカスタマイズ](#customizing-configuration)を参照)。
例えば、タグを含むHTML出力を生成し、レポートに「Owner」と「Environment」を列として追加するには、次のようにします:```sh
./metahub --output-modes html --output-tag-columns Owner Environment
MetaHub は、検出結果とコンテキストを SQLite データベースに保存できます。このデータベースは、さらなる分析、レポート作成、および Powerpipe のような他のツールとの統合に使用できます。データベースは、実行日時と拡張子 .db を付けて outputs/ フォルダに保存されます。
MetaHub が生成した SQLite データベースを Powerpipe で使用できます。MetaHub PowerPipe モジュールは powerpipe/ フォルダにあります。
使用するには、システムに Powerpipe が インストールされている 必要があります。
インストール後、以下のコマンドを実行できます:```sh powerpipe server --database sqlite:../outputs/metahub-20240331-182942.db
### 独自のダッシュボードを構築する
Powerpipe を使ってダッシュボードを構築するのはとても簡単で強力です。詳細については、[Powerpipe ドキュメント](https://powerpipe.io/docs) を参照してください。
以下に、SQLite データベースで利用可能なテーブルを示します。
#### リソース
| カラム名 | データ型 | 説明 |
| ------------------------------- | -------- | ---------------------------------------------------------------------------------------- |
| resource_arn | VARCHAR | リソースの Amazon リソース名 (ARN)。プライマリキーとして機能します。 |
| resource_type | VARCHAR | リソースのタイプ。 |
| resource_region | VARCHAR | リソースが配置されているリージョン。 |
| resource_account_id | VARCHAR | リソースに関連付けられたアカウント ID。accounts(account_id) を参照する外部キー。 |
| resource_account_alias | VARCHAR | リソースに関連付けられたアカウントのエイリアス。 |
| resource_tags | TEXT | リソースに関連付けられたタグ。 |
| resource_exposure | VARCHAR | リソースの露出レベル。 |
| resource_access | VARCHAR | リソースのアクセスレベル。 |
| resource_encryption | VARCHAR | リソースの暗号化ステータス。 |
| resource_status | VARCHAR | リソースの現在のステータス。 |
| resource_application | VARCHAR | リソースに関連付けられたアプリケーション。 |
| resource_environment | VARCHAR | リソースが属する環境 (例: 本番、ステージング)。 |
| resource_owner | VARCHAR | リソースの所有者。 |
| resource_score | INTEGER | リソースに関連付けられたスコア。 |
| resource_findings_score | INTEGER | リソースに関連する検出結果に基づくスコア。 |
| resource_findings_critical | INTEGER | 重大な検出結果の数。 |
| resource_findings_high | INTEGER | 高重大度の検出結果の数。 |
| resource_findings_medium | INTEGER | 中重大度の検出結果の数。 |
| resource_findings_low | INTEGER | 低重大度の検出結果の数。 |
| resource_findings_informational | INTEGER | 情報提供の検出結果の数。 |
#### 検出結果
| カラム名 | データ型 | 説明 |
| ------------------------ | -------- | ----------------------------------------------------------------- |
| finding_id | VARCHAR | 検出結果の一意の識別子。プライマリキーとして機能します。 |
| finding_title | VARCHAR | 検出結果のタイトル。 |
| finding_severity | VARCHAR | 検出結果の重大度。 |
| finding_workflowstatus | VARCHAR | 検出結果のワークフローステータス。 |
| finding_recordstate | VARCHAR | 検出結果のレコード状態。 |
| finding_compliancestatus | VARCHAR | 検出結果のコンプライアンスステータス。 |
| finding_productarn | VARCHAR | 検出結果を生成する製品の ARN。 |
| finding_resource_arn | VARCHAR | 関連するリソースの ARN。 |
#### アカウント
| カラム名 | データ型 | 説明 |
| ------------------------------- | -------- | --------------------------------------------------------------------------- |
| account_id | INTEGER | アカウントの一意の識別子。プライマリキーとして機能します。 |
| account_alias | VARCHAR | アカウントのエイリアス。 |
| account_organizations_id | VARCHAR | アカウントが属する組織の ID。 |
| account_organizations_arn | VARCHAR | アカウントが属する組織の ARN。 |
| account_master_account_id | VARCHAR | このアカウントが AWS Organizations の一部である場合のマスターアカウントの ID。 |
| account_master_account_email | VARCHAR | マスターアカウントに関連付けられたメールアドレス。 |
| account_alternate_contact_type | VARCHAR | 代替連絡先のタイプ (例: 請求、セキュリティ)。 |
| account_alternate_contact_name | VARCHAR | 代替連絡先の名前。 |
| account_alternate_contact_email | VARCHAR | 代替連絡先のメールアドレス。 |
| account_alternate_contact_phone | VARCHAR | 代替連絡先の電話番号。 |
| account_alternate_contact_title | VARCHAR | 代替連絡先の役職。 |
# フィルター
ソースから取得するセキュリティ検出結果やリソースをさまざまな方法でフィルタリングし、それらをすべて組み合わせて目的のものを正確に取得できます。その後、それらのフィルターを再利用して、自動化、アラート、レポートなどを作成できます。
- [Security Hub フィルタリング](#security-hub-filtering)
- [YAML テンプレートを使用した Security Hub フィルタリング](#security-hub-filtering-using-yaml-templates)
- [Config フィルター](#config-filters)
- [タグフィルター](#tags-filters)
- [影響フィルター](#impact-filters)
## Security Hub フィルタリング
MetaHub は、オプション `--sh-filters` を使用して、AWS CLI でフィルタリングするのと同じ方法で AWS Security Hub の検出結果を `KEY=VALUE` 形式でフィルタリングすることをサポートしていますが、`EQUALS` 比較に限定されます。別の比較を行いたい場合は、オプション `--sh-template` [YAML テンプレートを使用した Security Hub フィルタリング](#security-hub-filtering-using-yaml-templates) を使用してください。
利用可能なフィルターは [AWS ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/securityhub.html#SecurityHub.Client.get_findings) で確認できます。```sh
./metahub --sh-filters <KEY=VALUE>
フィルタを指定しない場合、デフォルトのフィルタが適用されます:RecordState=ACTIVE WorkflowStatus=NEW
このオプションを使用してフィルタを渡すと、デフォルトのフィルタはリセットされます。デフォルトのフィルタにフィルタを追加したい場合は、デフォルトのフィルタに加えてそれらを指定する必要があります。例えば、SeverityLabelをデフォルトのフィルタに追加する場合:```sh ./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW
If a value contains spaces, you should specify it using double quotes: `"ProductName="Security Hub"`
You can add how many different filters you need to your query and also add the same filter key with different values:
Examples:
- Filter by Severity (CRITICAL):```sh
./metaHub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW SeverityLabel=CRITICAL
- 重要度とAWSアカウントでフィルタリング:```sh
./metaHub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW SeverityLabel=CRITICAL AwsAccountId=1234567890
- AWSリソースタイプでフィルタリング:```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup
- Finding Idでフィルター:```sh
./metahub --sh-filters Id="arn:aws:security hub:eu-west-1:01234567890:subscription/aws-foundational-security-best-practices/v/1.0.0/EC2.19/finding/01234567890-1234-1234-1234-01234567890"
## YAMLテンプレートを使用したSecurity Hubフィルタリング
**MetaHub**を使うと、必要に応じて再利用可能なYAMLファイル(テンプレート)を使用して複雑なフィルターを作成できます。YAMLテンプレートでは、"EQUALS' | 'PREFIX' | 'NOT_EQUALS' | 'PREFIX_NOT_EQUALS"など、AWS Security Hubでサポートされている任意の比較演算子を使用してフィルターを記述できます。YAMLファイルを呼び出すには、`--sh-template <<FILE>>`オプションを使用します。
例は[templates](https://github.com/gabrielsoltz/metahub/blob/HEAD/templates)フォルダにあります。
- YAMLテンプレートdefault.ymlを使用したフィルター:```sh
./metaHub --sh-template templates/default.yml
MetaHub は Config フィルター (および関連付け) をサポートしており、KEY=VALUE を使用します。値は True または False のみで、オプション --mh-filters-config を使って指定します。必要な数のフィルターをスペースで区切って使用できます。複数のフィルターを指定した場合、すべてのフィルターに一致するリソースのみが取得されます。
Config フィルターは True または False の値のみをサポートします:
True またはデータが存在することを意味します。False またはデータが存在しないことを意味します。Config フィルターは AWS Security Hub フィルターの後に実行されます:
--sh-filters (またはデフォルトのフィルター) で指定したフィルターに基づいて AWS Security Findings を取得します。--mh-filters-config に一致するリソースのみを表示するため、ポイント 1 のリソースのサブセットになります。例:
RecordState=ACTIVE WorkflowStatus=NEW) の AWS Security Hub 検出結果を持つ、かつネットワークインターフェースに関連付けられている (network_interfaces=True) 場合のみ、すべてのセキュリティグループ (ResourceType=AwsEc2SecurityGroup) を取得する:```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup --mh-filters-config network_interfaces=True- すべてのS3バケット(`ResourceType=AwsS3Bucket`)を、それらがパブリックである場合にのみ取得する(`public=True`):```sh
./metahub --sh-filters ResourceType=AwsS3Bucket --mh-filters-config public=False
MetaHub は、KEY=VALUE 形式の タグフィルター をサポートしています。KEY はタグ名、value はタグ値です。フィルターは必要な数だけ使用でき、スペースで区切ります。複数のフィルターを指定すると、少なくとも1つのフィルターに一致するすべてのリソースが表示されます。
タグフィルターは、AWS Security Hub フィルターの後に実行されます:
--sh-filters で指定したフィルター(またはデフォルトのフィルター)に基づいて AWS Security Findings を取得します。--mh-filters-tags に一致するリソースのみを表示します。つまり、ポイント1で得られたリソースのサブセットです。例:
Environment と値 Production が付いている場合にのみ、ACTIVE かつ NEW の AWS Security Hub フィンドを持つすべてのセキュリティグループ(ResourceType=AwsEc2SecurityGroup)を取得します(RecordState=ACTIVE WorkflowStatus=NEW):```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup --mh-filters-tags Environment=Production## インパクトフィルター
**MetaHub**は**インパクトフィルター**をサポートしており、MetaHubが計算した[インパクトキー](#impact)でフィルタリングできます。必要な数だけフィルターを使用でき、スペースで区切ります。複数のフィルターを指定すると、**すべて**のフィルターに一致するリソースのみが取得されます。
例:
- 露出が effectively-public と計算されたリソースに影響するすべてのセキュリティ検出結果をフィルタリング:```sh
./metahub --mh-filters-impact exposure=effectively-public
# Security Hub アクション
## ワークフローステータスの更新
**MetaHub** を使用して、AWS Security Hub の検出結果のワークフローステータス(`NOTIFIED`、`NEW`、`RESOLVED`、`SUPPRESSED`)を単一のコマンドで更新できます。MetaHub クエリのすべての検出結果を更新するには、`--update-findings` オプションを使用します。つまり、1 つ、10 個、または数千の検出結果を 1 つのコマンドだけで更新できるということです。AWS Security Hub API は更新ごとに 100 件の検出結果に制限されています。MetaHub は、この制限を回避するために結果を 100 件ずつのチャンクに分割し、検出結果をその数に関わらず更新します。
例えば、次のフィルターを使用した場合:`./metahub --sh-filters ResourceType=AwsSageMakerNotebookInstance RecordState=ACTIVE WorkflowStatus=NEW`、影響を受ける 2 つのリソースがあり、それぞれに 3 件の検出結果が存在し、合計で 6 件の Security Hub 検出結果が見つかりました。
次の更新コマンドを実行すると、それら 6 件の検出結果のワークフローステータスがノート付きで `NOTIFIED` に更新されます:```sh
./metahub --update-findings Workflow=NOTIFIED Note="Enter your ticket ID or reason here as a note that you will add to the finding as part of this update."
--update-findings は、検出結果を更新する前に確認を求めます。この確認は --no-actions-confirmation オプションを使用してスキップできます。
MetaHub を使用して、--enrich-findings オプションで AWS Security Hub の検出結果に Context 出力を反映(エンリッチ)できます。検出結果をエンリッチするとは、AWS Security Hub 内で直接更新することを意味します。MetaHub はこのために UserDefinedFields フィールドを使用します。
検出結果を AWS Security Hub 内で直接エンリッチすることで、以前は Security Hub で利用できなかった追加情報を使って Insights やフィルタなどの機能を活用できます。
例えば、WorkflowStatus=NEW、RecordState=ACTIVE、ResourceType=AwsS3Bucket であり、かつ public=True であるすべての AWS Security Hub 検出結果を、Context 出力でエンリッチするには以下のようにします。```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsS3Bucket --mh-filters-checks public=True --enrich-findings
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/93a45d119a712b11ae5f23ea68e3a1f7d71e0e9511df7d7dadd2b462fcde71a2.png" alt="update-findings" width="850"/>
</p>
`--enrich-findings` は、ファインディングを強化する前に確認を求めます。この確認をスキップするには、`--no-actions-confirmation` オプションを使用できます。
# コントリビューション
Context モジュールにコントリビュートしたい場合は、このガイドに従ってください。[ガイド](https://github.com/gabrielsoltz/metahub/blob/HEAD/docs/context.md)
| 取り得るステータス | 値 | 説明 |
|---|
| 🔴 effectively-public | 100% | リソースがインターネットから実質的に公開されています。 |
| 🟠 restricted-public | 40% | リソースは公開されていますが、セキュリティグループなどの制限があります。 |
| 🟠 unrestricted-private | 30% | リソースは非公開ですが、オープンなセキュリティグループのように無制限です。 |
| 🟠 launch-public | 10% | これらは、他のリソースを公開状態で起動できるリソースです。例:Auto Scalingグループやサブネット。 |
| 🟢 restricted | 0% | リソースは制限されています。 |
| 🔵 unknown | - | リソースを確認できませんでした。 |
| 可能なステータス | 値 | 説明 |
|---|
| 🔴 unrestricted | 100% | プリンシパルは無制限で、条件や制限がありません。 |
| 🔴 untrusted-principal | 70% | プリンシパルはAWSアカウントであり、信頼できるアカウントの一部ではありません。 |
| 🟠 unrestricted-principal | 40% | プリンシパルは制限されておらず、ワイルドカードで定義されています。条件やs3パブリックブロックなどの他の制限によって制限される可能性があります。 |
| 🟠 cross-account-principal | 30% | プリンシパルは別のAWSアカウントからのものです。 |
| 🟠 unrestricted-actions | 30% | アクションはワイルドカードを使用して定義されています。 |
| 🟠 dangerous-actions | 30% | このポリシーの一部として危険なアクションが定義されています。 |
| 🟠 unrestricted-service | 10% | ポリシーはAWSサービスをプリンシパルとして無制限に許可します。 |
| 🟢 restricted | 0% | ポリシーは制限されています。 |
| 🔵 unknown | - | ポリシーを確認できませんでした。 |
| 100% |
| リソースが完全に暗号化されていません。 |
| 🟢 encrypted | 0% | リソースとその関連付けがすべて完全に暗号化されています。 |
| 🔵 unknown | - | リソースの暗号化を確認できませんでした。 |
| 可能なステータス | 値 | 説明 |
|---|
| 🟠 attached | 100% | リソースはアタッチメントをサポートしており、アタッチされています。 |
| 🟠 running | 100% | リソースは実行をサポートしており、実行中です。 |
| 🟠 enabled | 100% | リソースは有効化をサポートしており、有効です。 |
| 🟢 not-attached | 0% | リソースはアタッチメントをサポートしていますが、アタッチされていません。 |
| 🟢 not-running | 0% | リソースは実行をサポートしていますが、実行中ではありません。 |
| 🟢 not-enabled | 0% | リソースは有効化をサポートしていますが、有効ではありません。 |
| 🔵 unknown | - | リソースのステータスを確認できませんでした。 |
| 可能なステータス | 値 | 説明 |
|---|
| 🟠 production | 100% | プロダクションリソースです。 |
| 🟢 staging | 30% | ステージングリソースです。 |
| 🟢 development | 0% | 開発リソースです。 |
| 🔵 unknown | - | リソースの環境を確認できませんでした。 |
--sh-assume-role--sh-profile