Skip to main content
emnode
Compliance Medium severity

AWS Security Hub · MSK

MSK.1: MSK should encrypt in transit among broker nodes

Written and reviewed by Emnode · Last reviewed

What does AWS Security Hub MSK.1 check?

MSK.1 fails when a cluster's EncryptionInTransit configuration does not encrypt broker-to-broker traffic: the InCluster flag is false. This is distinct from the ClientBroker setting that most people think of as 'MSK encryption'.

Why does MSK.1 matter?

The in-cluster setting protects the traffic brokers exchange among themselves as they replicate partitions. With it off, that internal replication crosses the network in plaintext, observable to anyone with a foothold on the VPC network. MSK encrypts this by default, so a disabled in-cluster setting almost always means an IaC override turned it off explicitly.

How do I fix MSK.1?

  1. Read the cluster's EncryptionInTransit to check the InCluster flag.
  2. Because the setting is fixed at creation and cannot be toggled on a running cluster, plan a migration to a new cluster with in-cluster encryption on.
  3. Mirror topics and consumer offsets to the new cluster and cut producers and consumers over.
  4. Audit IaC for any encryption_in_transit block that disables in-cluster encryption.

Remediation script · bash

# Find the highest-impact plaintext-permitting stores across engines.
aws rds describe-db-instances \
  --query 'DBInstances[].DBInstanceIdentifier' --output text
aws elasticache describe-replication-groups \
  --query 'ReplicationGroups[?TransitEncryptionEnabled==`false`].ReplicationGroupId' \
  --output text

# RDS for PostgreSQL: require TLS via rds.force_ssl (static -> needs a reboot).
PG=$(aws rds describe-db-instances --db-instance-identifier prod-orders-pg \
  --query 'DBInstances[].DBParameterGroups[].DBParameterGroupName' --output text)
aws rds modify-db-parameter-group --db-parameter-group-name "$PG" \
  --parameters 'ParameterName=rds.force_ssl,ParameterValue=1,ApplyMethod=pending-reboot'
aws rds reboot-db-instance --db-instance-identifier prod-orders-pg

# Redshift: require_ssl on a custom cluster parameter group, then reboot.
aws redshift modify-cluster-parameter-group --parameter-group-name analytics-tls \
  --parameters ParameterName=require_ssl,ParameterValue=true
aws redshift reboot-cluster --cluster-identifier analytics-prod

Full walkthrough (console steps, edge cases and verification) in the lesson Enforce TLS on database and cache connections.

Is MSK.1 a false positive?

Teams assume MSK's default-on encryption covers this, but a Terraform block setting client_broker to TLS_PLAINTEXT for a migration can silently leave in_cluster off, and unlike ClientBroker, it cannot be fixed in place.

Part of the learning path Encrypt everything
  • MSK.3 MSK Connect connectors encrypted in transit
  • MSK.4 An MSK cluster allows public access
  • MSK.5 MSK connectors should have logging
  • MSK.6 MSK clusters should disable unauthenticated access