prowler 5.15.1__py3-none-any.whl → 5.16.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prowler/CHANGELOG.md +34 -0
- prowler/config/config.py +1 -1
- prowler/lib/outputs/compliance/prowler_threatscore/prowler_threatscore.py +15 -4
- prowler/providers/aws/aws_regions_by_service.json +1 -20
- prowler/providers/aws/services/bedrock/bedrock_api_key_no_administrative_privileges/bedrock_api_key_no_administrative_privileges.metadata.json +1 -1
- prowler/providers/aws/services/bedrock/bedrock_api_key_no_long_term_credentials/bedrock_api_key_no_long_term_credentials.metadata.json +1 -1
- prowler/providers/aws/services/ec2/ec2_instance_account_imdsv2_enabled/ec2_instance_account_imdsv2_enabled.metadata.json +2 -1
- prowler/providers/aws/services/ec2/ec2_instance_imdsv2_enabled/ec2_instance_imdsv2_enabled.metadata.json +3 -1
- prowler/providers/aws/services/ec2/ec2_instance_uses_single_eni/ec2_instance_uses_single_eni.metadata.json +1 -1
- prowler/providers/aws/services/glue/glue_data_catalogs_connection_passwords_encryption_enabled/glue_data_catalogs_connection_passwords_encryption_enabled.metadata.json +17 -11
- prowler/providers/aws/services/glue/glue_data_catalogs_metadata_encryption_enabled/glue_data_catalogs_metadata_encryption_enabled.metadata.json +17 -10
- prowler/providers/aws/services/glue/glue_data_catalogs_not_publicly_accessible/glue_data_catalogs_not_publicly_accessible.metadata.json +18 -11
- prowler/providers/aws/services/glue/glue_database_connections_ssl_enabled/glue_database_connections_ssl_enabled.metadata.json +18 -12
- prowler/providers/aws/services/glue/glue_development_endpoints_cloudwatch_logs_encryption_enabled/glue_development_endpoints_cloudwatch_logs_encryption_enabled.metadata.json +17 -11
- prowler/providers/aws/services/glue/glue_development_endpoints_job_bookmark_encryption_enabled/glue_development_endpoints_job_bookmark_encryption_enabled.metadata.json +17 -12
- prowler/providers/aws/services/glue/glue_development_endpoints_s3_encryption_enabled/glue_development_endpoints_s3_encryption_enabled.metadata.json +17 -11
- prowler/providers/aws/services/glue/glue_etl_jobs_amazon_s3_encryption_enabled/glue_etl_jobs_amazon_s3_encryption_enabled.metadata.json +21 -14
- prowler/providers/aws/services/glue/glue_etl_jobs_cloudwatch_logs_encryption_enabled/glue_etl_jobs_cloudwatch_logs_encryption_enabled.metadata.json +19 -12
- prowler/providers/aws/services/glue/glue_etl_jobs_job_bookmark_encryption_enabled/glue_etl_jobs_job_bookmark_encryption_enabled.metadata.json +17 -12
- prowler/providers/aws/services/glue/glue_etl_jobs_logging_enabled/glue_etl_jobs_logging_enabled.metadata.json +18 -12
- prowler/providers/aws/services/glue/glue_ml_transform_encrypted_at_rest/glue_ml_transform_encrypted_at_rest.metadata.json +20 -12
- prowler/providers/aws/services/iam/iam_inline_policy_allows_privilege_escalation/iam_inline_policy_allows_privilege_escalation.metadata.json +3 -1
- prowler/providers/aws/services/iam/iam_policy_allows_privilege_escalation/iam_policy_allows_privilege_escalation.metadata.json +3 -1
- prowler/providers/aws/services/iam/iam_policy_cloudshell_admin_not_attached/iam_policy_cloudshell_admin_not_attached.metadata.json +1 -1
- prowler/providers/aws/services/iam/iam_role_administratoraccess_policy/iam_role_administratoraccess_policy.metadata.json +1 -1
- prowler/providers/aws/services/iam/iam_role_cross_account_readonlyaccess_policy/iam_role_cross_account_readonlyaccess_policy.metadata.json +1 -1
- prowler/providers/aws/services/iam/iam_role_cross_service_confused_deputy_prevention/iam_role_cross_service_confused_deputy_prevention.metadata.json +1 -1
- prowler/providers/aws/services/inspector2/inspector2_active_findings_exist/inspector2_active_findings_exist.metadata.json +23 -13
- prowler/providers/aws/services/inspector2/inspector2_is_enabled/inspector2_is_enabled.metadata.json +18 -12
- prowler/providers/aws/services/kafka/kafka_cluster_encryption_at_rest_uses_cmk/kafka_cluster_encryption_at_rest_uses_cmk.metadata.json +24 -13
- prowler/providers/aws/services/kafka/kafka_cluster_enhanced_monitoring_enabled/kafka_cluster_enhanced_monitoring_enabled.metadata.json +24 -14
- prowler/providers/aws/services/kafka/kafka_cluster_in_transit_encryption_enabled/kafka_cluster_in_transit_encryption_enabled.metadata.json +23 -15
- prowler/providers/aws/services/kafka/kafka_cluster_is_public/kafka_cluster_is_public.metadata.json +23 -14
- prowler/providers/aws/services/kafka/kafka_cluster_mutual_tls_authentication_enabled/kafka_cluster_mutual_tls_authentication_enabled.metadata.json +26 -15
- prowler/providers/aws/services/kafka/kafka_cluster_unrestricted_access_disabled/kafka_cluster_unrestricted_access_disabled.metadata.json +27 -15
- prowler/providers/aws/services/kafka/kafka_cluster_uses_latest_version/kafka_cluster_uses_latest_version.metadata.json +23 -14
- prowler/providers/aws/services/kafka/kafka_connector_in_transit_encryption_enabled/kafka_connector_in_transit_encryption_enabled.metadata.json +18 -13
- prowler/providers/aws/services/kms/kms_cmk_are_used/kms_cmk_are_used.metadata.json +16 -12
- prowler/providers/aws/services/kms/kms_cmk_not_deleted_unintentionally/kms_cmk_not_deleted_unintentionally.metadata.json +16 -10
- prowler/providers/aws/services/kms/kms_cmk_not_multi_region/kms_cmk_not_multi_region.metadata.json +21 -14
- prowler/providers/aws/services/kms/kms_cmk_rotation_enabled/kms_cmk_rotation_enabled.metadata.json +19 -13
- prowler/providers/aws/services/kms/kms_key_not_publicly_accessible/kms_key_not_publicly_accessible.metadata.json +22 -14
- prowler/providers/aws/services/memorydb/memorydb_cluster_auto_minor_version_upgrades/memorydb_cluster_auto_minor_version_upgrades.metadata.json +23 -14
- prowler/providers/aws/services/redshift/redshift_cluster_enhanced_vpc_routing/redshift_cluster_enhanced_vpc_routing.metadata.json +1 -1
- prowler/providers/aws/services/s3/s3_bucket_object_versioning/s3_bucket_object_versioning.metadata.json +1 -1
- prowler/providers/aws/services/s3/s3_bucket_shadow_resource_vulnerability/s3_bucket_shadow_resource_vulnerability.metadata.json +1 -1
- prowler/providers/aws/services/servicecatalog/servicecatalog_portfolio_shared_within_organization_only/servicecatalog_portfolio_shared_within_organization_only.metadata.json +17 -13
- prowler/providers/aws/services/sns/sns_subscription_not_using_http_endpoints/sns_subscription_not_using_http_endpoints.metadata.json +18 -11
- prowler/providers/aws/services/sns/sns_topics_kms_encryption_at_rest_enabled/sns_topics_kms_encryption_at_rest_enabled.metadata.json +23 -12
- prowler/providers/aws/services/sns/sns_topics_not_publicly_accessible/sns_topics_not_publicly_accessible.metadata.json +21 -12
- prowler/providers/aws/services/trustedadvisor/trustedadvisor_errors_and_warnings/trustedadvisor_errors_and_warnings.metadata.json +15 -9
- prowler/providers/aws/services/trustedadvisor/trustedadvisor_premium_support_plan_subscribed/trustedadvisor_premium_support_plan_subscribed.metadata.json +18 -10
- prowler/providers/aws/services/vpc/vpc_endpoint_connections_trust_boundaries/vpc_endpoint_connections_trust_boundaries.metadata.json +1 -1
- prowler/providers/aws/services/vpc/vpc_endpoint_services_allowed_principals_trust_boundaries/vpc_endpoint_services_allowed_principals_trust_boundaries.metadata.json +1 -1
- prowler/providers/aws/services/waf/waf_global_rule_with_conditions/waf_global_rule_with_conditions.metadata.json +21 -12
- prowler/providers/aws/services/waf/waf_global_rulegroup_not_empty/waf_global_rulegroup_not_empty.metadata.json +18 -12
- prowler/providers/aws/services/waf/waf_global_webacl_logging_enabled/waf_global_webacl_logging_enabled.metadata.json +19 -11
- prowler/providers/aws/services/waf/waf_global_webacl_with_rules/waf_global_webacl_with_rules.metadata.json +18 -11
- prowler/providers/aws/services/waf/waf_regional_rule_with_conditions/waf_regional_rule_with_conditions.metadata.json +17 -11
- prowler/providers/aws/services/waf/waf_regional_rulegroup_not_empty/waf_regional_rulegroup_not_empty.metadata.json +17 -11
- prowler/providers/aws/services/waf/waf_regional_webacl_with_rules/waf_regional_webacl_with_rules.metadata.json +18 -11
- prowler/providers/aws/services/wafv2/wafv2_webacl_logging_enabled/wafv2_webacl_logging_enabled.metadata.json +19 -12
- prowler/providers/aws/services/wafv2/wafv2_webacl_rule_logging_enabled/wafv2_webacl_rule_logging_enabled.metadata.json +19 -12
- prowler/providers/aws/services/wafv2/wafv2_webacl_with_rules/wafv2_webacl_with_rules.metadata.json +22 -13
- prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +1 -1
- prowler/providers/iac/lib/arguments/arguments.py +2 -2
- prowler/providers/mongodbatlas/services/clusters/clusters_service.py +23 -3
- {prowler-5.15.1.dist-info → prowler-5.16.1.dist-info}/METADATA +4 -2
- {prowler-5.15.1.dist-info → prowler-5.16.1.dist-info}/RECORD +72 -72
- {prowler-5.15.1.dist-info → prowler-5.16.1.dist-info}/LICENSE +0 -0
- {prowler-5.15.1.dist-info → prowler-5.16.1.dist-info}/WHEEL +0 -0
- {prowler-5.15.1.dist-info → prowler-5.16.1.dist-info}/entry_points.txt +0 -0
|
@@ -1,31 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kafka_cluster_in_transit_encryption_enabled",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "Kafka cluster has encryption in transit enabled",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices"
|
|
7
8
|
],
|
|
8
9
|
"ServiceName": "kafka",
|
|
9
|
-
"SubServiceName": "
|
|
10
|
-
"ResourceIdTemplate": "
|
|
11
|
-
"Severity": "
|
|
10
|
+
"SubServiceName": "",
|
|
11
|
+
"ResourceIdTemplate": "",
|
|
12
|
+
"Severity": "high",
|
|
12
13
|
"ResourceType": "AwsMskCluster",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
14
|
+
"Description": "**Amazon MSK clusters** are evaluated for **encryption in transit** on both paths: **clientbroker** set to `TLS` only and **inter-broker** encryption enabled. *Serverless clusters provide this by default*.\n\nThe finding highlights clusters where client-broker traffic isn't `TLS`-only or inter-broker encryption is turned off.",
|
|
15
|
+
"Risk": "Unencrypted or mixed (`TLS_PLAINTEXT`/`PLAINTEXT`) traffic enables interception of records, credentials, and metadata, supporting **MITM**, replay, and message tampering.\n\nPlaintext inter-broker links expose replication data within the VPC, enabling **lateral movement** and topic poisoning, degrading data **confidentiality** and **integrity**.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/msk-encryption.html",
|
|
19
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/msk-working-with-encryption.html",
|
|
20
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/MSK/encryption-in-transit-for-msk.html"
|
|
21
|
+
],
|
|
16
22
|
"Remediation": {
|
|
17
23
|
"Code": {
|
|
18
|
-
"CLI": "
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "
|
|
21
|
-
"Terraform": "
|
|
24
|
+
"CLI": "",
|
|
25
|
+
"NativeIaC": "```yaml\n# CloudFormation: MSK cluster with encryption in transit enforced\nResources:\n <example_resource_name>:\n Type: AWS::MSK::Cluster\n Properties:\n ClusterName: <example_resource_name>\n KafkaVersion: <VERSION>\n NumberOfBrokerNodes: 3\n BrokerNodeGroupInfo:\n ClientSubnets:\n - <example_resource_id>\n - <example_resource_id>\n InstanceType: kafka.m5.large\n EncryptionInfo:\n EncryptionInTransit:\n ClientBroker: TLS # Critical: forces client-to-broker TLS only\n InCluster: true # Critical: enables inter-broker encryption\n```",
|
|
26
|
+
"Other": "1. In the AWS Console, go to Amazon MSK > Clusters and select your cluster\n2. Click Edit (Security)\n3. Under Encryption in transit, set Client-broker to TLS only\n4. Save changes\n5. Verify Inter-broker (in-cluster) encryption is enabled; if it is disabled (immutable), create a new cluster with:\n - Encryption in transit: Client-broker = TLS only, Inter-broker encryption = Enabled\n - Migrate clients to the new cluster, then decommission the old one",
|
|
27
|
+
"Terraform": "```hcl\n# Terraform: MSK cluster with encryption in transit enforced\nresource \"aws_msk_cluster\" \"<example_resource_name>\" {\n cluster_name = \"<example_resource_name>\"\n kafka_version = \"<VERSION>\"\n number_of_broker_nodes = 3\n\n broker_node_group_info {\n instance_type = \"kafka.m5.large\"\n client_subnets = [\n \"subnet-<example_resource_id>\",\n \"subnet-<example_resource_id>\",\n ]\n }\n\n encryption_info {\n encryption_in_transit {\n client_broker = \"TLS\" # Critical: forces client-to-broker TLS only\n in_cluster = true # Critical: enables inter-broker encryption\n }\n }\n}\n```"
|
|
22
28
|
},
|
|
23
29
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
30
|
+
"Text": "Enforce end-to-end transport protection:\n- Require `client_broker=TLS` for all clients\n- Enable `in_cluster=true` for broker-to-broker links\n\nApply **defense in depth**: restrict network paths, prefer private connectivity, and use strong client authentication with **least privilege** authorization to limit blast radius.",
|
|
31
|
+
"Url": "https://hub.prowler.com/check/kafka_cluster_in_transit_encryption_enabled"
|
|
26
32
|
}
|
|
27
33
|
},
|
|
28
|
-
"Categories": [
|
|
34
|
+
"Categories": [
|
|
35
|
+
"encryption"
|
|
36
|
+
],
|
|
29
37
|
"DependsOn": [],
|
|
30
38
|
"RelatedTo": [],
|
|
31
39
|
"Notes": ""
|
prowler/providers/aws/services/kafka/kafka_cluster_is_public/kafka_cluster_is_public.metadata.json
CHANGED
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kafka_cluster_is_public",
|
|
4
|
-
"CheckTitle": "Kafka
|
|
5
|
-
"CheckType": [
|
|
4
|
+
"CheckTitle": "Kafka cluster is not publicly accessible",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices/Network Reachability",
|
|
7
|
+
"TTPs/Initial Access",
|
|
8
|
+
"Effects/Data Exposure"
|
|
9
|
+
],
|
|
6
10
|
"ServiceName": "kafka",
|
|
7
|
-
"SubServiceName": "
|
|
8
|
-
"ResourceIdTemplate": "
|
|
9
|
-
"Severity": "
|
|
11
|
+
"SubServiceName": "",
|
|
12
|
+
"ResourceIdTemplate": "",
|
|
13
|
+
"Severity": "critical",
|
|
10
14
|
"ResourceType": "AwsMskCluster",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "
|
|
13
|
-
"RelatedUrl": "
|
|
15
|
+
"Description": "**Amazon MSK clusters** with broker endpoints **exposed to the public Internet**.\n\nServerless clusters are private by default; provisioned clusters are evaluated for their `public access` configuration.",
|
|
16
|
+
"Risk": "Public brokers erode **CIA**:\n- **Confidentiality**: unauthorized consumers can read topics\n- **Integrity**: rogue producers inject or alter events\n- **Availability**: floods or scans strain brokers\n\nThis enables metadata enumeration, data exfiltration, stream poisoning, and costly egress.",
|
|
17
|
+
"RelatedUrl": "",
|
|
18
|
+
"AdditionalURLs": [
|
|
19
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/public-access.html",
|
|
20
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/MSK/public-access-msk-cluster.html",
|
|
21
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/client-access.html"
|
|
22
|
+
],
|
|
14
23
|
"Remediation": {
|
|
15
24
|
"Code": {
|
|
16
|
-
"CLI": "aws kafka update-connectivity --cluster-arn
|
|
17
|
-
"NativeIaC": "",
|
|
18
|
-
"Other": "
|
|
19
|
-
"Terraform": ""
|
|
25
|
+
"CLI": "aws kafka update-connectivity --cluster-arn <CLUSTER_ARN> --current-version <CURRENT_CLUSTER_VERSION> --connectivity-info '{\"PublicAccess\":{\"Type\":\"DISABLED\"}}'",
|
|
26
|
+
"NativeIaC": "```yaml\n# CloudFormation: ensure MSK cluster is not publicly accessible\nResources:\n <example_resource_name>:\n Type: AWS::MSK::Cluster\n Properties:\n ClusterName: <example_resource_name>\n KafkaVersion: \"2.8.1\"\n NumberOfBrokerNodes: 2\n BrokerNodeGroupInfo:\n ClientSubnets:\n - <example_subnet_id_1>\n - <example_subnet_id_2>\n InstanceType: kafka.t3.small\n ConnectivityInfo:\n PublicAccess:\n Type: DISABLED # Critical: disables public access to brokers\n```",
|
|
27
|
+
"Other": "1. Open the Amazon MSK console\n2. Select your cluster and go to the Properties tab\n3. In Network settings, click Edit public access\n4. Set Public access to Disabled (Off)\n5. Click Save changes",
|
|
28
|
+
"Terraform": "```hcl\n# Terraform: ensure MSK cluster is not publicly accessible\nresource \"aws_msk_cluster\" \"<example_resource_name>\" {\n cluster_name = \"<example_resource_name>\"\n kafka_version = \"2.8.1\"\n number_of_broker_nodes = 2\n\n broker_node_group_info {\n client_subnets = [\n \"<example_subnet_id_1>\",\n \"<example_subnet_id_2>\",\n ]\n instance_type = \"kafka.t3.small\"\n\n connectivity_info {\n public_access {\n type = \"DISABLED\" # Critical: disables public access to brokers\n }\n }\n }\n}\n```"
|
|
20
29
|
},
|
|
21
30
|
"Recommendation": {
|
|
22
|
-
"Text": "
|
|
23
|
-
"Url": "https://
|
|
31
|
+
"Text": "Keep brokers private within the VPC by disabling public access and limiting exposure to trusted networks.\n\nEnforce strong auth (SASL/IAM, SASL/SCRAM, or mTLS), require TLS, and apply Kafka ACLs. Provide access via VPN, bastion, or private networking (peering/Transit Gateway). Apply **least privilege** and monitor broker connections.",
|
|
32
|
+
"Url": "https://hub.prowler.com/check/kafka_cluster_is_public"
|
|
24
33
|
}
|
|
25
34
|
},
|
|
26
35
|
"Categories": [
|
|
@@ -1,29 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kafka_cluster_mutual_tls_authentication_enabled",
|
|
4
|
-
"CheckTitle": "
|
|
5
|
-
"CheckType": [
|
|
4
|
+
"CheckTitle": "Kafka cluster has TLS authentication enabled",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
|
|
8
|
+
"TTPs/Initial Access"
|
|
9
|
+
],
|
|
6
10
|
"ServiceName": "kafka",
|
|
7
|
-
"SubServiceName": "
|
|
8
|
-
"ResourceIdTemplate": "
|
|
9
|
-
"Severity": "
|
|
11
|
+
"SubServiceName": "",
|
|
12
|
+
"ResourceIdTemplate": "",
|
|
13
|
+
"Severity": "high",
|
|
10
14
|
"ResourceType": "AwsMskCluster",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "Without
|
|
13
|
-
"RelatedUrl": "
|
|
15
|
+
"Description": "Amazon MSK clusters enforce **client authentication** on client-to-broker connections. Serverless clusters use TLS-based authentication by default; provisioned clusters must have **mutual TLS (mTLS)** explicitly enabled.",
|
|
16
|
+
"Risk": "Without **mTLS**, adversaries can impersonate clients or intercept sessions, compromising **confidentiality** and **integrity**. Unauthorized producers/consumers can read or alter topics, poison data streams, and flood brokers, degrading **availability** and impacting downstream systems.",
|
|
17
|
+
"RelatedUrl": "",
|
|
18
|
+
"AdditionalURLs": [
|
|
19
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/MSK/enable-mutual-tls-authentication-for-kafka-clients.html",
|
|
20
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/msk-update-security.html",
|
|
21
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html"
|
|
22
|
+
],
|
|
14
23
|
"Remediation": {
|
|
15
24
|
"Code": {
|
|
16
|
-
"CLI": "",
|
|
17
|
-
"NativeIaC": "",
|
|
18
|
-
"Other": "
|
|
19
|
-
"Terraform": ""
|
|
25
|
+
"CLI": "aws kafka update-security --cluster-arn <CLUSTER_ARN> --current-version <CURRENT_VERSION> --client-authentication 'Tls={CertificateAuthorityArnList=[\"<ACM_PCA_ARN>\"]}' --encryption-info 'EncryptionInTransit={ClientBroker=TLS}'",
|
|
26
|
+
"NativeIaC": "```yaml\n# CloudFormation: Enable mTLS for an MSK cluster\nResources:\n <example_resource_name>:\n Type: AWS::MSK::Cluster\n Properties:\n ClusterName: <example_resource_name>\n KafkaVersion: <example_kafka_version>\n NumberOfBrokerNodes: 2\n BrokerNodeGroupInfo:\n InstanceType: kafka.m5.large\n ClientSubnets:\n - <subnet_id_1>\n - <subnet_id_2>\n ClientAuthentication:\n Tls:\n CertificateAuthorityArnList:\n - <acm_pca_arn> # CRITICAL: Enables mutual TLS using this Private CA\n EncryptionInfo:\n EncryptionInTransit:\n ClientBroker: TLS # CRITICAL: Required when enabling mTLS\n```",
|
|
27
|
+
"Other": "1. In the AWS Console, go to Amazon MSK > Clusters and select the provisioned cluster (state must be ACTIVE)\n2. Choose Actions > Update security (or Security > Edit)\n3. Under Client authentication, enable TLS and add your AWS Private CA ARN(s)\n4. Under Encryption in transit, set Client-broker to TLS\n5. Save/Update and wait for the update to complete",
|
|
28
|
+
"Terraform": "```hcl\n# Terraform: Enable mTLS for an MSK cluster\nresource \"aws_msk_cluster\" \"<example_resource_name>\" {\n cluster_name = \"<example_resource_name>\"\n kafka_version = \"<example_kafka_version>\"\n number_of_broker_nodes = 2\n\n broker_node_group_info {\n instance_type = \"kafka.m5.large\"\n client_subnets = [\"<subnet_id_1>\", \"<subnet_id_2>\"]\n }\n\n client_authentication {\n tls {\n certificate_authority_arns = [\"<acm_pca_arn>\"] # CRITICAL: Enables mutual TLS with this Private CA\n }\n }\n\n encryption_info {\n encryption_in_transit {\n client_broker = \"TLS\" # CRITICAL: Required when enabling mTLS\n }\n }\n}\n```"
|
|
20
29
|
},
|
|
21
30
|
"Recommendation": {
|
|
22
|
-
"Text": "
|
|
23
|
-
"Url": "https://
|
|
31
|
+
"Text": "Enable **mutual TLS** for client-broker traffic and disable `PLAINTEXT` listeners. Issue short-lived client certificates from a managed CA with rotation. Apply **least privilege** using Kafka ACLs, restrict network access to trusted sources, and monitor authentication events as part of **defense in depth**.",
|
|
32
|
+
"Url": "https://hub.prowler.com/check/kafka_cluster_mutual_tls_authentication_enabled"
|
|
24
33
|
}
|
|
25
34
|
},
|
|
26
|
-
"Categories": [
|
|
35
|
+
"Categories": [
|
|
36
|
+
"encryption"
|
|
37
|
+
],
|
|
27
38
|
"DependsOn": [],
|
|
28
39
|
"RelatedTo": [],
|
|
29
40
|
"Notes": ""
|
|
@@ -1,29 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kafka_cluster_unrestricted_access_disabled",
|
|
4
|
-
"CheckTitle": "
|
|
5
|
-
"CheckType": [
|
|
4
|
+
"CheckTitle": "Kafka cluster requires authentication",
|
|
5
|
+
"CheckType": [
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
|
|
8
|
+
"TTPs/Initial Access/Unauthorized Access",
|
|
9
|
+
"Effects/Data Exposure"
|
|
10
|
+
],
|
|
6
11
|
"ServiceName": "kafka",
|
|
7
|
-
"SubServiceName": "
|
|
8
|
-
"ResourceIdTemplate": "
|
|
9
|
-
"Severity": "
|
|
12
|
+
"SubServiceName": "",
|
|
13
|
+
"ResourceIdTemplate": "",
|
|
14
|
+
"Severity": "critical",
|
|
10
15
|
"ResourceType": "AwsMskCluster",
|
|
11
|
-
"Description": "
|
|
12
|
-
"Risk": "
|
|
13
|
-
"RelatedUrl": "
|
|
16
|
+
"Description": "Amazon MSK clusters are evaluated for **unauthenticated client access**. Serverless clusters inherently require authentication; provisioned clusters are checked for configurations that allow **unrestricted connections** rather than authenticated clients.",
|
|
17
|
+
"Risk": "Allowing **unauthenticated access** lets anyone connect and:\n- Read sensitive topics (confidentiality)\n- Publish or alter data (integrity)\n- Overload brokers and consumers (availability)\n\nThis enables message exfiltration, stream poisoning, and abuse of trusted data pipelines.",
|
|
18
|
+
"RelatedUrl": "",
|
|
19
|
+
"AdditionalURLs": [
|
|
20
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/msk-configure-security.html",
|
|
21
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/security.html",
|
|
22
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/MSK/unrestricted-access-to-brokers.html"
|
|
23
|
+
],
|
|
14
24
|
"Remediation": {
|
|
15
25
|
"Code": {
|
|
16
|
-
"CLI": "aws kafka update-security --
|
|
17
|
-
"NativeIaC": "",
|
|
18
|
-
"Other": "
|
|
19
|
-
"Terraform": ""
|
|
26
|
+
"CLI": "aws kafka update-security --cluster-arn <example_resource_arn> --current-version <example_current_version> --client-authentication 'Unauthenticated={Enabled=false}'",
|
|
27
|
+
"NativeIaC": "```yaml\n# CloudFormation: Disable unauthenticated client access for MSK\nResources:\n <example_resource_name>:\n Type: AWS::MSK::Cluster\n Properties:\n ClusterName: <example_resource_name>\n KafkaVersion: <example_kafka_version>\n NumberOfBrokerNodes: 2\n BrokerNodeGroupInfo:\n InstanceType: <example_instance_type>\n ClientSubnets:\n - <subnet_id_1>\n - <subnet_id_2>\n StorageInfo:\n EbsStorageInfo:\n VolumeSize: 1000\n ClientAuthentication:\n Unauthenticated:\n Enabled: false # CRITICAL: Disables unauthenticated client access\n```",
|
|
28
|
+
"Other": "1. Open the AWS Console and go to Amazon MSK\n2. Select your cluster and open the Security tab\n3. Click Edit under Client authentication\n4. Turn off/clear Unauthenticated access\n5. Save changes to apply the update",
|
|
29
|
+
"Terraform": "```hcl\n# Terraform: Disable unauthenticated client access for MSK\nresource \"aws_msk_cluster\" \"<example_resource_name>\" {\n cluster_name = \"<example_resource_name>\"\n kafka_version = \"<example_kafka_version>\"\n number_of_broker_nodes = 2\n\n broker_node_group_info {\n instance_type = \"<example_instance_type>\"\n client_subnets = [\"<subnet_id_1>\", \"<subnet_id_2>\"]\n ebs_volume_size = 1000\n }\n\n client_authentication {\n unauthenticated = false # CRITICAL: Disables unauthenticated client access\n }\n}\n```"
|
|
20
30
|
},
|
|
21
31
|
"Recommendation": {
|
|
22
|
-
"Text": "
|
|
23
|
-
"Url": "https://
|
|
32
|
+
"Text": "Disable **unauthenticated access** and require **strong client authentication** (mTLS or IAM/SASL).\n- Enforce **least privilege** with scoped ACLs\n- Restrict network paths via private connectivity and tight security groups\n- Encrypt in transit, monitor access, and rotate credentials regularly",
|
|
33
|
+
"Url": "https://hub.prowler.com/check/kafka_cluster_unrestricted_access_disabled"
|
|
24
34
|
}
|
|
25
35
|
},
|
|
26
|
-
"Categories": [
|
|
36
|
+
"Categories": [
|
|
37
|
+
"identity-access"
|
|
38
|
+
],
|
|
27
39
|
"DependsOn": [],
|
|
28
40
|
"RelatedTo": [],
|
|
29
41
|
"Notes": ""
|
|
@@ -1,31 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kafka_cluster_uses_latest_version",
|
|
4
|
-
"CheckTitle": "MSK cluster
|
|
4
|
+
"CheckTitle": "MSK cluster uses the latest Kafka version or is serverless with AWS-managed version",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"
|
|
6
|
+
"Software and Configuration Checks/Patch Management",
|
|
7
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
8
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices"
|
|
7
9
|
],
|
|
8
10
|
"ServiceName": "kafka",
|
|
9
|
-
"SubServiceName": "
|
|
10
|
-
"ResourceIdTemplate": "
|
|
11
|
+
"SubServiceName": "",
|
|
12
|
+
"ResourceIdTemplate": "",
|
|
11
13
|
"Severity": "medium",
|
|
12
14
|
"ResourceType": "AwsMskCluster",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
15
|
+
"Description": "**Amazon MSK clusters** are evaluated for use of the latest supported **Apache Kafka version**. Provisioned clusters are compared to the most recent release, while **serverless clusters** are treated as automatically managed for versioning.",
|
|
16
|
+
"Risk": "Outdated Kafka enables exploitation of known flaws and weak cryptography, risking data exposure or tampering (**confidentiality/integrity**). Missing fixes increase broker crashes and partition instability (**availability**). After end of support, silent auto-upgrades can trigger unexpected behavior and compatibility issues.",
|
|
17
|
+
"RelatedUrl": "",
|
|
18
|
+
"AdditionalURLs": [
|
|
19
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/version-support.html#version-upgrades",
|
|
20
|
+
"https://docs.aws.amazon.com/lightsail/latest/userguide/amazon-lightsail-databases.html",
|
|
21
|
+
"https://www.trendmicro.com/cloudoneconformity/knowledge-base/aws/MSK/enable-apache-kafka-latest-security-features.html"
|
|
22
|
+
],
|
|
16
23
|
"Remediation": {
|
|
17
24
|
"Code": {
|
|
18
|
-
"CLI": "aws kafka update-cluster-
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "
|
|
21
|
-
"Terraform": ""
|
|
25
|
+
"CLI": "aws kafka update-cluster-kafka-version --cluster-arn <example_resource_id> --current-version <current_version> --target-kafka-version <latest_version>",
|
|
26
|
+
"NativeIaC": "```yaml\n# CloudFormation: Upgrade MSK cluster to latest Kafka version\nResources:\n <example_resource_name>:\n Type: AWS::MSK::Cluster\n Properties:\n ClusterName: <example_resource_name>\n KafkaVersion: <latest_version> # CRITICAL: set to the latest Kafka version to pass the check\n NumberOfBrokerNodes: 2\n BrokerNodeGroupInfo:\n InstanceType: kafka.m5.large\n ClientSubnets:\n - <example_resource_id>\n - <example_resource_id>\n```",
|
|
27
|
+
"Other": "1. Open the AWS Management Console and go to Amazon MSK\n2. Select your cluster and choose Actions > Update cluster\n3. In Kafka version, select the latest available version\n4. Review and start the upgrade (Update/Start upgrade)\n5. Wait until the operation completes and the cluster status returns to Active",
|
|
28
|
+
"Terraform": "```hcl\n# Terraform: Upgrade MSK cluster to latest Kafka version\nresource \"aws_msk_cluster\" \"<example_resource_name>\" {\n cluster_name = \"<example_resource_name>\"\n kafka_version = \"<latest_version>\" # CRITICAL: set to the latest Kafka version to pass the check\n number_of_broker_nodes = 2\n\n broker_node_group_info {\n instance_type = \"kafka.m5.large\"\n client_subnets = [\"<example_resource_id>\", \"<example_resource_id>\"]\n\n storage_info {\n ebs_storage_info { volume_size = 1000 }\n }\n }\n}\n```"
|
|
22
29
|
},
|
|
23
30
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
31
|
+
"Text": "Adopt a controlled upgrade strategy:\n- Track MSK version support and upgrade before end of support\n- Test in staging and schedule maintenance windows\n- Use blue/green or rolling upgrades to reduce downtime\n- Validate client compatibility and security settings\n- Consider serverless MSK if automatic versioning fits your risk model",
|
|
32
|
+
"Url": "https://hub.prowler.com/check/kafka_cluster_uses_latest_version"
|
|
26
33
|
}
|
|
27
34
|
},
|
|
28
|
-
"Categories": [
|
|
35
|
+
"Categories": [
|
|
36
|
+
"vulnerabilities"
|
|
37
|
+
],
|
|
29
38
|
"DependsOn": [],
|
|
30
39
|
"RelatedTo": [],
|
|
31
40
|
"Notes": ""
|
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kafka_connector_in_transit_encryption_enabled",
|
|
4
|
-
"CheckTitle": "MSK Connect
|
|
4
|
+
"CheckTitle": "MSK Connect connector has encryption in transit enabled",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"Software and Configuration Checks/AWS Security Best Practices"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices"
|
|
7
8
|
],
|
|
8
9
|
"ServiceName": "kafka",
|
|
9
10
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
11
|
-
"Severity": "
|
|
11
|
+
"ResourceIdTemplate": "",
|
|
12
|
+
"Severity": "high",
|
|
12
13
|
"ResourceType": "Other",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
14
|
+
"Description": "**MSK Connect connectors** are evaluated for **in-transit encryption** using `TLS` on client connections to Kafka brokers and connected systems.",
|
|
15
|
+
"Risk": "Without **TLS**, data streams can be **intercepted** or **modified** in transit. Attackers on the path can perform **man-in-the-middle**, replay, or message **tampering**, exposing records and secrets. This degrades **confidentiality** and **integrity** and can enable unauthorized access to downstream systems.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect.html",
|
|
19
|
+
"https://docs.aws.amazon.com/msk/latest/developerguide/mkc-create-connector-intro.html"
|
|
20
|
+
],
|
|
16
21
|
"Remediation": {
|
|
17
22
|
"Code": {
|
|
18
|
-
"CLI": "
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "
|
|
21
|
-
"Terraform": ""
|
|
23
|
+
"CLI": "",
|
|
24
|
+
"NativeIaC": "```yaml\n# CloudFormation: MSK Connect connector with in-transit encryption enabled\nResources:\n <example_resource_name>:\n Type: AWS::KafkaConnect::Connector\n Properties:\n ConnectorName: <example_resource_name>\n KafkaCluster:\n ApacheKafkaCluster:\n BootstrapServers: <BOOTSTRAP_SERVERS>\n Vpc:\n SecurityGroups: [<example_resource_id>]\n Subnets: [<example_resource_id>]\n KafkaClusterClientAuthentication:\n AuthenticationType: NONE\n KafkaClusterEncryptionInTransit:\n EncryptionType: TLS # Critical: enables TLS encryption in transit\n KafkaConnectVersion: <KAFKA_CONNECT_VERSION>\n Plugins:\n - CustomPlugin:\n CustomPluginArn: <example_resource_id>\n Revision: 1\n Capacity:\n ProvisionedCapacity:\n McuCount: 1\n WorkerCount: 1\n ServiceExecutionRoleArn: <example_resource_id>\n ConnectorConfiguration:\n connector.class: <CONNECTOR_CLASS>\n tasks.max: \"1\"\n```",
|
|
25
|
+
"Other": "1. In the AWS console, go to Amazon MSK > MSK Connect > Connectors\n2. Select the non-TLS connector and choose Delete (encryption setting can't be changed)\n3. Choose Create connector and select your custom plugin and cluster\n4. In the Security section, set Encryption in transit to TLS (required)\n5. Complete other required fields and Create the connector",
|
|
26
|
+
"Terraform": "```hcl\n# Terraform: MSK Connect connector with in-transit encryption enabled\nresource \"aws_mskconnect_connector\" \"<example_resource_name>\" {\n name = \"<example_resource_name>\"\n kafkaconnect_version = \"<KAFKA_CONNECT_VERSION>\"\n\n kafka_cluster {\n apache_kafka_cluster {\n bootstrap_servers = \"<BOOTSTRAP_SERVERS>\"\n vpc {\n security_groups = [\"<example_resource_id>\"]\n subnets = [\"<example_resource_id>\"]\n }\n }\n }\n\n kafka_cluster_client_authentication {\n authentication_type = \"NONE\"\n }\n\n kafka_cluster_encryption_in_transit {\n encryption_type = \"TLS\" # Critical: enables TLS encryption in transit\n }\n\n capacity {\n provisioned_capacity {\n mcu_count = 1\n worker_count = 1\n }\n }\n\n service_execution_role_arn = \"<example_resource_id>\"\n\n connector_configuration = {\n \"connector.class\" = \"<CONNECTOR_CLASS>\"\n \"tasks.max\" = \"1\"\n }\n\n plugin {\n custom_plugin {\n arn = \"<example_resource_id>\"\n revision = 1\n }\n }\n}\n```"
|
|
22
27
|
},
|
|
23
28
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
29
|
+
"Text": "Require **TLS** for all connector communications and disallow plaintext. Prefer private connectivity, validate certificates, and use modern cipher suites. Pair with **mutual authentication** and **least privilege** roles for defense-in-depth. Regularly review connector configs to avoid non-TLS endpoints.",
|
|
30
|
+
"Url": "https://hub.prowler.com/check/kafka_connector_in_transit_encryption_enabled"
|
|
26
31
|
}
|
|
27
32
|
},
|
|
28
33
|
"Categories": [
|
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kms_cmk_are_used",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "KMS customer managed key is enabled or scheduled for deletion",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices"
|
|
7
8
|
],
|
|
8
9
|
"ServiceName": "kms",
|
|
9
10
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
11
|
-
"Severity": "
|
|
11
|
+
"ResourceIdTemplate": "",
|
|
12
|
+
"Severity": "low",
|
|
12
13
|
"ResourceType": "AwsKmsKey",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
14
|
+
"Description": "**Customer-managed KMS keys** are assessed by key state. Keys in `Enabled` are considered in use. Keys not `Enabled` and not `PendingDeletion` are identified as unused, while those in `PendingDeletion` are recognized as scheduled for removal.",
|
|
15
|
+
"Risk": "Keeping **unused CMKs** increases **attack surface** and **cost**.\n\nIf such keys are re-enabled or misconfigured, they can grant unintended decryption, impacting **confidentiality**. Deleting a key mistakenly thought unused can cause **irrecoverable data loss**, harming **availability**.",
|
|
15
16
|
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys-determining-usage.html"
|
|
19
|
+
],
|
|
16
20
|
"Remediation": {
|
|
17
21
|
"Code": {
|
|
18
|
-
"CLI": "aws kms
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "",
|
|
21
|
-
"Terraform": ""
|
|
22
|
+
"CLI": "aws kms enable-key --key-id <key_id>",
|
|
23
|
+
"NativeIaC": "```yaml\n# CloudFormation: ensure the KMS CMK is enabled\nResources:\n <example_resource_name>:\n Type: AWS::KMS::Key\n Properties:\n Enabled: true # Critical: enables the key so its state is \"Enabled\" (PASS)\n KeyPolicy:\n Version: '2012-10-17'\n Statement:\n - Sid: Enable IAM User Permissions\n Effect: Allow\n Principal:\n AWS: !Sub arn:aws:iam::${AWS::AccountId}:root\n Action: 'kms:*'\n Resource: '*'\n```",
|
|
24
|
+
"Other": "1. Sign in to the AWS Console and open Key Management Service (KMS)\n2. Go to Customer managed keys and select the affected key\n3. Choose Key actions > Enable\n4. Confirm to enable the key",
|
|
25
|
+
"Terraform": "```hcl\n# Terraform: ensure the KMS CMK is enabled\nresource \"aws_kms_key\" \"<example_resource_name>\" {\n is_enabled = true # Critical: sets key state to Enabled (PASS)\n}\n```"
|
|
22
26
|
},
|
|
23
27
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
28
|
+
"Text": "Adopt a **key lifecycle**: confirm actual usage with logs, owners, and tags; keep keys `Enabled` only when required; otherwise **schedule deletion** with a waiting period.\n\nEnforce **least privilege** to enable/disable or delete keys, require approvals, and monitor KMS activity with **separation of duties**.",
|
|
29
|
+
"Url": "https://hub.prowler.com/check/kms_cmk_are_used"
|
|
26
30
|
}
|
|
27
31
|
},
|
|
28
32
|
"Categories": [
|
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kms_cmk_not_deleted_unintentionally",
|
|
4
|
-
"CheckTitle": "AWS KMS
|
|
4
|
+
"CheckTitle": "AWS KMS customer managed key is not scheduled for deletion",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
|
|
8
|
+
"Effects/Data Destruction"
|
|
7
9
|
],
|
|
8
10
|
"ServiceName": "kms",
|
|
9
11
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
12
|
+
"ResourceIdTemplate": "",
|
|
11
13
|
"Severity": "critical",
|
|
12
14
|
"ResourceType": "AwsKmsKey",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
15
|
+
"Description": "**Customer-managed KMS keys** are evaluated for the `PendingDeletion` state, indicating a scheduled deletion during the mandatory waiting period.",
|
|
16
|
+
"Risk": "A key scheduled for deletion can lead to **permanent loss of decryption capability**, degrading **availability** and **integrity** of data and workloads. Accidental or malicious scheduling enables **cryptographic erasure**, causing outages, failed restores, and broken integrations during and after the wait window.",
|
|
17
|
+
"RelatedUrl": "",
|
|
18
|
+
"AdditionalURLs": [
|
|
19
|
+
"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys-scheduling-key-deletion.html",
|
|
20
|
+
"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys-scheduling-key-deletion.html#deleting-keys-scheduling-key-deletion-console"
|
|
21
|
+
],
|
|
16
22
|
"Remediation": {
|
|
17
23
|
"Code": {
|
|
18
|
-
"CLI": "aws kms cancel-key-deletion --key-id <
|
|
24
|
+
"CLI": "aws kms cancel-key-deletion --key-id <KEY_ID>",
|
|
19
25
|
"NativeIaC": "",
|
|
20
|
-
"Other": "
|
|
26
|
+
"Other": "1. Sign in to the AWS Management Console and open AWS KMS\n2. Go to Customer managed keys and select the key with status \"Pending deletion\"\n3. Click Key actions > Cancel key deletion\n4. Confirm to cancel; the key status will change from Pending deletion",
|
|
21
27
|
"Terraform": ""
|
|
22
28
|
},
|
|
23
29
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
30
|
+
"Text": "Prevent unintended deletion:\n- Enforce **least privilege** and **separation of duties** for key admins\n- Require change approvals and alerts on deletion events\n- Prefer **disabling** unused keys over deleting\n- Set sufficient waiting periods and review keys in `PendingDeletion` to verify authorization",
|
|
31
|
+
"Url": "https://hub.prowler.com/check/kms_cmk_not_deleted_unintentionally"
|
|
26
32
|
}
|
|
27
33
|
},
|
|
28
34
|
"Categories": [
|
prowler/providers/aws/services/kms/kms_cmk_not_multi_region/kms_cmk_not_multi_region.metadata.json
CHANGED
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kms_cmk_not_multi_region",
|
|
4
|
-
"CheckTitle": "AWS KMS customer managed
|
|
4
|
+
"CheckTitle": "AWS KMS customer managed key is single-Region",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices"
|
|
7
8
|
],
|
|
8
9
|
"ServiceName": "kms",
|
|
9
10
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
11
|
-
"Severity": "
|
|
11
|
+
"ResourceIdTemplate": "",
|
|
12
|
+
"Severity": "medium",
|
|
12
13
|
"ResourceType": "AwsKmsKey",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
14
|
+
"Description": "**AWS KMS customer-managed keys** in an `Enabled` state are assessed for the `multi-Region` setting. The finding highlights keys with the `multi-Region` property enabled.",
|
|
15
|
+
"Risk": "Shared key material across Regions lets access in one Region decrypt data from another, eroding **confidentiality** and **data residency**. A misconfigured policy or weaker controls in a replica expand the blast radius. For signing/HMAC keys, compromise enables cross-Region signature forgery, impacting **integrity** and **auditability**.",
|
|
16
|
+
"RelatedUrl": "",
|
|
17
|
+
"AdditionalURLs": [
|
|
18
|
+
"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html#multi-region-concepts",
|
|
19
|
+
"https://docs.aws.amazon.com/kms/latest/developerguide/mrk-when-to-use.html"
|
|
20
|
+
],
|
|
16
21
|
"Remediation": {
|
|
17
22
|
"Code": {
|
|
18
|
-
"CLI": "
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "",
|
|
21
|
-
"Terraform": "
|
|
23
|
+
"CLI": "",
|
|
24
|
+
"NativeIaC": "```yaml\n# CloudFormation: create a single-Region KMS key\nResources:\n ExampleKmsKey:\n Type: AWS::KMS::Key\n Properties:\n MultiRegion: false # Critical: ensures the key is single-Region to pass the check\n KeyPolicy: # Minimal policy required for key creation\n Version: '2012-10-17'\n Statement:\n - Effect: Allow\n Principal:\n AWS: !Sub arn:aws:iam::${AWS::AccountId}:root\n Action: 'kms:*'\n Resource: '*'\n```",
|
|
25
|
+
"Other": "1. In the AWS Console, go to Key Management Service (KMS) > Customer managed keys\n2. Identify keys showing Multi-Region: Yes (these FAIL the check)\n3. Click Create key and ensure Multi-Region is not selected (single-Region)\n4. Update your services/aliases to use the new single-Region key\n5. Re-encrypt or rotate data to the new key where required\n6. After migration, disable the old multi-Region key and schedule its deletion",
|
|
26
|
+
"Terraform": "```hcl\n# Terraform: create a single-Region KMS key\nresource \"aws_kms_key\" \"example\" {\n multi_region = false # Critical: creates a single-Region key to pass the check\n}\n```"
|
|
22
27
|
},
|
|
23
28
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
29
|
+
"Text": "Prefer **single-Region keys** by default; use **multi-Region** only with a documented need. Apply **least privilege** and **separation of duties**; limit who can create or replicate such keys. Isolate per Region/tenant/workload, standardize policy and logging across Regions, and retire multi-Region keys where unnecessary.",
|
|
30
|
+
"Url": "https://hub.prowler.com/check/kms_cmk_not_multi_region"
|
|
26
31
|
}
|
|
27
32
|
},
|
|
28
|
-
"Categories": [
|
|
33
|
+
"Categories": [
|
|
34
|
+
"encryption"
|
|
35
|
+
],
|
|
29
36
|
"DependsOn": [],
|
|
30
37
|
"RelatedTo": [],
|
|
31
38
|
"Notes": "Multi-region keys should be used only when absolutely necessary, such as for cross-region disaster recovery, and should be carefully managed with strict access controls."
|
prowler/providers/aws/services/kms/kms_cmk_rotation_enabled/kms_cmk_rotation_enabled.metadata.json
CHANGED
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"Provider": "aws",
|
|
3
3
|
"CheckID": "kms_cmk_rotation_enabled",
|
|
4
|
-
"CheckTitle": "
|
|
4
|
+
"CheckTitle": "KMS customer-managed symmetric CMK has automatic rotation enabled",
|
|
5
5
|
"CheckType": [
|
|
6
|
-
"
|
|
6
|
+
"Software and Configuration Checks/AWS Security Best Practices",
|
|
7
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/AWS Foundational Security Best Practices",
|
|
8
|
+
"Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark"
|
|
7
9
|
],
|
|
8
10
|
"ServiceName": "kms",
|
|
9
11
|
"SubServiceName": "",
|
|
10
|
-
"ResourceIdTemplate": "
|
|
11
|
-
"Severity": "
|
|
12
|
+
"ResourceIdTemplate": "",
|
|
13
|
+
"Severity": "high",
|
|
12
14
|
"ResourceType": "AwsKmsKey",
|
|
13
|
-
"Description": "
|
|
14
|
-
"Risk": "
|
|
15
|
-
"RelatedUrl": "
|
|
15
|
+
"Description": "**Customer-managed KMS symmetric keys** in the `Enabled` state are evaluated to confirm `automatic rotation` of key material is configured",
|
|
16
|
+
"Risk": "Without **automatic rotation**, long-lived key material increases confidentiality and integrity risk. If a KMS key is exposed, attackers can unwrap data keys and decrypt stored data until the key changes. It also reduces crypto agility and may conflict with mandated rotation policies.",
|
|
17
|
+
"RelatedUrl": "",
|
|
18
|
+
"AdditionalURLs": [
|
|
19
|
+
"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html",
|
|
20
|
+
"https://aws.amazon.com/blogs/security/how-to-get-ready-for-certificate-transparency/"
|
|
21
|
+
],
|
|
16
22
|
"Remediation": {
|
|
17
23
|
"Code": {
|
|
18
|
-
"CLI": "aws kms enable-key-rotation --key-id <
|
|
19
|
-
"NativeIaC": "",
|
|
20
|
-
"Other": "",
|
|
21
|
-
"Terraform": "
|
|
24
|
+
"CLI": "aws kms enable-key-rotation --key-id <KEY_ID>",
|
|
25
|
+
"NativeIaC": "```yaml\n# CloudFormation: KMS key with automatic rotation enabled\nResources:\n <example_resource_name>:\n Type: AWS::KMS::Key\n Properties:\n EnableKeyRotation: true # Critical: enables automatic rotation so the key passes the check\n KeyPolicy:\n Version: \"2012-10-17\"\n Statement:\n - Effect: Allow\n Principal:\n AWS: !Sub arn:aws:iam::${AWS::AccountId}:root\n Action: \"kms:*\"\n Resource: \"*\"\n```",
|
|
26
|
+
"Other": "1. In the AWS Console, go to Key Management Service (KMS)\n2. Open Customer managed keys and select the enabled symmetric key\n3. Go to the Key rotation section\n4. Check Enable automatic key rotation\n5. Save changes",
|
|
27
|
+
"Terraform": "```hcl\n# KMS key with automatic rotation enabled\nresource \"aws_kms_key\" \"<example_resource_name>\" {\n enable_key_rotation = true # Critical: enables automatic rotation so the key passes the check\n}\n```"
|
|
22
28
|
},
|
|
23
29
|
"Recommendation": {
|
|
24
|
-
"Text": "
|
|
25
|
-
"Url": "https://
|
|
30
|
+
"Text": "Enable **automatic rotation** on customer-managed symmetric KMS keys and choose a rotation period that meets policy. Enforce **least privilege** and **separation of duties** for key administration versus usage. Monitor key lifecycle events and use on-demand rotation when compromise is suspected.",
|
|
31
|
+
"Url": "https://hub.prowler.com/check/kms_cmk_rotation_enabled"
|
|
26
32
|
}
|
|
27
33
|
},
|
|
28
34
|
"Categories": [
|