feat(glue): add check glue_ml_transform_encrypted_at_rest (#5272)

Co-authored-by: Lefteris Gilmaz <lefterisgilmaz@Lefteriss-MacBook-Pro.local>
Co-authored-by: Rubén De la Torre Vico <rubendltv22@gmail.com>
Co-authored-by: Sergio <sergio@prowler.com>
This commit is contained in:
Lefteris
2024-10-04 19:13:11 +01:00
committed by GitHub
parent 66f2754017
commit c239ede3f9
15 changed files with 474 additions and 131 deletions
@@ -0,0 +1,32 @@
{
"Provider": "aws",
"CheckID": "glue_ml_transform_encrypted_at_rest",
"CheckTitle": "Check if Glue ML Transform Encryption at Rest is Enabled",
"CheckType": [],
"ServiceName": "glue",
"SubServiceName": "",
"ResourceIdTemplate": "arn:aws:glue:region:account-id:mlTransform/transform-id",
"Severity": "medium",
"ResourceType": "Other",
"Description": "This control checks whether an AWS Glue machine learning transform is encrypted at rest. The control fails if the machine learning transform isn't encrypted at rest.",
"Risk": "Data at rest refers to data that's stored in persistent, non-volatile storage for any duration. Encrypting data at rest helps you protect its confidentiality, which reduces the risk that an unauthorized user can access it.",
"RelatedUrl": "https://docs.aws.amazon.com/glue/latest/dg/encryption-at-rest.html",
"Remediation": {
"Code": {
"CLI": "aws glue update-ml-transform --transform-id <transform-id> --encryption-at-rest {\"Enabled\":true,\"KmsKey\":\"<kms-key-arn>\"}",
"NativeIaC": "",
"Other": "https://docs.aws.amazon.com/securityhub/latest/userguide/glue-controls.html#glue-3",
"Terraform": ""
},
"Recommendation": {
"Text": "Enable encryption at rest for Glue ML Transforms using AWS KMS keys.",
"Url": "https://docs.aws.amazon.com/glue/latest/dg/encryption-at-rest.html"
}
},
"Categories": [
"encryption"
],
"DependsOn": [],
"RelatedTo": [],
"Notes": ""
}
@@ -0,0 +1,28 @@
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.glue.glue_client import glue_client
class glue_ml_transform_encrypted_at_rest(Check):
def execute(self):
findings = []
for ml_transform_arn, ml_transform in glue_client.ml_transforms.items():
report = Check_Report_AWS(self.metadata())
report.resource_id = ml_transform.id
report.resource_arn = ml_transform_arn
report.region = ml_transform.region
report.resource_tags = ml_transform.tags
report.status = "PASS"
report.status_extended = (
f"Glue ML Transform {ml_transform.name} is encrypted at rest."
)
if ml_transform.user_data_encryption == "DISABLED":
report.status = "FAIL"
report.status_extended = (
f"Glue ML Transform {ml_transform.name} is not encrypted at rest."
)
findings.append(report)
return findings
@@ -27,6 +27,9 @@ class Glue(AWSService):
self.jobs = []
self.__threading_call__(self._get_jobs)
self.__threading_call__(self._list_tags, self.jobs)
self.ml_transforms = {}
self.__threading_call__(self._get_ml_transforms)
self.__threading_call__(self._list_tags, self.ml_transforms.values())
def _get_data_catalog_arn_template(self, region):
return f"arn:{self.audited_partition}:glue:{region}:{self.audited_account}:data-catalog"
@@ -219,6 +222,30 @@ class Glue(AWSService):
f"{resource.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
)
def _get_ml_transforms(self, regional_client):
logger.info("Glue - Getting ML Transforms...")
try:
transforms = regional_client.get_ml_transforms()["Transforms"]
for transform in transforms:
ml_transform_arn = f"arn:{self.audited_partition}:glue:{regional_client.region}:{self.audited_account}:mlTransform/{transform['TransformId']}"
if not self.audit_resources or is_resource_filtered(
ml_transform_arn, self.audit_resources
):
self.ml_transforms[ml_transform_arn] = MLTransform(
arn=ml_transform_arn,
id=transform["TransformId"],
name=transform["Name"],
user_data_encryption=transform.get("TransformEncryption", {})
.get("MlUserDataEncryption", {})
.get("MlUserDataEncryptionMode", "DISABLED"),
region=regional_client.region,
)
except Exception as error:
logger.error(
f"{regional_client.region} -- {error.__class__.__name__}[{error.__traceback__.tb_lineno}]: {error}"
)
class Connection(BaseModel):
name: str
@@ -272,3 +299,12 @@ class SecurityConfig(BaseModel):
jb_encryption: str
jb_key_arn: Optional[str]
region: str
class MLTransform(BaseModel):
arn: str
id: str
name: str
user_data_encryption: str
region: str
tags: Optional[list]
@@ -1,4 +1,4 @@
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import CatalogEncryptionSetting
from tests.providers.aws.utils import (
@@ -11,13 +11,16 @@ from tests.providers.aws.utils import (
class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
def test_glue_no_settings(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_connection_passwords_encryption_enabled.glue_data_catalogs_connection_passwords_encryption_enabled import (
@@ -30,7 +33,7 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
assert len(result) == 0
def test_glue_catalog_password_unencrypted(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -46,12 +49,15 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
glue_client.audited_partition = AWS_COMMERCIAL_PARTITION
glue_client.region = AWS_REGION_US_EAST_1
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_connection_passwords_encryption_enabled.glue_data_catalogs_connection_passwords_encryption_enabled import (
@@ -72,7 +78,7 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
assert result[0].region == AWS_REGION_US_EAST_1
def test_glue_catalog_password_unencrypted_ignoring(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -88,13 +94,16 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
glue_client.audited_partition = AWS_COMMERCIAL_PARTITION
glue_client.region = AWS_REGION_US_EAST_1
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
glue_client.provider._scan_unused_services = False
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_connection_passwords_encryption_enabled.glue_data_catalogs_connection_passwords_encryption_enabled import (
@@ -107,7 +116,7 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
assert len(result) == 0
def test_glue_catalog_password_unencrypted_ignoring_with_tables(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -123,13 +132,16 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
glue_client.region = AWS_REGION_US_EAST_1
glue_client.audited_account = AWS_ACCOUNT_NUMBER
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
glue_client.provider._scan_unused_services = False
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_connection_passwords_encryption_enabled.glue_data_catalogs_connection_passwords_encryption_enabled import (
@@ -150,7 +162,7 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
assert result[0].region == AWS_REGION_US_EAST_1
def test_glue_catalog_encrypted(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -165,13 +177,16 @@ class Test_glue_data_catalogs_connection_passwords_encryption_enabled:
glue_client.region = AWS_REGION_US_EAST_1
glue_client.audited_account = AWS_ACCOUNT_NUMBER
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_connection_passwords_encryption_enabled.glue_data_catalogs_connection_passwords_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import CatalogEncryptionSetting
from tests.providers.aws.utils import (
@@ -12,13 +12,16 @@ from tests.providers.aws.utils import (
class Test_glue_data_catalogs_metadata_encryption_enabled:
def test_glue_no_settings(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider
glue_client.catalog_encryption_settings = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_metadata_encryption_enabled.glue_data_catalogs_metadata_encryption_enabled import (
@@ -31,7 +34,7 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
assert len(result) == 0
def test_glue_catalog_unencrypted(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -47,12 +50,15 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
glue_client.audited_account = AWS_ACCOUNT_NUMBER
glue_client.audited_partition = AWS_COMMERCIAL_PARTITION
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_metadata_encryption_enabled.glue_data_catalogs_metadata_encryption_enabled import (
@@ -73,7 +79,7 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
assert result[0].region == AWS_REGION_US_EAST_1
def test_glue_catalog_unencrypted_ignoring(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -90,12 +96,15 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
glue_client.audited_account = AWS_ACCOUNT_NUMBER
glue_client.audited_partition = AWS_COMMERCIAL_PARTITION
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_metadata_encryption_enabled.glue_data_catalogs_metadata_encryption_enabled import (
@@ -108,7 +117,7 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
assert len(result) == 0
def test_glue_catalog_unencrypted_ignoring_with_tables(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -125,12 +134,15 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
glue_client.audited_account = AWS_ACCOUNT_NUMBER
glue_client.audited_partition = AWS_COMMERCIAL_PARTITION
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_metadata_encryption_enabled.glue_data_catalogs_metadata_encryption_enabled import (
@@ -151,7 +163,7 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
assert result[0].region == AWS_REGION_US_EAST_1
def test_glue_catalog_encrypted(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.provider = set_mocked_aws_provider()
glue_client.catalog_encryption_settings = [
CatalogEncryptionSetting(
@@ -167,12 +179,15 @@ class Test_glue_data_catalogs_metadata_encryption_enabled:
glue_client.audited_account = AWS_ACCOUNT_NUMBER
glue_client.audited_partition = AWS_COMMERCIAL_PARTITION
glue_client.data_catalog_arn_template = f"arn:{glue_client.audited_partition}:glue:{glue_client.region}:{glue_client.audited_account}:data-catalog"
glue_client._get_data_catalog_arn_template = mock.MagicMock(
glue_client._get_data_catalog_arn_template = MagicMock(
return_value=glue_client.data_catalog_arn_template
)
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_data_catalogs_metadata_encryption_enabled.glue_data_catalogs_metadata_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import Connection
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_database_connections_ssl_enabled:
def test_glue_no_conns(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.connections = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_database_connections_ssl_enabled.glue_database_connections_ssl_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_database_connections_ssl_enabled:
assert len(result) == 0
def test_glue_table_no_SSL(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.connections = [
Connection(
name="test",
@@ -42,9 +45,12 @@ class Test_glue_database_connections_ssl_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_database_connections_ssl_enabled.glue_database_connections_ssl_enabled import (
@@ -65,7 +71,7 @@ class Test_glue_database_connections_ssl_enabled:
assert result[0].resource_tags == [{"test": "test"}]
def test_glue_table_with_SSL(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.connections = [
Connection(
name="test",
@@ -83,9 +89,12 @@ class Test_glue_database_connections_ssl_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_database_connections_ssl_enabled.glue_database_connections_ssl_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import DevEndpoint, SecurityConfig
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
def test_glue_no_endpoints(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_cloudwatch_logs_encryption_enabled.glue_development_endpoints_cloudwatch_logs_encryption_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
assert len(result) == 0
def test_glue_encrypted_endpoint(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -46,9 +49,12 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_cloudwatch_logs_encryption_enabled.glue_development_endpoints_cloudwatch_logs_encryption_enabled import (
@@ -69,7 +75,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_unencrypted_endpoint(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -89,9 +95,12 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_cloudwatch_logs_encryption_enabled.glue_development_endpoints_cloudwatch_logs_encryption_enabled import (
@@ -112,7 +121,7 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -124,9 +133,12 @@ class Test_glue_development_endpoints_cloudwatch_logs_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_cloudwatch_logs_encryption_enabled.glue_development_endpoints_cloudwatch_logs_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import DevEndpoint, SecurityConfig
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
def test_glue_no_endpoints(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_job_bookmark_encryption_enabled.glue_development_endpoints_job_bookmark_encryption_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
assert len(result) == 0
def test_glue_encrypted_endpoint(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -46,9 +49,12 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_job_bookmark_encryption_enabled.glue_development_endpoints_job_bookmark_encryption_enabled import (
@@ -69,7 +75,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
assert result[0].resource_tags == [{"test": "value"}]
def test_glue_unencrypted_endpoint(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -89,9 +95,12 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_job_bookmark_encryption_enabled.glue_development_endpoints_job_bookmark_encryption_enabled import (
@@ -112,7 +121,7 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
assert result[0].resource_tags == [{"test": "value"}]
def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -124,9 +133,12 @@ class Test_glue_development_endpoints_job_bookmark_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_job_bookmark_encryption_enabled.glue_development_endpoints_job_bookmark_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import DevEndpoint, SecurityConfig
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_development_endpoints_s3_encryption_enabled:
def test_glue_no_endpoints(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_s3_encryption_enabled.glue_development_endpoints_s3_encryption_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
assert len(result) == 0
def test_glue_encrypted_endpoint(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -46,9 +49,12 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_s3_encryption_enabled.glue_development_endpoints_s3_encryption_enabled import (
@@ -69,7 +75,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_unencrypted_endpoint(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -89,9 +95,12 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_s3_encryption_enabled.glue_development_endpoints_s3_encryption_enabled import (
@@ -112,7 +121,7 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.dev_endpoints = [
DevEndpoint(
name="test",
@@ -124,9 +133,12 @@ class Test_glue_development_endpoints_s3_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_development_endpoints_s3_encryption_enabled.glue_development_endpoints_s3_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import Job, SecurityConfig
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
def test_glue_no_jobs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_amazon_s3_encryption_enabled.glue_etl_jobs_amazon_s3_encryption_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
assert len(result) == 0
def test_glue_encrypted_job(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -47,9 +50,12 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_amazon_s3_encryption_enabled.glue_etl_jobs_amazon_s3_encryption_enabled import (
@@ -70,7 +76,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_unencrypted_job(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -91,9 +97,12 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_amazon_s3_encryption_enabled.glue_etl_jobs_amazon_s3_encryption_enabled import (
@@ -114,7 +123,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -126,9 +135,12 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_amazon_s3_encryption_enabled.glue_etl_jobs_amazon_s3_encryption_enabled import (
@@ -149,7 +161,7 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_encrypted_job_with_argument(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -165,9 +177,12 @@ class Test_glue_etl_jobs_amazon_s3_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_amazon_s3_encryption_enabled.glue_etl_jobs_amazon_s3_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import Job, SecurityConfig
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
def test_glue_no_jobs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_cloudwatch_logs_encryption_enabled.glue_etl_jobs_cloudwatch_logs_encryption_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
assert len(result) == 0
def test_glue_encrypted_job(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -47,9 +50,12 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_cloudwatch_logs_encryption_enabled.glue_etl_jobs_cloudwatch_logs_encryption_enabled import (
@@ -70,7 +76,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_unencrypted_job(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -91,9 +97,12 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_cloudwatch_logs_encryption_enabled.glue_etl_jobs_cloudwatch_logs_encryption_enabled import (
@@ -114,7 +123,7 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -126,9 +135,12 @@ class Test_glue_etl_jobs_cloudwatch_logs_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_cloudwatch_logs_encryption_enabled.glue_etl_jobs_cloudwatch_logs_encryption_enabled import (
@@ -1,5 +1,5 @@
from re import search
from unittest import mock
from unittest.mock import MagicMock, patch
from prowler.providers.aws.services.glue.glue_service import Job, SecurityConfig
from tests.providers.aws.utils import AWS_REGION_US_EAST_1
@@ -7,12 +7,15 @@ from tests.providers.aws.utils import AWS_REGION_US_EAST_1
class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
def test_glue_no_jobs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_job_bookmark_encryption_enabled.glue_etl_jobs_job_bookmark_encryption_enabled import (
@@ -25,7 +28,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
assert len(result) == 0
def test_glue_encrypted_job(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -47,9 +50,12 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_job_bookmark_encryption_enabled.glue_etl_jobs_job_bookmark_encryption_enabled import (
@@ -70,7 +76,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_unencrypted_job(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -91,9 +97,12 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
)
]
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_job_bookmark_encryption_enabled.glue_etl_jobs_job_bookmark_encryption_enabled import (
@@ -114,7 +123,7 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
assert result[0].resource_tags == [{"key_test": "value_test"}]
def test_glue_no_sec_configs(self):
glue_client = mock.MagicMock
glue_client = MagicMock
glue_client.jobs = [
Job(
name="test",
@@ -126,9 +135,12 @@ class Test_glue_etl_jobs_job_bookmark_encryption_enabled:
]
glue_client.security_configs = []
with mock.patch(
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
glue_client,
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
# Test Check
from prowler.providers.aws.services.glue.glue_etl_jobs_job_bookmark_encryption_enabled.glue_etl_jobs_job_bookmark_encryption_enabled import (
@@ -0,0 +1,109 @@
from unittest.mock import MagicMock, patch
from tests.providers.aws.utils import AWS_ACCOUNT_NUMBER, AWS_REGION_EU_WEST_1
class Test_glue_ml_transform_encrypted_at_rest:
def test_no_ml_transfroms(self):
glue_client = MagicMock
glue_client.ml_transforms = {}
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
from prowler.providers.aws.services.glue.glue_ml_transform_encrypted_at_rest.glue_ml_transform_encrypted_at_rest import (
glue_ml_transform_encrypted_at_rest,
)
check = glue_ml_transform_encrypted_at_rest()
result = check.execute()
assert len(result) == 0
def test_ml_transform_encryption_disabled(self):
glue_client = MagicMock
ml_transform_id = "transform1"
ml_transform_arn = f"arn:aws:glue:{AWS_REGION_EU_WEST_1}:{AWS_ACCOUNT_NUMBER}:mlTransform/{ml_transform_id}"
from prowler.providers.aws.services.glue.glue_service import MLTransform
glue_client.ml_transforms = {
ml_transform_arn: MLTransform(
arn=ml_transform_arn,
id=ml_transform_id,
name="ml-transform1",
user_data_encryption="DISABLED",
region=AWS_REGION_EU_WEST_1,
tags=[{"test_key": "test_value"}],
)
}
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
from prowler.providers.aws.services.glue.glue_ml_transform_encrypted_at_rest.glue_ml_transform_encrypted_at_rest import (
glue_ml_transform_encrypted_at_rest,
)
check = glue_ml_transform_encrypted_at_rest()
result = check.execute()
assert len(result) == 1
assert result[0].status == "FAIL"
assert result[0].resource_id == ml_transform_id
assert result[0].resource_arn == ml_transform_arn
assert result[0].region == AWS_REGION_EU_WEST_1
assert (
result[0].status_extended
== "Glue ML Transform ml-transform1 is not encrypted at rest."
)
def test_ml_transform_encryption_enabled(self):
glue_client = MagicMock
ml_transform_id = "transform2"
ml_transform_arn = f"arn:aws:glue:{AWS_REGION_EU_WEST_1}:{AWS_ACCOUNT_NUMBER}:mlTransform/{ml_transform_id}"
from prowler.providers.aws.services.glue.glue_service import MLTransform
glue_client.ml_transforms = {
ml_transform_arn: MLTransform(
arn=ml_transform_arn,
id=ml_transform_id,
name="ml-transform2",
user_data_encryption="SSE-KMS",
region=AWS_REGION_EU_WEST_1,
tags=[{"test_key": "test_value"}],
)
}
with patch(
"prowler.providers.aws.services.glue.glue_service.Glue",
new=glue_client,
), patch(
"prowler.providers.aws.services.glue.glue_client.glue_client",
new=glue_client,
):
from prowler.providers.aws.services.glue.glue_ml_transform_encrypted_at_rest.glue_ml_transform_encrypted_at_rest import (
glue_ml_transform_encrypted_at_rest,
)
check = glue_ml_transform_encrypted_at_rest()
result = check.execute()
assert len(result) == 1
assert result[0].status == "PASS"
assert result[0].resource_id == ml_transform_id
assert result[0].resource_arn == ml_transform_arn
assert result[0].region == AWS_REGION_EU_WEST_1
assert (
result[0].status_extended
== "Glue ML Transform ml-transform2 is encrypted at rest."
)
@@ -100,6 +100,16 @@ def mock_make_api_call(self, operation_name, kwarg):
},
],
}
elif operation_name == "GetMLTransforms":
return {
"Transforms": [
{
"Name": "ml-transform1",
"TransformId": "transform1",
"UserDefinedEncryption": "DISABLED",
}
]
}
elif operation_name == "GetTags":
return {
"Tags": {
@@ -234,6 +244,20 @@ class Test_Glue_Service:
}
assert glue.jobs[0].region == AWS_REGION_US_EAST_1
@mock_aws
def test_get_ml_transforms(self):
aws_provider = set_mocked_aws_provider()
glue = Glue(aws_provider)
arn_transform = f"arn:aws:glue:{AWS_REGION_US_EAST_1}:{AWS_ACCOUNT_NUMBER}:mlTransform/transform1"
assert len(glue.ml_transforms) == 1
assert arn_transform in glue.ml_transforms
assert glue.ml_transforms[arn_transform].arn == arn_transform
assert glue.ml_transforms[arn_transform].id == "transform1"
assert glue.ml_transforms[arn_transform].name == "ml-transform1"
assert glue.ml_transforms[arn_transform].user_data_encryption == "DISABLED"
assert glue.ml_transforms[arn_transform].region == AWS_REGION_US_EAST_1
@mock_aws
def test_get_tags(self):
aws_provider = set_mocked_aws_provider()