Security Hubのセキュリティ基準から、特定の重要度以上の違反をフィルターしてCSV形式で出力する方法を教えてください

2022.02.28

困っていた内容

Security Hub のコンソールで、該当のセキュリティ基準のトップページから重要度や違反をフィルターし、その結果を CSV としてダウンロードできます。しかし、違反している具体的なリソース名は表示されず、違反しているリソース数などしか表示されません。
違反しているリソースも表示されている内容の CSV を取得したいのですが、取得する方法はあるのでしょうか。
個別のコントロールでダウンロードするとリソースを確認できますが、各コントロールごとに移動してダウンロードする方法ではなく、一括で CSV 形式で取得したいです。

どう対応すればいいの?

GetFindings API でフィルターを利用すれば、特定のセキュリティ基準・重要度の違反を出力できます。

例えば、以下のコマンドではセキュリティ基準AWS基礎セキュリティのベストプラクティスv1.0.0の重要度が HITH または CRITICAL であり、アーカイブされていない違反が出力されます。

aws securityhub get-findings --filters '{"GeneratorId":[{"Value": "aws-foundational-security-best-practices","Comparison":"PREFIX"}],"ComplianceStatus":[{"Value": "FAILED","Comparison":"EQUALS"}],"SeverityLabel":[{"Value": "CRITICAL","Comparison":"EQUALS"},{"Value":"HIGH","Comparison":"EQUALS"}],"RecordState":[{"Value":"ACTIVE","Comparison":"EQUALS"}]}'

{
    "Findings": [
        {
            "SchemaVersion": "2018-10-08",
            "Id": "arn:aws:securityhub:ap-northeast-1:111111111111:subscription/aws-foundational-security-best-practices/v/1.0.0/IAM.6/finding/1140eea0-8e06-4de0-a519-b765ac8cded8",
            "ProductArn": "arn:aws:securityhub:ap-northeast-1::product/aws/securityhub",
            "ProductName": "Security Hub",
            "CompanyName": "AWS",
            "Region": "ap-northeast-1",
            "GeneratorId": "aws-foundational-security-best-practices/v/1.0.0/IAM.6",
            ...

ただし、AWS CLI や AWS SDK のどちらを使うにしても、直接 CSV 形式では取得できないため、CSV に変換する必要があります。

AWS CLI を利用する場合、例えば以下のコマンドで CSV 形式で出力されます。

aws securityhub get-findings --filters '{"GeneratorId":[{"Value": "aws-foundational-security-best-practices","Comparison":"PREFIX"}],"ComplianceStatus":[{"Value": "FAILED","Comparison":"EQUALS"}],"SeverityLabel":[{"Value": "CRITICAL","Comparison":"EQUALS"},{"Value":"HIGH","Comparison":"EQUALS"}],"RecordState":[{"Value":"ACTIVE","Comparison":"EQUALS"}]}' --query "Findings[]" | jq -r '.[] | [.ProductFields.ControlId, .AwsAccountId, .Resources[0].Id, .Severity.Label, .Compliance.Status, .Workflow.Status, .UpdatedAt] | @csv'

"IAM.6","111111111111","AWS::::Account:111111111111","CRITICAL","FAILED","NEW","2022-02-27T08:21:46.840Z"
"GuardDuty.1","111111111111","AWS::::Account:111111111111","HIGH","FAILED","NEW","2022-02-27T08:21:44.984Z"
"S3.8","111111111111","arn:aws:s3:::aws-sam-cli-xxx","HIGH","FAILED","NEW","2022-02-27T06:49:29.229Z"
...

参考資料