diff --git a/docs/tutorials/reporting.md b/docs/tutorials/reporting.md index e189b61fd1..5053c7b066 100644 --- a/docs/tutorials/reporting.md +++ b/docs/tutorials/reporting.md @@ -287,7 +287,7 @@ The following is the mapping between the native JSON and the Detection Finding f | Remediation.Code.Terraform | remediation.references | | Remediation.Code.CLI | remediation.references | | Remediation.Code.Other | remediation.references | -| Compliance | _Not mapped yet_ | +| Compliance | unmapped.compliance | | Categories | unmapped.categories | | DependsOn | unmapped.depends_on | | RelatedTo | unmapped.related_to | diff --git a/prowler/lib/outputs/common_models.py b/prowler/lib/outputs/common_models.py index b040adb122..31ff3b58b8 100644 --- a/prowler/lib/outputs/common_models.py +++ b/prowler/lib/outputs/common_models.py @@ -69,7 +69,7 @@ class FindingOutput(BaseModel): remediation_code_terraform: str remediation_code_cli: str remediation_code_other: str - compliance: str + compliance: dict categories: str depends_on: str related_to: str diff --git a/prowler/lib/outputs/json_ocsf/json_ocsf.py b/prowler/lib/outputs/json_ocsf/json_ocsf.py index cd98830db6..020531d42c 100644 --- a/prowler/lib/outputs/json_ocsf/json_ocsf.py +++ b/prowler/lib/outputs/json_ocsf/json_ocsf.py @@ -115,6 +115,7 @@ def fill_json_ocsf(finding_output: FindingOutput) -> DetectionFinding: "depends_on": finding_output.depends_on, "related_to": finding_output.related_to, "notes": finding_output.notes, + "compliance": finding_output.compliance, }, ) diff --git a/prowler/lib/outputs/outputs.py b/prowler/lib/outputs/outputs.py index 69bad3e9fd..31dbec9d65 100644 --- a/prowler/lib/outputs/outputs.py +++ b/prowler/lib/outputs/outputs.py @@ -125,23 +125,12 @@ def report(check_findings, provider): csv_data = {} csv_data.update(provider_data_mapping) csv_data.update(common_finding_data) - csv_data["compliance"] = unroll_dict( - get_check_compliance(finding, provider.type, output_options) + csv_data["compliance"] = get_check_compliance( + finding, provider.type, output_options ) finding_output = generate_provider_output( provider, finding, csv_data ) - - # CSV - if "csv" in file_descriptors: - csv_writer = DictWriter( - file_descriptors["csv"], - fieldnames=generate_csv_fields(FindingOutput), - delimiter=";", - ) - - csv_writer.writerow(finding_output.dict()) - # JSON if "json-ocsf" in file_descriptors: detection_finding = fill_json_ocsf(finding_output) @@ -151,6 +140,19 @@ def report(check_findings, provider): ) file_descriptors["json-ocsf"].write(",") + # CSV + if "csv" in file_descriptors: + finding_output.compliance = unroll_dict( + finding_output.compliance + ) + csv_writer = DictWriter( + file_descriptors["csv"], + fieldnames=generate_csv_fields(FindingOutput), + delimiter=";", + ) + + csv_writer.writerow(finding_output.dict()) + else: # No service resources in the whole account color = set_report_color("MANUAL") if output_options.verbose: diff --git a/tests/lib/outputs/fixtures/fixtures.py b/tests/lib/outputs/fixtures/fixtures.py index 5482d10222..b197b5834d 100644 --- a/tests/lib/outputs/fixtures/fixtures.py +++ b/tests/lib/outputs/fixtures/fixtures.py @@ -45,7 +45,7 @@ def generate_finding_output(status, severity, muted, region) -> FindingOutput: remediation_code_terraform="", remediation_code_cli="", remediation_code_other="", - compliance="", + compliance={"test-compliance": "test-compliance"}, categories="test-category", depends_on="test-dependency", related_to="test-related-to", diff --git a/tests/lib/outputs/json_ocsf/json_ocsf_test.py b/tests/lib/outputs/json_ocsf/json_ocsf_test.py index 891b9f690b..86ef84d715 100644 --- a/tests/lib/outputs/json_ocsf/json_ocsf_test.py +++ b/tests/lib/outputs/json_ocsf/json_ocsf_test.py @@ -81,6 +81,7 @@ class TestOutputJSONOCSF: "depends_on": finding_output.depends_on, "related_to": finding_output.related_to, "notes": finding_output.notes, + "compliance": finding_output.compliance, } # ResourceDetails