chore(arn): add missing ARNs to AWS Services (#2476)

This commit is contained in:
Sergio Garcia
2023-06-12 13:33:12 +02:00
committed by GitHub
parent 49b2a559ae
commit 01cd4bcb47
62 changed files with 249 additions and 102 deletions

View File

@@ -39,7 +39,7 @@ It contains hundreds of controls covering CIS, NIST 800, NIST CSF, CISA, RBI, Fe
| Provider | Checks | Services | [Compliance Frameworks](https://docs.prowler.cloud/en/latest/tutorials/compliance/) | [Categories](https://docs.prowler.cloud/en/latest/tutorials/misc/#categories) | | Provider | Checks | Services | [Compliance Frameworks](https://docs.prowler.cloud/en/latest/tutorials/compliance/) | [Categories](https://docs.prowler.cloud/en/latest/tutorials/misc/#categories) |
|---|---|---|---|---| |---|---|---|---|---|
| AWS | 282 | 55 -> `prowler aws --list-services` | 21 -> `prowler aws --list-compliance` | 5 -> `prowler aws --list-categories` | | AWS | 283 | 55 -> `prowler aws --list-services` | 21 -> `prowler aws --list-compliance` | 5 -> `prowler aws --list-categories` |
| GCP | 59 | 10 -> `prowler gcp --list-services` | CIS soon | 0 -> `prowler gcp --list-categories`| | GCP | 59 | 10 -> `prowler gcp --list-services` | CIS soon | 0 -> `prowler gcp --list-categories`|
| Azure | 20 | 3 -> `prowler azure --list-services` | CIS soon | 1 -> `prowler azure --list-categories` | | Azure | 20 | 3 -> `prowler azure --list-services` | CIS soon | 1 -> `prowler azure --list-categories` |
| Kubernetes | Planned | - | - | - | | Kubernetes | Planned | - | - | - |

View File

@@ -41,7 +41,7 @@ class APIGateway:
get_rest_apis_paginator = regional_client.get_paginator("get_rest_apis") get_rest_apis_paginator = regional_client.get_paginator("get_rest_apis")
for page in get_rest_apis_paginator.paginate(): for page in get_rest_apis_paginator.paginate():
for apigw in page["items"]: for apigw in page["items"]:
arn = f"arn:{self.audited_partition}:apigateway:{regional_client.region}::/apis/{apigw['id']}" arn = f"arn:{self.audited_partition}:apigateway:{regional_client.region}::/restapis/{apigw['id']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(arn, self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
@@ -100,7 +100,7 @@ class APIGateway:
logging = True logging = True
if "clientCertificateId" in stage: if "clientCertificateId" in stage:
client_certificate = True client_certificate = True
arn = f"arn:{self.audited_partition}:apigateway:{regional_client.region}::/apis/{rest_api.id}/stages/{stage['stageName']}" arn = f"arn:{self.audited_partition}:apigateway:{regional_client.region}::/restapis/{rest_api.id}/stages/{stage['stageName']}"
rest_api.stages.append( rest_api.stages.append(
Stage( Stage(
name=stage["stageName"], name=stage["stageName"],

View File

@@ -10,18 +10,18 @@ class apigatewayv2_authorizers_enabled(Check):
for api in apigatewayv2_client.apis: for api in apigatewayv2_client.apis:
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.region = api.region report.region = api.region
report.resource_id = api.name
report.resource_arn = api.arn
report.resource_tags = api.tags
report.status = "FAIL"
report.status_extended = (
f"API Gateway V2 {api.name} ID {api.id} has not authorizer configured."
)
if api.authorizer: if api.authorizer:
report.status = "PASS" report.status = "PASS"
report.status_extended = ( report.status_extended = (
f"API Gateway V2 {api.name} ID {api.id} has authorizer configured." f"API Gateway V2 {api.name} ID {api.id} has authorizer configured."
) )
report.resource_id = api.name
report.resource_tags = api.tags
else:
report.status = "FAIL"
report.status_extended = f"API Gateway V2 {api.name} ID {api.id} has not authorizer configured."
report.resource_id = api.name
report.resource_tags = api.tags
findings.append(report) findings.append(report)
return findings return findings

View File

@@ -14,6 +14,7 @@ class ApiGatewayV2:
self.service = "apigatewayv2" self.service = "apigatewayv2"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audited_account = audit_info.audited_account self.audited_account = audit_info.audited_account
self.audited_partition = audit_info.audited_partition
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.apis = [] self.apis = []
@@ -39,11 +40,13 @@ class ApiGatewayV2:
get_apis_paginator = regional_client.get_paginator("get_apis") get_apis_paginator = regional_client.get_paginator("get_apis")
for page in get_apis_paginator.paginate(): for page in get_apis_paginator.paginate():
for apigw in page["Items"]: for apigw in page["Items"]:
arn = f"arn:{self.audited_partition}:apigateway:{regional_client.region}::apis/{apigw['ApiId']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(apigw["ApiId"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.apis.append( self.apis.append(
API( API(
arn=arn,
id=apigw["ApiId"], id=apigw["ApiId"],
region=regional_client.region, region=regional_client.region,
name=apigw["Name"], name=apigw["Name"],
@@ -98,6 +101,7 @@ class Stage(BaseModel):
class API(BaseModel): class API(BaseModel):
arn: str
id: str id: str
region: str region: str
name: str name: str

View File

@@ -31,6 +31,7 @@ class cloudwatch_changes_to_network_acls_alarm_configured(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_changes_to_network_gateways_alarm_configured(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_changes_to_network_route_tables_alarm_configured(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_changes_to_vpcs_alarm_configured(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -33,6 +33,7 @@ class cloudwatch_log_metric_filter_and_alarm_for_aws_config_configuration_change
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -33,6 +33,7 @@ class cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_change
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_authentication_failures(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_aws_organizations_changes(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_disable_or_scheduled_deletion_of_kms_cmk(Chec
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_for_s3_bucket_policy_changes(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_policy_changes(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_root_usage(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_security_group_changes(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_sign_in_without_mfa(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -31,6 +31,7 @@ class cloudwatch_log_metric_filter_unauthorized_api_calls(Check):
if metric_filter.log_group in log_groups: if metric_filter.log_group in log_groups:
if re.search(pattern, metric_filter.pattern): if re.search(pattern, metric_filter.pattern):
report.resource_id = metric_filter.log_group report.resource_id = metric_filter.log_group
report.resource_arn = metric_filter.arn
report.region = metric_filter.region report.region = metric_filter.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated." report.status_extended = f"CloudWatch log group {metric_filter.log_group} found with metric filter {metric_filter.name} but no alarms associated."

View File

@@ -17,6 +17,7 @@ class CloudWatch:
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audited_account = audit_info.audited_account self.audited_account = audit_info.audited_account
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.region = list( self.region = list(
generate_regional_clients( generate_regional_clients(
self.service, audit_info, global_service=True self.service, audit_info, global_service=True
@@ -89,6 +90,7 @@ class Logs:
self.service = "logs" self.service = "logs"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audited_account = audit_info.audited_account self.audited_account = audit_info.audited_account
self.audited_partition = audit_info.audited_partition
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.metric_filters = [] self.metric_filters = []
@@ -125,11 +127,13 @@ class Logs:
) )
for page in describe_metric_filters_paginator.paginate(): for page in describe_metric_filters_paginator.paginate():
for filter in page["metricFilters"]: for filter in page["metricFilters"]:
arn = f"arn:{self.audited_partition}:logs:{regional_client.region}:{self.audited_account}:metric-filter/{filter['filterName']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(filter["filterName"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.metric_filters.append( self.metric_filters.append(
MetricFilter( MetricFilter(
arn=arn,
name=filter["filterName"], name=filter["filterName"],
metric=filter["metricTransformations"][0]["metricName"], metric=filter["metricTransformations"][0]["metricName"],
pattern=filter.get("filterPattern", ""), pattern=filter.get("filterPattern", ""),
@@ -237,6 +241,7 @@ class MetricAlarm(BaseModel):
class MetricFilter(BaseModel): class MetricFilter(BaseModel):
arn: str
name: str name: str
metric: str metric: str
pattern: str pattern: str

View File

@@ -16,6 +16,7 @@ class DynamoDB:
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audited_account = audit_info.audited_account self.audited_account = audit_info.audited_account
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.tables = [] self.tables = []
self.__threading_call__(self.__list_tables__) self.__threading_call__(self.__list_tables__)
@@ -41,12 +42,13 @@ class DynamoDB:
list_tables_paginator = regional_client.get_paginator("list_tables") list_tables_paginator = regional_client.get_paginator("list_tables")
for page in list_tables_paginator.paginate(): for page in list_tables_paginator.paginate():
for table in page["TableNames"]: for table in page["TableNames"]:
arn = f"arn:{self.audited_partition}:dynamodb:{regional_client.region}:{self.audited_account}:table/{table}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(table, self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.tables.append( self.tables.append(
Table( Table(
arn="", arn=arn,
name=table, name=table,
encryption_type=None, encryption_type=None,
kms_arn=None, kms_arn=None,
@@ -66,7 +68,6 @@ class DynamoDB:
properties = regional_client.describe_table(TableName=table.name)[ properties = regional_client.describe_table(TableName=table.name)[
"Table" "Table"
] ]
table.arn = properties["TableArn"]
if "SSEDescription" in properties: if "SSEDescription" in properties:
if "SSEType" in properties["SSEDescription"]: if "SSEType" in properties["SSEDescription"]:
table.encryption_type = properties["SSEDescription"]["SSEType"] table.encryption_type = properties["SSEDescription"]["SSEType"]

View File

@@ -14,6 +14,8 @@ class EKS:
self.service = "eks" self.service = "eks"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.audited_account = audit_info.audited_account
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.clusters = [] self.clusters = []
self.__threading_call__(self.__list_clusters__) self.__threading_call__(self.__list_clusters__)
@@ -37,11 +39,13 @@ class EKS:
list_clusters_paginator = regional_client.get_paginator("list_clusters") list_clusters_paginator = regional_client.get_paginator("list_clusters")
for page in list_clusters_paginator.paginate(): for page in list_clusters_paginator.paginate():
for cluster in page["clusters"]: for cluster in page["clusters"]:
arn = f"arn:{self.audited_partition}:eks:{regional_client.region}:{self.audited_account}:cluster/{cluster}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(cluster, self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.clusters.append( self.clusters.append(
EKSCluster( EKSCluster(
arn=arn,
name=cluster, name=cluster,
region=regional_client.region, region=regional_client.region,
) )
@@ -58,7 +62,6 @@ class EKS:
for cluster in self.clusters: for cluster in self.clusters:
regional_client = regional_clients[cluster.region] regional_client = regional_clients[cluster.region]
describe_cluster = regional_client.describe_cluster(name=cluster.name) describe_cluster = regional_client.describe_cluster(name=cluster.name)
cluster.arn = describe_cluster["cluster"]["arn"]
if "logging" in describe_cluster["cluster"]: if "logging" in describe_cluster["cluster"]:
cluster.logging = EKSClusterLoggingEntity( cluster.logging = EKSClusterLoggingEntity(
types=describe_cluster["cluster"]["logging"]["clusterLogging"][ types=describe_cluster["cluster"]["logging"]["clusterLogging"][
@@ -106,7 +109,7 @@ class EKSClusterLoggingEntity(BaseModel):
class EKSCluster(BaseModel): class EKSCluster(BaseModel):
name: str name: str
arn: str = None arn: str
region: str region: str
logging: EKSClusterLoggingEntity = None logging: EKSClusterLoggingEntity = None
endpoint_public_access: bool = None endpoint_public_access: bool = None

View File

@@ -8,6 +8,7 @@ class glue_database_connections_ssl_enabled(Check):
for conn in glue_client.connections: for conn in glue_client.connections:
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = conn.name report.resource_id = conn.name
report.resource_arn = conn.arn
report.region = conn.region report.region = conn.region
report.status = "FAIL" report.status = "FAIL"
report.status_extended = ( report.status_extended = (

View File

@@ -9,6 +9,7 @@ class glue_development_endpoints_cloudwatch_logs_encryption_enabled(Check):
no_sec_configs = True no_sec_configs = True
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = endpoint.name report.resource_id = endpoint.name
report.resource_arn = endpoint.arn
report.region = endpoint.region report.region = endpoint.region
for sec_config in glue_client.security_configs: for sec_config in glue_client.security_configs:
if sec_config.name == endpoint.security: if sec_config.name == endpoint.security:

View File

@@ -9,6 +9,7 @@ class glue_development_endpoints_job_bookmark_encryption_enabled(Check):
no_sec_configs = True no_sec_configs = True
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = endpoint.name report.resource_id = endpoint.name
report.resource_arn = endpoint.arn
report.region = endpoint.region report.region = endpoint.region
for sec_config in glue_client.security_configs: for sec_config in glue_client.security_configs:
if sec_config.name == endpoint.security: if sec_config.name == endpoint.security:

View File

@@ -9,6 +9,7 @@ class glue_development_endpoints_s3_encryption_enabled(Check):
no_sec_configs = True no_sec_configs = True
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = endpoint.name report.resource_id = endpoint.name
report.resource_arn = endpoint.arn
report.region = endpoint.region report.region = endpoint.region
for sec_config in glue_client.security_configs: for sec_config in glue_client.security_configs:
if sec_config.name == endpoint.security: if sec_config.name == endpoint.security:

View File

@@ -9,6 +9,7 @@ class glue_etl_jobs_amazon_s3_encryption_enabled(Check):
no_sec_configs = True no_sec_configs = True
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = job.name report.resource_id = job.name
report.resource_arn = job.arn
report.region = job.region report.region = job.region
for sec_config in glue_client.security_configs: for sec_config in glue_client.security_configs:
if sec_config.name == job.security: if sec_config.name == job.security:

View File

@@ -9,6 +9,7 @@ class glue_etl_jobs_cloudwatch_logs_encryption_enabled(Check):
no_sec_configs = True no_sec_configs = True
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = job.name report.resource_id = job.name
report.resource_arn = job.arn
report.region = job.region report.region = job.region
for sec_config in glue_client.security_configs: for sec_config in glue_client.security_configs:
if sec_config.name == job.security: if sec_config.name == job.security:

View File

@@ -9,6 +9,7 @@ class glue_etl_jobs_job_bookmark_encryption_enabled(Check):
no_sec_configs = True no_sec_configs = True
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.resource_id = job.name report.resource_id = job.name
report.resource_arn = job.arn
report.region = job.region report.region = job.region
for sec_config in glue_client.security_configs: for sec_config in glue_client.security_configs:
if sec_config.name == job.security: if sec_config.name == job.security:

View File

@@ -15,6 +15,7 @@ class Glue:
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audited_account = audit_info.audited_account self.audited_account = audit_info.audited_account
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_account
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.connections = [] self.connections = []
self.__threading_call__(self.__get_connections__) self.__threading_call__(self.__get_connections__)
@@ -47,11 +48,13 @@ class Glue:
get_connections_paginator = regional_client.get_paginator("get_connections") get_connections_paginator = regional_client.get_paginator("get_connections")
for page in get_connections_paginator.paginate(): for page in get_connections_paginator.paginate():
for conn in page["ConnectionList"]: for conn in page["ConnectionList"]:
arn = f"arn:{self.audited_partition}:glue:{regional_client.region}:{self.audited_account}:connection/{conn['Name']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(conn["Name"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.connections.append( self.connections.append(
Connection( Connection(
arn=arn,
name=conn["Name"], name=conn["Name"],
type=conn["ConnectionType"], type=conn["ConnectionType"],
properties=conn["ConnectionProperties"], properties=conn["ConnectionProperties"],
@@ -71,13 +74,13 @@ class Glue:
) )
for page in get_dev_endpoints_paginator.paginate(): for page in get_dev_endpoints_paginator.paginate():
for endpoint in page["DevEndpoints"]: for endpoint in page["DevEndpoints"]:
arn = f"arn:{self.audited_partition}:glue:{regional_client.region}:{self.audited_account}:devEndpoint/{endpoint['EndpointName']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
endpoint["EndpointName"], self.audit_resources
)
): ):
self.dev_endpoints.append( self.dev_endpoints.append(
DevEndpoint( DevEndpoint(
arn=arn,
name=endpoint["EndpointName"], name=endpoint["EndpointName"],
security=endpoint.get("SecurityConfiguration"), security=endpoint.get("SecurityConfiguration"),
region=regional_client.region, region=regional_client.region,
@@ -94,12 +97,14 @@ class Glue:
get_jobs_paginator = regional_client.get_paginator("get_jobs") get_jobs_paginator = regional_client.get_paginator("get_jobs")
for page in get_jobs_paginator.paginate(): for page in get_jobs_paginator.paginate():
for job in page["Jobs"]: for job in page["Jobs"]:
arn = f"arn:{self.audited_partition}:glue:{regional_client.region}:{self.audited_account}:job/{job['Name']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(job["Name"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.jobs.append( self.jobs.append(
Job( Job(
name=job["Name"], name=job["Name"],
arn=arn,
security=job.get("SecurityConfiguration"), security=job.get("SecurityConfiguration"),
arguments=job.get("DefaultArguments"), arguments=job.get("DefaultArguments"),
region=regional_client.region, region=regional_client.region,
@@ -154,11 +159,13 @@ class Glue:
logger.info("Glue - Search Tables...") logger.info("Glue - Search Tables...")
try: try:
for table in regional_client.search_tables()["TableList"]: for table in regional_client.search_tables()["TableList"]:
arn = f"arn:{self.audited_partition}:glue:{regional_client.region}:{self.audited_account}:table/{table['DatabaseName']}/{table['Name']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(table["Name"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.tables.append( self.tables.append(
Table( Table(
arn=arn,
name=table["Name"], name=table["Name"],
database=table["DatabaseName"], database=table["DatabaseName"],
catalog=table["CatalogId"], catalog=table["CatalogId"],
@@ -197,6 +204,7 @@ class Glue:
class Connection(BaseModel): class Connection(BaseModel):
name: str name: str
arn: str
type: str type: str
properties: dict properties: dict
region: str region: str
@@ -204,6 +212,7 @@ class Connection(BaseModel):
class Table(BaseModel): class Table(BaseModel):
name: str name: str
arn: str
database: str database: str
catalog: Optional[str] catalog: Optional[str]
region: str region: str
@@ -219,11 +228,13 @@ class CatalogEncryptionSetting(BaseModel):
class DevEndpoint(BaseModel): class DevEndpoint(BaseModel):
name: str name: str
arn: str
security: Optional[str] security: Optional[str]
region: str region: str
class Job(BaseModel): class Job(BaseModel):
arn: str
name: str name: str
security: Optional[str] security: Optional[str]
arguments: Optional[dict] arguments: Optional[dict]

View File

@@ -43,10 +43,10 @@ class GuardDuty:
list_detectors_paginator = regional_client.get_paginator("list_detectors") list_detectors_paginator = regional_client.get_paginator("list_detectors")
for page in list_detectors_paginator.paginate(): for page in list_detectors_paginator.paginate():
for detector in page["DetectorIds"]: for detector in page["DetectorIds"]:
arn = f"arn:{self.audited_partition}:guardduty:{regional_client.region}:{self.audited_account}:detector/{detector}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(detector, self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
arn = f"arn:{self.audited_partition}:guardduty:{regional_client.region}:{self.audited_account}:detector/{detector}"
self.detectors.append( self.detectors.append(
Detector( Detector(
id=detector, arn=arn, region=regional_client.region id=detector, arn=arn, region=regional_client.region

View File

@@ -70,11 +70,13 @@ class Inspector2:
for page in list_findings_paginator.paginate(): for page in list_findings_paginator.paginate():
for finding in page["findings"]: for finding in page["findings"]:
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(finding, self.audit_resources) is_resource_filtered(
finding["findingArn"], self.audit_resources
)
): ):
inspector.findings.append( inspector.findings.append(
InspectorFinding( InspectorFinding(
arn=finding.get("findingArn"), arn=finding["findingArn"],
region=regional_client.region, region=regional_client.region,
severity=finding.get("severity"), severity=finding.get("severity"),
status=finding.get("status"), status=finding.get("status"),

View File

@@ -12,7 +12,7 @@ class networkfirewall_in_all_vpc(Check):
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.region = vpc.region report.region = vpc.region
report.resource_id = vpc.id report.resource_id = vpc.id
report.resource_arn = "" report.resource_arn = vpc.arn
report.resource_tags = vpc.tags report.resource_tags = vpc.tags
report.status = "FAIL" report.status = "FAIL"
report.status_extended = ( report.status_extended = (

View File

@@ -15,6 +15,8 @@ class OpenSearchService:
self.service = "opensearch" self.service = "opensearch"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.audited_account = audit_info.audited_account
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.opensearch_domains = [] self.opensearch_domains = []
self.__threading_call__(self.__list_domain_names__) self.__threading_call__(self.__list_domain_names__)
@@ -39,12 +41,15 @@ class OpenSearchService:
try: try:
domains = regional_client.list_domain_names() domains = regional_client.list_domain_names()
for domain in domains["DomainNames"]: for domain in domains["DomainNames"]:
arn = f"arn:{self.audited_partition}:opensearch:{regional_client.region}:{self.audited_account}:domain/{domain['DomainName']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(domain["DomainName"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.opensearch_domains.append( self.opensearch_domains.append(
OpenSearchDomain( OpenSearchDomain(
name=domain["DomainName"], region=regional_client.region arn=arn,
name=domain["DomainName"],
region=regional_client.region,
) )
) )
except Exception as error: except Exception as error:

View File

@@ -52,16 +52,15 @@ class RDS:
) )
for page in describe_db_instances_paginator.paginate(): for page in describe_db_instances_paginator.paginate():
for instance in page["DBInstances"]: for instance in page["DBInstances"]:
arn = f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:db:{instance['DBInstanceIdentifier']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
instance["DBInstanceIdentifier"], self.audit_resources
)
): ):
if instance["Engine"] != "docdb": if instance["Engine"] != "docdb":
self.db_instances.append( self.db_instances.append(
DBInstance( DBInstance(
id=instance["DBInstanceIdentifier"], id=instance["DBInstanceIdentifier"],
arn=f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:db:{instance['DBInstanceIdentifier']}", arn=arn,
endpoint=instance.get("Endpoint"), endpoint=instance.get("Endpoint"),
engine=instance["Engine"], engine=instance["Engine"],
engine_version=instance["EngineVersion"], engine_version=instance["EngineVersion"],
@@ -125,16 +124,15 @@ class RDS:
) )
for page in describe_db_snapshots_paginator.paginate(): for page in describe_db_snapshots_paginator.paginate():
for snapshot in page["DBSnapshots"]: for snapshot in page["DBSnapshots"]:
arn = f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:snapshot:{snapshot['DBSnapshotIdentifier']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
snapshot["DBSnapshotIdentifier"], self.audit_resources
)
): ):
if snapshot["Engine"] != "docdb": if snapshot["Engine"] != "docdb":
self.db_snapshots.append( self.db_snapshots.append(
DBSnapshot( DBSnapshot(
id=snapshot["DBSnapshotIdentifier"], id=snapshot["DBSnapshotIdentifier"],
arn=f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:snapshot:{snapshot['DBSnapshotIdentifier']}", arn=arn,
instance_id=snapshot["DBInstanceIdentifier"], instance_id=snapshot["DBInstanceIdentifier"],
region=regional_client.region, region=regional_client.region,
tags=snapshot.get("TagList", []), tags=snapshot.get("TagList", []),
@@ -175,13 +173,11 @@ class RDS:
) )
for page in describe_db_clusters_paginator.paginate(): for page in describe_db_clusters_paginator.paginate():
for cluster in page["DBClusters"]: for cluster in page["DBClusters"]:
db_cluster_arn = f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:cluster:{cluster['DBClusterIdentifier']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(db_cluster_arn, self.audit_resources)
cluster["DBClusterIdentifier"], self.audit_resources
)
): ):
if cluster["Engine"] != "docdb": if cluster["Engine"] != "docdb":
db_cluster_arn = f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:cluster:{cluster['DBClusterIdentifier']}"
db_cluster = DBCluster( db_cluster = DBCluster(
id=cluster["DBClusterIdentifier"], id=cluster["DBClusterIdentifier"],
arn=db_cluster_arn, arn=db_cluster_arn,
@@ -220,9 +216,10 @@ class RDS:
) )
for page in describe_db_snapshots_paginator.paginate(): for page in describe_db_snapshots_paginator.paginate():
for snapshot in page["DBClusterSnapshots"]: for snapshot in page["DBClusterSnapshots"]:
arn = f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:cluster-snapshot:{snapshot['DBClusterSnapshotIdentifier']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(
snapshot["DBClusterSnapshotIdentifier"], arn,
self.audit_resources, self.audit_resources,
) )
): ):
@@ -230,7 +227,7 @@ class RDS:
self.db_cluster_snapshots.append( self.db_cluster_snapshots.append(
ClusterSnapshot( ClusterSnapshot(
id=snapshot["DBClusterSnapshotIdentifier"], id=snapshot["DBClusterSnapshotIdentifier"],
arn=f"arn:{self.audited_partition}:rds:{regional_client.region}:{self.audited_account}:cluster-snapshot:{snapshot['DBClusterSnapshotIdentifier']}", arn=arn,
cluster_id=snapshot["DBClusterIdentifier"], cluster_id=snapshot["DBClusterIdentifier"],
region=regional_client.region, region=regional_client.region,
tags=snapshot.get("TagList", []), tags=snapshot.get("TagList", []),

View File

@@ -14,6 +14,8 @@ class Redshift:
self.service = "redshift" self.service = "redshift"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.audited_account = audit_info.audited_account
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.clusters = [] self.clusters = []
self.__threading_call__(self.__describe_clusters__) self.__threading_call__(self.__describe_clusters__)
@@ -38,12 +40,12 @@ class Redshift:
list_clusters_paginator = regional_client.get_paginator("describe_clusters") list_clusters_paginator = regional_client.get_paginator("describe_clusters")
for page in list_clusters_paginator.paginate(): for page in list_clusters_paginator.paginate():
for cluster in page["Clusters"]: for cluster in page["Clusters"]:
arn = f"arn:{self.audited_partition}:redshift:{regional_client.region}:{self.audited_account}:cluster:{cluster['ClusterIdentifier']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
cluster["ClusterIdentifier"], self.audit_resources
)
): ):
cluster_to_append = Cluster( cluster_to_append = Cluster(
arn=arn,
id=cluster["ClusterIdentifier"], id=cluster["ClusterIdentifier"],
region=regional_client.region, region=regional_client.region,
tags=cluster.get("Tags"), tags=cluster.get("Tags"),

View File

@@ -15,6 +15,8 @@ class SQS:
self.service = "sqs" self.service = "sqs"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_account = audit_info.audited_account
self.audited_partition = audit_info.audited_partition
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.queues = [] self.queues = []
self.__threading_call__(self.__list_queues__) self.__threading_call__(self.__list_queues__)
@@ -40,11 +42,13 @@ class SQS:
for page in list_queues_paginator.paginate(): for page in list_queues_paginator.paginate():
if "QueueUrls" in page: if "QueueUrls" in page:
for queue in page["QueueUrls"]: for queue in page["QueueUrls"]:
arn = f"arn:{self.audited_partition}:sqs:{regional_client.region}:{self.audited_account}:{queue}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(queue, self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.queues.append( self.queues.append(
Queue( Queue(
arn=arn,
id=queue, id=queue,
region=regional_client.region, region=regional_client.region,
) )
@@ -98,7 +102,7 @@ class SQS:
class Queue(BaseModel): class Queue(BaseModel):
id: str id: str
arn: str = "" arn: str
region: str region: str
policy: dict = None policy: dict = None
kms_key_id: str = None kms_key_id: str = None

View File

@@ -58,11 +58,11 @@ class SSM:
list_documents_paginator = regional_client.get_paginator("list_documents") list_documents_paginator = regional_client.get_paginator("list_documents")
for page in list_documents_paginator.paginate(**list_documents_parameters): for page in list_documents_paginator.paginate(**list_documents_parameters):
for document in page["DocumentIdentifiers"]: for document in page["DocumentIdentifiers"]:
document_name = document["Name"]
document_arn = f"arn:{self.audited_partition}:ssm:{regional_client.region}:{self.audited_account}:document/{document_name}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(document["Name"], self.audit_resources) is_resource_filtered(document_arn, self.audit_resources)
): ):
document_name = document["Name"]
document_arn = f"arn:{self.audited_partition}:ssm:{regional_client.region}:{self.audited_account}:document/{document_name}"
# We must use the Document ARN as the dict key to have unique keys # We must use the Document ARN as the dict key to have unique keys
self.documents[document_arn] = Document( self.documents[document_arn] = Document(
arn=document_arn, arn=document_arn,

View File

@@ -18,6 +18,7 @@ class vpc_endpoint_connections_trust_boundaries(Check):
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id} has full access." report.status_extended = f"VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id} has full access."
report.resource_id = endpoint.id report.resource_id = endpoint.id
report.resource_arn = endpoint.arn
report.resource_tags = endpoint.tags report.resource_tags = endpoint.tags
findings.append(report) findings.append(report)
break break
@@ -34,6 +35,7 @@ class vpc_endpoint_connections_trust_boundaries(Check):
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id} has full access." report.status_extended = f"VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id} has full access."
report.resource_id = endpoint.id report.resource_id = endpoint.id
report.resource_arn = endpoint.arn
report.resource_tags = endpoint.tags report.resource_tags = endpoint.tags
else: else:
account_id = principal_arn.split(":")[4] account_id = principal_arn.split(":")[4]
@@ -44,11 +46,13 @@ class vpc_endpoint_connections_trust_boundaries(Check):
report.status = "PASS" report.status = "PASS"
report.status_extended = f"Found trusted account {account_id} in VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id}." report.status_extended = f"Found trusted account {account_id} in VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id}."
report.resource_id = endpoint.id report.resource_id = endpoint.id
report.resource_arn = endpoint.arn
report.resource_tags = endpoint.tags report.resource_tags = endpoint.tags
else: else:
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"Found untrusted account {account_id} in VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id}." report.status_extended = f"Found untrusted account {account_id} in VPC Endpoint {endpoint.id} in VPC {endpoint.vpc_id}."
report.resource_id = endpoint.id report.resource_id = endpoint.id
report.resource_arn = endpoint.arn
report.resource_tags = endpoint.tags report.resource_tags = endpoint.tags
findings.append(report) findings.append(report)

View File

@@ -17,6 +17,7 @@ class vpc_endpoint_services_allowed_principals_trust_boundaries(Check):
f"VPC Endpoint Service {service.id} has no allowed principals." f"VPC Endpoint Service {service.id} has no allowed principals."
) )
report.resource_id = service.id report.resource_id = service.id
report.resource_arn = service.arn
report.resource_tags = service.tags report.resource_tags = service.tags
findings.append(report) findings.append(report)
else: else:
@@ -31,11 +32,13 @@ class vpc_endpoint_services_allowed_principals_trust_boundaries(Check):
report.status = "PASS" report.status = "PASS"
report.status_extended = f"Found trusted account {account_id} in VPC Endpoint Service {service.id}." report.status_extended = f"Found trusted account {account_id} in VPC Endpoint Service {service.id}."
report.resource_id = service.id report.resource_id = service.id
report.resource_arn = service.arn
report.resource_tags = service.tags report.resource_tags = service.tags
else: else:
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"Found untrusted account {account_id} in VPC Endpoint Service {service.id}." report.status_extended = f"Found untrusted account {account_id} in VPC Endpoint Service {service.id}."
report.resource_id = service.id report.resource_id = service.id
report.resource_arn = service.arn
report.resource_tags = service.tags report.resource_tags = service.tags
findings.append(report) findings.append(report)

View File

@@ -9,14 +9,14 @@ class vpc_flow_logs_enabled(Check):
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.region = vpc.region report.region = vpc.region
report.resource_tags = vpc.tags report.resource_tags = vpc.tags
report.resource_id = vpc.id
report.resource_arn = vpc.arn
report.status = "FAIL"
report.status_extended = f"VPC {vpc.id} Flow logs are disabled."
if vpc.flow_log: if vpc.flow_log:
report.status = "PASS" report.status = "PASS"
report.status_extended = f"VPC {vpc.id} Flow logs are enabled." report.status_extended = f"VPC {vpc.id} Flow logs are enabled."
report.resource_id = vpc.id
else:
report.status = "FAIL"
report.status_extended = f"VPC {vpc.id} Flow logs are disabled."
report.resource_id = vpc.id
findings.append(report) findings.append(report)
return findings return findings

View File

@@ -9,6 +9,12 @@ class vpc_peering_routing_tables_with_least_privilege(Check):
report = Check_Report_AWS(self.metadata()) report = Check_Report_AWS(self.metadata())
report.region = peer.region report.region = peer.region
report.resource_tags = peer.tags report.resource_tags = peer.tags
report.resource_id = peer.id
report.resource_arn = peer.arn
report.status = "PASS"
report.status_extended = (
f"VPC Peering Connection {peer.id} comply with least privilege access."
)
comply = True comply = True
# Check each cidr in the peering route table # Check each cidr in the peering route table
for route_table in peer.route_tables: for route_table in peer.route_tables:
@@ -22,11 +28,7 @@ class vpc_peering_routing_tables_with_least_privilege(Check):
if not comply: if not comply:
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"VPC Peering Connection {peer.id} does not comply with least privilege access since it accepts whole VPCs CIDR in its route tables." report.status_extended = f"VPC Peering Connection {peer.id} does not comply with least privilege access since it accepts whole VPCs CIDR in its route tables."
report.resource_id = peer.id
else:
report.status = "PASS"
report.status_extended = f"VPC Peering Connection {peer.id} comply with least privilege access."
report.resource_id = peer.id
findings.append(report) findings.append(report)
return findings return findings

View File

@@ -16,6 +16,7 @@ class VPC:
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audited_account = audit_info.audited_account self.audited_account = audit_info.audited_account
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.vpcs = {} self.vpcs = {}
self.vpc_peering_connections = [] self.vpc_peering_connections = []
@@ -54,10 +55,12 @@ class VPC:
describe_vpcs_paginator = regional_client.get_paginator("describe_vpcs") describe_vpcs_paginator = regional_client.get_paginator("describe_vpcs")
for page in describe_vpcs_paginator.paginate(): for page in describe_vpcs_paginator.paginate():
for vpc in page["Vpcs"]: for vpc in page["Vpcs"]:
arn = f"arn:{self.audited_partition}:ec2:{regional_client.region}:{self.audited_account}:vpc/{vpc['VpcId']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(vpc["VpcId"], self.audit_resources) is_resource_filtered(arn, self.audit_resources)
): ):
self.vpcs[vpc["VpcId"]] = VPCs( self.vpcs[vpc["VpcId"]] = VPCs(
arn=arn,
id=vpc["VpcId"], id=vpc["VpcId"],
default=vpc["IsDefault"], default=vpc["IsDefault"],
cidr_block=vpc["CidrBlock"], cidr_block=vpc["CidrBlock"],
@@ -77,14 +80,14 @@ class VPC:
) )
for page in describe_vpc_peering_connections_paginator.paginate(): for page in describe_vpc_peering_connections_paginator.paginate():
for conn in page["VpcPeeringConnections"]: for conn in page["VpcPeeringConnections"]:
arn = f"arn:{self.audited_partition}:ec2:{regional_client.region}:{self.audited_account}:vpc-peering-connection/{conn['VpcPeeringConnectionId']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
conn["VpcPeeringConnectionId"], self.audit_resources
)
): ):
conn["AccepterVpcInfo"]["CidrBlock"] = None conn["AccepterVpcInfo"]["CidrBlock"] = None
self.vpc_peering_connections.append( self.vpc_peering_connections.append(
VpcPeeringConnection( VpcPeeringConnection(
arn=arn,
id=conn["VpcPeeringConnectionId"], id=conn["VpcPeeringConnectionId"],
accepter_vpc=conn["AccepterVpcInfo"]["VpcId"], accepter_vpc=conn["AccepterVpcInfo"]["VpcId"],
accepter_cidr=conn["AccepterVpcInfo"].get("CidrBlock"), accepter_cidr=conn["AccepterVpcInfo"].get("CidrBlock"),
@@ -166,16 +169,16 @@ class VPC:
) )
for page in describe_vpc_endpoints_paginator.paginate(): for page in describe_vpc_endpoints_paginator.paginate():
for endpoint in page["VpcEndpoints"]: for endpoint in page["VpcEndpoints"]:
arn = f"arn:{self.audited_partition}:ec2:{regional_client.region}:{self.audited_account}:vpc-endpoint/{endpoint['VpcEndpointId']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
endpoint["VpcEndpointId"], self.audit_resources
)
): ):
endpoint_policy = None endpoint_policy = None
if endpoint.get("PolicyDocument"): if endpoint.get("PolicyDocument"):
endpoint_policy = json.loads(endpoint["PolicyDocument"]) endpoint_policy = json.loads(endpoint["PolicyDocument"])
self.vpc_endpoints.append( self.vpc_endpoints.append(
VpcEndpoint( VpcEndpoint(
arn=arn,
id=endpoint["VpcEndpointId"], id=endpoint["VpcEndpointId"],
vpc_id=endpoint["VpcId"], vpc_id=endpoint["VpcId"],
state=endpoint["State"], state=endpoint["State"],
@@ -199,13 +202,13 @@ class VPC:
for page in describe_vpc_endpoint_services_paginator.paginate(): for page in describe_vpc_endpoint_services_paginator.paginate():
for endpoint in page["ServiceDetails"]: for endpoint in page["ServiceDetails"]:
if endpoint["Owner"] != "amazon": if endpoint["Owner"] != "amazon":
arn = f"arn:{self.audited_partition}:ec2:{regional_client.region}:{self.audited_account}:vpc-endpoint-service/{endpoint['ServiceId']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
endpoint["ServiceId"], self.audit_resources
)
): ):
self.vpc_endpoint_services.append( self.vpc_endpoint_services.append(
VpcEndpointService( VpcEndpointService(
arn=arn,
id=endpoint["ServiceId"], id=endpoint["ServiceId"],
service=endpoint["ServiceName"], service=endpoint["ServiceName"],
owner_id=endpoint["Owner"], owner_id=endpoint["Owner"],
@@ -245,7 +248,7 @@ class VPC:
for page in describe_subnets_paginator.paginate(): for page in describe_subnets_paginator.paginate():
for subnet in page["Subnets"]: for subnet in page["Subnets"]:
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered(subnet["SubnetId"], self.audit_resources) is_resource_filtered(subnet["SubnetArn"], self.audit_resources)
): ):
try: try:
# Check the route table associated with the subnet to see if it's public # Check the route table associated with the subnet to see if it's public
@@ -285,6 +288,7 @@ class VPC:
nat_gateway = True nat_gateway = True
# Add it to to list of vpc_subnets and to the VPC object # Add it to to list of vpc_subnets and to the VPC object
object = VpcSubnet( object = VpcSubnet(
arn=subnet["SubnetArn"],
id=subnet["SubnetId"], id=subnet["SubnetId"],
default=subnet["DefaultForAz"], default=subnet["DefaultForAz"],
vpc_id=subnet["VpcId"], vpc_id=subnet["VpcId"],
@@ -312,6 +316,7 @@ class VPC:
class VpcSubnet(BaseModel): class VpcSubnet(BaseModel):
arn: str
id: str id: str
default: bool default: bool
vpc_id: str vpc_id: str
@@ -325,6 +330,7 @@ class VpcSubnet(BaseModel):
class VPCs(BaseModel): class VPCs(BaseModel):
arn: str
id: str id: str
default: bool default: bool
cidr_block: str cidr_block: str
@@ -340,6 +346,7 @@ class Route(BaseModel):
class VpcPeeringConnection(BaseModel): class VpcPeeringConnection(BaseModel):
arn: str
id: str id: str
accepter_vpc: str accepter_vpc: str
accepter_cidr: Optional[str] accepter_cidr: Optional[str]
@@ -351,6 +358,7 @@ class VpcPeeringConnection(BaseModel):
class VpcEndpoint(BaseModel): class VpcEndpoint(BaseModel):
arn: str
id: str id: str
vpc_id: str vpc_id: str
state: str state: str
@@ -361,6 +369,7 @@ class VpcEndpoint(BaseModel):
class VpcEndpointService(BaseModel): class VpcEndpointService(BaseModel):
arn: str
id: str id: str
service: str service: str
owner_id: str owner_id: str

View File

@@ -12,6 +12,7 @@ class vpc_subnet_different_az(Check):
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"VPC {vpc.id} has no subnets." report.status_extended = f"VPC {vpc.id} has no subnets."
report.resource_id = vpc.id report.resource_id = vpc.id
report.resource_arn = vpc.arn
if vpc.subnets: if vpc.subnets:
availability_zone = None availability_zone = None
for subnet in vpc.subnets: for subnet in vpc.subnets:

View File

@@ -11,7 +11,7 @@ class vpc_subnet_no_public_ip_by_default(Check):
report.region = subnet.region report.region = subnet.region
report.resource_tags = subnet.tags report.resource_tags = subnet.tags
report.resource_id = subnet.id report.resource_id = subnet.id
report.resource_arn = subnet.arn
if subnet.mapPublicIpOnLaunch: if subnet.mapPublicIpOnLaunch:
report.status = "FAIL" report.status = "FAIL"
report.status_extended = ( report.status_extended = (

View File

@@ -12,6 +12,7 @@ class vpc_subnet_separate_private_public(Check):
report.status = "FAIL" report.status = "FAIL"
report.status_extended = f"VPC {vpc.id} has no subnets." report.status_extended = f"VPC {vpc.id} has no subnets."
report.resource_id = vpc.id report.resource_id = vpc.id
report.resource_arn = vpc.arn
if vpc.subnets: if vpc.subnets:
public = False public = False
private = False private = False

View File

@@ -14,6 +14,8 @@ class WorkSpaces:
self.service = "workspaces" self.service = "workspaces"
self.session = audit_info.audit_session self.session = audit_info.audit_session
self.audit_resources = audit_info.audit_resources self.audit_resources = audit_info.audit_resources
self.audited_partition = audit_info.audited_partition
self.audited_account = audit_info.audited_account
self.regional_clients = generate_regional_clients(self.service, audit_info) self.regional_clients = generate_regional_clients(self.service, audit_info)
self.workspaces = [] self.workspaces = []
self.__threading_call__(self.__describe_workspaces__) self.__threading_call__(self.__describe_workspaces__)
@@ -39,12 +41,12 @@ class WorkSpaces:
) )
for page in describe_workspaces_paginator.paginate(): for page in describe_workspaces_paginator.paginate():
for workspace in page["Workspaces"]: for workspace in page["Workspaces"]:
arn = f"arn:{self.audited_partition}:workspaces:{regional_client.region}:{self.audited_account}:workspace/{workspace['WorkspaceId']}"
if not self.audit_resources or ( if not self.audit_resources or (
is_resource_filtered( is_resource_filtered(arn, self.audit_resources)
workspace["WorkspaceId"], self.audit_resources
)
): ):
workspace_to_append = WorkSpace( workspace_to_append = WorkSpace(
arn=arn,
id=workspace.get("WorkspaceId"), id=workspace.get("WorkspaceId"),
region=regional_client.region, region=regional_client.region,
subnet_id=workspace.get("SubnetId"), subnet_id=workspace.get("SubnetId"),

View File

@@ -120,7 +120,7 @@ class Test_apigateway_authorizers_enabled:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}"
) )
@mock_apigateway @mock_apigateway
@@ -161,5 +161,5 @@ class Test_apigateway_authorizers_enabled:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}"
) )

View File

@@ -130,7 +130,7 @@ class Test_apigateway_client_certificate_enabled:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}/stages/test" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}/stages/test"
) )
@mock_apigateway @mock_apigateway
@@ -162,7 +162,7 @@ class Test_apigateway_client_certificate_enabled:
service_client.rest_apis[0].stages.append( service_client.rest_apis[0].stages.append(
Stage( Stage(
name="test", name="test",
arn=f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/test-rest-api/stages/test", arn=f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/test-rest-api/stages/test",
logging=True, logging=True,
client_certificate=True, client_certificate=True,
waf=True, waf=True,
@@ -181,5 +181,5 @@ class Test_apigateway_client_certificate_enabled:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/test-rest-api/stages/test" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/test-rest-api/stages/test"
) )

View File

@@ -101,7 +101,7 @@ class Test_apigateway_endpoint_public:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}"
) )
@mock_apigateway @mock_apigateway
@@ -147,5 +147,5 @@ class Test_apigateway_endpoint_public:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}"
) )

View File

@@ -133,7 +133,7 @@ class Test_apigateway_logging_enabled:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}/stages/test" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}/stages/test"
) )
@mock_apigateway @mock_apigateway
@@ -202,5 +202,5 @@ class Test_apigateway_logging_enabled:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}/stages/test" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}/stages/test"
) )

View File

@@ -139,7 +139,7 @@ class Test_apigateway_waf_acl_attached:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}/stages/test" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}/stages/test"
) )
@mock_apigateway @mock_apigateway
@@ -208,5 +208,5 @@ class Test_apigateway_waf_acl_attached:
assert result[0].resource_id == "test-rest-api" assert result[0].resource_id == "test-rest-api"
assert ( assert (
result[0].resource_arn result[0].resource_arn
== f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/apis/{rest_api['id']}/stages/test" == f"arn:{current_audit_info.audited_partition}:apigateway:{AWS_REGION}::/restapis/{rest_api['id']}/stages/test"
) )

View File

@@ -38,6 +38,7 @@ class Test_glue_database_connections_ssl_enabled:
"CONNECTOR_CLASS_NAME": "test", "CONNECTOR_CLASS_NAME": "test",
}, },
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
@@ -60,6 +61,7 @@ class Test_glue_database_connections_ssl_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_table_with_SSL(self): def test_glue_table_with_SSL(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -75,6 +77,7 @@ class Test_glue_database_connections_ssl_enabled:
"JDBC_ENFORCE_SSL": "true", "JDBC_ENFORCE_SSL": "true",
}, },
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
@@ -97,3 +100,4 @@ class Test_glue_database_connections_ssl_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -32,6 +32,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -64,6 +65,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_unencrypted_endpoint(self): def test_glue_unencrypted_endpoint(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -72,6 +74,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -103,6 +106,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_no_sec_configs(self): def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -111,6 +115,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -134,3 +139,4 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -32,6 +32,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -64,6 +65,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_unencrypted_endpoint(self): def test_glue_unencrypted_endpoint(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -72,6 +74,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -103,6 +106,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_no_sec_configs(self): def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -111,6 +115,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -134,3 +139,4 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -32,6 +32,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -64,6 +65,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_unencrypted_endpoint(self): def test_glue_unencrypted_endpoint(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -72,6 +74,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -103,6 +106,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_no_sec_configs(self): def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -111,6 +115,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -134,3 +139,4 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -33,6 +33,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
security="sec_config", security="sec_config",
arguments=None, arguments=None,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -65,6 +66,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_unencrypted_job(self): def test_glue_unencrypted_job(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -74,6 +76,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
security="sec_config", security="sec_config",
arguments=None, arguments=None,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -105,6 +108,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_no_sec_configs(self): def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -113,6 +117,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -136,6 +141,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_encrypted_job_with_argument(self): def test_glue_encrypted_job_with_argument(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -148,6 +154,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
"--enable-job-insights": "false", "--enable-job-insights": "false",
}, },
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -171,3 +178,4 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -33,6 +33,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
security="sec_config", security="sec_config",
arguments=None, arguments=None,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -65,6 +66,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_unencrypted_job(self): def test_glue_unencrypted_job(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -74,6 +76,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
security="sec_config", security="sec_config",
arguments=None, arguments=None,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -105,6 +108,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_no_sec_configs(self): def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -113,6 +117,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -136,3 +141,4 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -33,6 +33,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
security="sec_config", security="sec_config",
arguments=None, arguments=None,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -65,6 +66,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_unencrypted_job(self): def test_glue_unencrypted_job(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -74,6 +76,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
security="sec_config", security="sec_config",
arguments=None, arguments=None,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [ glue_client.security_configs = [
@@ -105,6 +108,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"
def test_glue_no_sec_configs(self): def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock glue_client = mock.MagicMock
@@ -113,6 +117,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
name="test", name="test",
security="sec_config", security="sec_config",
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
] ]
glue_client.security_configs = [] glue_client.security_configs = []
@@ -136,3 +141,4 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == "test" assert result[0].resource_id == "test"
assert result[0].resource_arn == "arn_test"

View File

@@ -97,9 +97,11 @@ class Test_networkfirewall_in_all_vpc:
cidr_block="192.168.0.0/16", cidr_block="192.168.0.0/16",
flow_log=False, flow_log=False,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
subnets=[ subnets=[
VpcSubnet( VpcSubnet(
id="subnet-123456789", id="subnet-123456789",
arn="arn_test",
default=False, default=False,
vpc_id=VPC_ID_PROTECTED, vpc_id=VPC_ID_PROTECTED,
cidr_block="192.168.0.0/24", cidr_block="192.168.0.0/24",
@@ -146,7 +148,7 @@ class Test_networkfirewall_in_all_vpc:
assert result[0].region == AWS_REGION assert result[0].region == AWS_REGION
assert result[0].resource_id == VPC_ID_PROTECTED assert result[0].resource_id == VPC_ID_PROTECTED
assert result[0].resource_tags == [] assert result[0].resource_tags == []
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"
def test_vpcs_without_firewall(self): def test_vpcs_without_firewall(self):
networkfirewall_client = mock.MagicMock networkfirewall_client = mock.MagicMock
@@ -161,9 +163,11 @@ class Test_networkfirewall_in_all_vpc:
cidr_block="192.168.0.0/16", cidr_block="192.168.0.0/16",
flow_log=False, flow_log=False,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
subnets=[ subnets=[
VpcSubnet( VpcSubnet(
id="subnet-123456789", id="subnet-123456789",
arn="arn_test",
default=False, default=False,
vpc_id=VPC_ID_UNPROTECTED, vpc_id=VPC_ID_UNPROTECTED,
cidr_block="192.168.0.0/24", cidr_block="192.168.0.0/24",
@@ -210,7 +214,7 @@ class Test_networkfirewall_in_all_vpc:
assert result[0].region == AWS_REGION assert result[0].region == AWS_REGION
assert result[0].resource_id == VPC_ID_UNPROTECTED assert result[0].resource_id == VPC_ID_UNPROTECTED
assert result[0].resource_tags == [] assert result[0].resource_tags == []
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"
def test_vpcs_with_and_without_firewall(self): def test_vpcs_with_and_without_firewall(self):
networkfirewall_client = mock.MagicMock networkfirewall_client = mock.MagicMock
@@ -235,9 +239,11 @@ class Test_networkfirewall_in_all_vpc:
cidr_block="192.168.0.0/16", cidr_block="192.168.0.0/16",
flow_log=False, flow_log=False,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
subnets=[ subnets=[
VpcSubnet( VpcSubnet(
id="subnet-123456789", id="subnet-123456789",
arn="arn_test",
default=False, default=False,
vpc_id=VPC_ID_UNPROTECTED, vpc_id=VPC_ID_UNPROTECTED,
cidr_block="192.168.0.0/24", cidr_block="192.168.0.0/24",
@@ -257,9 +263,11 @@ class Test_networkfirewall_in_all_vpc:
cidr_block="192.168.0.0/16", cidr_block="192.168.0.0/16",
flow_log=False, flow_log=False,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
subnets=[ subnets=[
VpcSubnet( VpcSubnet(
id="subnet-123456789", id="subnet-123456789",
arn="arn_test",
default=False, default=False,
vpc_id=VPC_ID_PROTECTED, vpc_id=VPC_ID_PROTECTED,
cidr_block="192.168.0.0/24", cidr_block="192.168.0.0/24",
@@ -308,7 +316,7 @@ class Test_networkfirewall_in_all_vpc:
assert r.region == AWS_REGION assert r.region == AWS_REGION
assert r.resource_id == VPC_ID_PROTECTED assert r.resource_id == VPC_ID_PROTECTED
assert r.resource_tags == [] assert r.resource_tags == []
assert r.resource_arn == "" assert r.resource_arn == "arn_test"
if r.resource_id == VPC_ID_UNPROTECTED: if r.resource_id == VPC_ID_UNPROTECTED:
assert r.status == "FAIL" assert r.status == "FAIL"
assert ( assert (
@@ -318,4 +326,4 @@ class Test_networkfirewall_in_all_vpc:
assert r.region == AWS_REGION assert r.region == AWS_REGION
assert r.resource_id == VPC_ID_UNPROTECTED assert r.resource_id == VPC_ID_UNPROTECTED
assert r.resource_tags == [] assert r.resource_tags == []
assert r.resource_arn == "" assert r.resource_arn == "arn_test"

View File

@@ -77,7 +77,12 @@ class Test_sqs_queues_not_publicly_accessible:
sqs_client = mock.MagicMock sqs_client = mock.MagicMock
sqs_client.queues = [] sqs_client.queues = []
sqs_client.queues.append( sqs_client.queues.append(
Queue(id=queue_id, region=AWS_REGION, policy=test_restricted_policy) Queue(
id=queue_id,
region=AWS_REGION,
policy=test_restricted_policy,
arn="arn_test",
)
) )
with mock.patch( with mock.patch(
"prowler.providers.aws.services.sqs.sqs_service.SQS", "prowler.providers.aws.services.sqs.sqs_service.SQS",
@@ -93,13 +98,18 @@ class Test_sqs_queues_not_publicly_accessible:
assert result[0].status == "PASS" assert result[0].status == "PASS"
assert search("is not public", result[0].status_extended) assert search("is not public", result[0].status_extended)
assert result[0].resource_id == queue_id assert result[0].resource_id == queue_id
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"
def test_queues_public(self): def test_queues_public(self):
sqs_client = mock.MagicMock sqs_client = mock.MagicMock
sqs_client.queues = [] sqs_client.queues = []
sqs_client.queues.append( sqs_client.queues.append(
Queue(id=queue_id, region=AWS_REGION, policy=test_public_policy) Queue(
id=queue_id,
region=AWS_REGION,
policy=test_public_policy,
arn="arn_test",
)
) )
with mock.patch( with mock.patch(
"prowler.providers.aws.services.sqs.sqs_service.SQS", "prowler.providers.aws.services.sqs.sqs_service.SQS",
@@ -115,14 +125,17 @@ class Test_sqs_queues_not_publicly_accessible:
assert result[0].status == "FAIL" assert result[0].status == "FAIL"
assert search("policy with public access", result[0].status_extended) assert search("policy with public access", result[0].status_extended)
assert result[0].resource_id == queue_id assert result[0].resource_id == queue_id
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"
def test_queues_public_with_condition(self): def test_queues_public_with_condition(self):
sqs_client = mock.MagicMock sqs_client = mock.MagicMock
sqs_client.queues = [] sqs_client.queues = []
sqs_client.queues.append( sqs_client.queues.append(
Queue( Queue(
id=queue_id, region=AWS_REGION, policy=test_public_policy_with_condition id=queue_id,
region=AWS_REGION,
policy=test_public_policy_with_condition,
arn="arn_test",
) )
) )
with mock.patch( with mock.patch(
@@ -142,4 +155,4 @@ class Test_sqs_queues_not_publicly_accessible:
result[0].status_extended, result[0].status_extended,
) )
assert result[0].resource_id == queue_id assert result[0].resource_id == queue_id
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"

View File

@@ -32,7 +32,12 @@ class Test_sqs_queues_server_side_encryption_enabled:
sqs_client = mock.MagicMock sqs_client = mock.MagicMock
sqs_client.queues = [] sqs_client.queues = []
sqs_client.queues.append( sqs_client.queues.append(
Queue(id=queue_id, region=AWS_REGION, kms_key_id=test_kms_key_id) Queue(
id=queue_id,
region=AWS_REGION,
kms_key_id=test_kms_key_id,
arn="arn_test",
)
) )
with mock.patch( with mock.patch(
"prowler.providers.aws.services.sqs.sqs_service.SQS", "prowler.providers.aws.services.sqs.sqs_service.SQS",
@@ -48,7 +53,7 @@ class Test_sqs_queues_server_side_encryption_enabled:
assert result[0].status == "PASS" assert result[0].status == "PASS"
assert search("is using Server Side Encryption", result[0].status_extended) assert search("is using Server Side Encryption", result[0].status_extended)
assert result[0].resource_id == queue_id assert result[0].resource_id == queue_id
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"
def test_queues_no_encryption(self): def test_queues_no_encryption(self):
sqs_client = mock.MagicMock sqs_client = mock.MagicMock
@@ -57,6 +62,7 @@ class Test_sqs_queues_server_side_encryption_enabled:
Queue( Queue(
id=queue_id, id=queue_id,
region=AWS_REGION, region=AWS_REGION,
arn="arn_test",
) )
) )
with mock.patch( with mock.patch(
@@ -75,4 +81,4 @@ class Test_sqs_queues_server_side_encryption_enabled:
"is not using Server Side Encryption", result[0].status_extended "is not using Server Side Encryption", result[0].status_extended
) )
assert result[0].resource_id == queue_id assert result[0].resource_id == queue_id
assert result[0].resource_arn == "" assert result[0].resource_arn == "arn_test"