chore(manual status): change INFO to MANUAL status (#3254)

This commit is contained in:
Sergio Garcia
2024-01-09 18:08:00 +01:00
committed by Sergio Garcia
parent 5419117842
commit 2eb774bbc9
22 changed files with 29 additions and 29 deletions
+1 -1
View File
@@ -102,7 +102,7 @@ All the checks MUST fill the `report.status` and `report.status_extended` with t
- Status -- `report.status`
- `PASS` --> If the check is passing against the configured value.
- `FAIL` --> If the check is passing against the configured value.
- `INFO` --> This value cannot be used unless a manual operation is required in order to determine if the `report.status` is whether `PASS` or `FAIL`.
- `MANUAL` --> This value cannot be used unless a manual operation is required in order to determine if the `report.status` is whether `PASS` or `FAIL`.
- Status Extended -- `report.status_extended`
- MUST end in a dot `.`
- MUST include the service audited with the resource and a brief explanation of the result generated, e.g.: `EC2 AMI ami-0123456789 is not public.`
+1 -1
View File
@@ -12,7 +12,7 @@ prowler <provider> --verbose
## Filter findings by status
Prowler can filter the findings by their status:
```console
prowler <provider> --status [PASS, FAIL, INFO]
prowler <provider> --status [PASS, FAIL, MANUAL]
```
## Disable Exit Code 3
Prowler does not trigger exit code 3 with failed checks:
+1 -1
View File
@@ -1,7 +1,7 @@
# Mute Listing
Sometimes you may find resources that are intentionally configured in a certain way that may be a bad practice but it is all right with it, for example an AWS S3 Bucket open to the internet hosting a web site, or an AWS Security Group with an open port needed in your use case.
Mute List option works along with other options and adds a `MUTED` instead of `INFO`, `PASS` or `FAIL` to any output format.
Mute List option works along with other options and adds a `MUTED` instead of `MANUAL`, `PASS` or `FAIL` to any output format.
You can use `-w`/`--mutelist-file` with the path of your mutelist yaml file, but first, let's review the syntax.
+1 -1
View File
@@ -26,7 +26,7 @@ banner_color = "\033[1;92m"
valid_severities = ["critical", "high", "medium", "low", "informational"]
# Statuses
finding_statuses = ["PASS", "FAIL", "INFO"]
finding_statuses = ["PASS", "FAIL", "MANUAL"]
# Compliance
actual_directory = pathlib.Path(os.path.dirname(os.path.realpath(__file__)))
+1 -1
View File
@@ -19,7 +19,7 @@ def print_banner(args):
print(
f"""
Color code for results:
- {Fore.YELLOW}INFO (Information){Style.RESET_ALL}
- {Fore.YELLOW}MANUAL (Manual check){Style.RESET_ALL}
- {Fore.GREEN}PASS (Recommended value){Style.RESET_ALL}
- {orange_color}MUTED (Muted by muted list){Style.RESET_ALL}
- {Fore.RED}FAIL (Fix required){Style.RESET_ALL}
+1 -1
View File
@@ -31,7 +31,7 @@ def add_manual_controls(
manual_finding = Check_Report(
output_options.bulk_checks_metadata["manual_check"].json()
)
manual_finding.status = "INFO"
manual_finding.status = "MANUAL"
manual_finding.status_extended = "Manual check"
manual_finding.resource_id = "manual_check"
manual_finding.resource_name = "Manual check"
+1 -1
View File
@@ -170,7 +170,7 @@ def add_html_header(file_descriptor, audit_info):
def fill_html(file_descriptor, finding, output_options):
try:
row_class = "p-3 mb-2 bg-success-custom"
if finding.status == "INFO":
if finding.status == "MANUAL":
row_class = "table-info"
elif finding.status == "FAIL":
row_class = "table-danger"
+2 -2
View File
@@ -152,7 +152,7 @@ def report(check_findings, output_options, audit_info):
file_descriptors["json-ocsf"].write(",")
else: # No service resources in the whole account
color = set_report_color("INFO")
color = set_report_color("MANUAL")
if output_options.verbose:
print(f"\t{color}INFO{Style.RESET_ALL} There are no resources")
# Separator between findings and bar
@@ -179,7 +179,7 @@ def set_report_color(status: str) -> str:
color = Fore.BLACK
elif status == "MUTED":
color = orange_color
elif status == "INFO":
elif status == "MANUAL":
color = Fore.YELLOW
else:
raise Exception("Invalid Report Status. Must be PASS, FAIL, ERROR or MUTED")
@@ -20,8 +20,8 @@ def prepare_security_hub_findings(
security_hub_findings_per_region[region] = []
for finding in findings:
# We don't send the INFO findings to AWS Security Hub
if finding.status == "INFO":
# We don't send the MANUAL findings to AWS Security Hub
if finding.status == "MANUAL":
continue
# We don't send findings to not enabled regions
@@ -10,6 +10,6 @@ class account_maintain_current_contact_details(Check):
report.region = account_client.region
report.resource_id = account_client.audited_account
report.resource_arn = account_client.audited_account_arn
report.status = "INFO"
report.status_extended = "Manual check: Login to the AWS Console. Choose your account name on the top right of the window -> My Account -> Contact Information."
report.status = "MANUAL"
report.status_extended = "Login to the AWS Console. Choose your account name on the top right of the window -> My Account -> Contact Information."
return [report]
@@ -10,6 +10,6 @@ class account_security_contact_information_is_registered(Check):
report.region = account_client.region
report.resource_id = account_client.audited_account
report.resource_arn = account_client.audited_account_arn
report.status = "INFO"
report.status_extended = "Manual check: Login to the AWS Console. Choose your account name on the top right of the window -> My Account -> Alternate Contacts -> Security Section."
report.status = "MANUAL"
report.status_extended = "Login to the AWS Console. Choose your account name on the top right of the window -> My Account -> Alternate Contacts -> Security Section."
return [report]
@@ -10,6 +10,6 @@ class account_security_questions_are_registered_in_the_aws_account(Check):
report.region = account_client.region
report.resource_id = account_client.audited_account
report.resource_arn = account_client.audited_account_arn
report.status = "INFO"
report.status_extended = "Manual check: Login to the AWS Console as root. Choose your account name on the top right of the window -> My Account -> Configure Security Challenge Questions."
report.status = "MANUAL"
report.status_extended = "Login to the AWS Console as root. Choose your account name on the top right of the window -> My Account -> Configure Security Challenge Questions."
return [report]
@@ -27,7 +27,7 @@ class cloudtrail_bucket_requires_mfa_delete(Check):
report.status_extended = f"Trail {trail.name} bucket ({trail_bucket}) has MFA delete enabled."
# check if trail bucket is a cross account bucket
if not trail_bucket_is_in_account:
report.status = "INFO"
report.status = "MANUAL"
report.status_extended = f"Trail {trail.name} bucket ({trail_bucket}) is a cross-account bucket in another account out of Prowler's permissions scope, please check it manually."
findings.append(report)
@@ -35,7 +35,7 @@ class cloudtrail_logs_s3_bucket_access_logging_enabled(Check):
# check if trail is delivering logs in a cross account bucket
if not trail_bucket_is_in_account:
report.status = "INFO"
report.status = "MANUAL"
report.status_extended = f"Trail {trail.name} is delivering logs in a cross-account bucket {trail_bucket} in another account out of Prowler's permissions scope, please check it manually."
findings.append(report)
@@ -41,7 +41,7 @@ class cloudtrail_logs_s3_bucket_is_not_publicly_accessible(Check):
break
# check if trail bucket is a cross account bucket
if not trail_bucket_is_in_account:
report.status = "INFO"
report.status = "MANUAL"
report.status_extended = f"Trail {trail.name} bucket ({trail_bucket}) is a cross-account bucket in another account out of Prowler's permissions scope, please check it manually."
findings.append(report)
@@ -23,7 +23,7 @@ class trustedadvisor_errors_and_warnings(Check):
findings.append(report)
else:
report = Check_Report_AWS(self.metadata())
report.status = "INFO"
report.status = "MANUAL"
report.status_extended = "Amazon Web Services Premium Support Subscription is required to use this service."
report.resource_id = trustedadvisor_client.audited_account
report.resource_arn = trustedadvisor_client.audited_account_arn
+1 -1
View File
@@ -1238,7 +1238,7 @@ class Test_Outputs:
def test_extract_findings_statistics_info_resources(self):
finding_1 = mock.MagicMock()
finding_1.status = "INFO"
finding_1.status = "MANUAL"
finding_1.resource_id = "test_resource_1"
finding_2 = mock.MagicMock()
finding_2.status = "PASS"
@@ -147,10 +147,10 @@ class Test_SecurityHub:
AWS_REGION_EU_WEST_1: [get_security_hub_finding("PASSED")],
}
def test_prepare_security_hub_findings_quiet_INFO_finding(self):
def test_prepare_security_hub_findings_quiet_MANUAL_finding(self):
enabled_regions = [AWS_REGION_EU_WEST_1]
output_options = self.set_mocked_output_options(is_quiet=False)
findings = [self.generate_finding("INFO", AWS_REGION_EU_WEST_1)]
findings = [self.generate_finding("MANUAL", AWS_REGION_EU_WEST_1)]
audit_info = set_mocked_aws_audit_info(
audited_regions=[AWS_REGION_EU_WEST_1, AWS_REGION_EU_WEST_2]
)
@@ -194,7 +194,7 @@ class Test_cloudtrail_bucket_requires_mfa_delete:
check = cloudtrail_bucket_requires_mfa_delete()
result = check.execute()
assert len(result) == 1
assert result[0].status == "INFO"
assert result[0].status == "MANUAL"
assert (
result[0].status_extended
== f"Trail {trail_name_us} bucket ({bucket_name_us}) is a cross-account bucket in another account out of Prowler's permissions scope, please check it manually."
@@ -251,7 +251,7 @@ class Test_cloudtrail_bucket_requires_mfa_delete:
check = cloudtrail_bucket_requires_mfa_delete()
result = check.execute()
assert len(result) == 1
assert result[0].status == "INFO"
assert result[0].status == "MANUAL"
assert (
result[0].status_extended
== f"Trail {trail_name_us} bucket ({bucket_name_us}) is a cross-account bucket in another account out of Prowler's permissions scope, please check it manually."
@@ -213,7 +213,7 @@ class Test_cloudtrail_logs_s3_bucket_access_logging_enabled:
result = check.execute()
assert len(result) == 1
assert result[0].status == "INFO"
assert result[0].status == "MANUAL"
assert search(
"in another account out of Prowler's permissions scope, please check it manually",
result[0].status_extended,
@@ -275,7 +275,7 @@ class Test_cloudtrail_logs_s3_bucket_is_not_publicly_accessible:
result = check.execute()
assert len(result) == 1
assert result[0].status == "INFO"
assert result[0].status == "MANUAL"
assert result[0].resource_id == trail_name_us
assert result[0].resource_arn == trail_us["TrailARN"]
assert search(
@@ -32,7 +32,7 @@ class Test_trustedadvisor_errors_and_warnings:
check = trustedadvisor_errors_and_warnings()
result = check.execute()
assert len(result) == 1
assert result[0].status == "INFO"
assert result[0].status == "MANUAL"
assert (
result[0].status_extended
== "Amazon Web Services Premium Support Subscription is required to use this service."