Description
Ensure that no Amazon EC2 security group allows inbound TCP traffic from the Internet (0.0.0.0/0 or ::/0) to the PostgreSQL port 5432. Security groups with all ports open to the Internet are reported by the separate all-ports check instead. Only security groups attached to at least one network interface in a VPC that is in use are evaluated; unattached security groups and security groups in unused VPCs are not reported.
Rationale
If the PostgreSQL port is open to the Internet, anyone can reach the database and attempt credential stuffing, brute-force logins or exploits against PostgreSQL. A successful attack can lead to data disclosure, unauthorized changes and service disruption. Publicly exposed database ports are also continuously scanned. Restricting ingress to trusted sources or peer security groups, and keeping databases in private subnets, applies least privilege at the network layer and reduces the attack surface of the database tier.
Impact
Prevents direct Internet access to PostgreSQL
Reduces the risk of data exposure, unauthorized changes and service outages
Clients or administrators currently connecting over the Internet will lose access until their source addresses are added as trusted CIDRs, or they connect through a VPN or bastion host
Default Value
A newly created security group has no inbound rules, so all inbound traffic is denied by default. Unrestricted access to port 5432 exists only if a rule was explicitly added.
Pre-Requisites
IAM permissions: ec2:DescribeSecurityGroups, ec2:DescribeSecurityGroupRules, ec2:RevokeSecurityGroupIngress and ec2:AuthorizeSecurityGroupIngress
A list of the trusted CIDR ranges or security groups that legitimately need access to PostgreSQL
Confirmation from the application owner that no required client depends on Internet access to this port
Remediation
Test Plan
Console:
Sign in to the AWS Management Console at https://console.aws.amazon.com.
Open the Amazon EC2 console and select Security Groups under Network & Security.
Select a security group and open the Inbound rules tab.
Check for any rule whose source is 0.0.0.0/0 or ::/0 and that either:
has type All traffic, or
uses protocol TCP with a port or port range that includes 5432.
Repeat for each security group in each region in use.
If such a rule exists, follow the implementation steps.
CLI:
List the security groups that have any rule open to the Internet:
aws
ec2 describe-security-groups --region <REGION> --filters
Name=ip-permission.cidr,Values=0.0.0.0/0 --query
"SecurityGroups[].GroupId"
aws ec2
describe-security-groups --region <REGION> --filters
Name=ip-permission.ipv6-cidr,Values=::/0 --query
"SecurityGroups[].GroupId"
For each group returned, list its public inbound rules:
aws ec2 describe-security-group-rules --region <REGION> --filters Name=group-id,Values=<SECURITY_GROUP_ID> --query "SecurityGroupRules[?IsEgress==\`false\` && (CidrIpv4=='0.0.0.0/0' || CidrIpv6=='::/0')].[SecurityGroupRuleId,IpProtocol,FromPort,ToPort,CidrIpv4,CidrIpv6]" --output table
The group fails if any row has protocol tcp with a FromPort–ToPort range that includes 5432 but is narrower than 0-65535. Rows with protocol -1 (all traffic) or the full range 0-65535 mean all ports are open; such groups are reported by the separate check for all ports and pass this check. A security group that has all ports open to the Internet passes this check, because it is reported by the separate check for all ports. Only security groups that are attached to at least one network interface in a VPC that is in use are evaluated; unattached security groups and security groups in unused VPCs are not reported.
Implementation Steps
Console:
Sign in to the AWS Management Console at https://console.aws.amazon.com.
Open the Amazon EC2 console and select Security Groups under Network & Security.
Select the security group found in the Test Plan and open the Inbound rules tab.
Choose Edit inbound rules and delete any rule whose source is 0.0.0.0/0 or ::/0 and that either:
has type All traffic, or
uses protocol TCP with a port or port range that includes 5432.
If access to PostgreSQL is still needed, choose Add rule, select type Custom TCP, enter the required port and set the source to a trusted IP range or security group.
Choose Save rules.
Repeat for each affected security group in each region in use.
CLI:
Remove the public rule for the PostgreSQL port. The provided command removes only the IPv4 rule; this version removes both the IPv4 and IPv6 rules:
aws ec2 revoke-security-group-ingress --group-id <SECURITY_GROUP_ID> --ip-permissions IpProtocol=tcp,FromPort=5432,ToPort=5432,IpRanges='[{CidrIp=0.0.0.0/0}]',Ipv6Ranges='[{CidrIpv6=::/0}]'
If the rule is a port range or All traffic, remove it using the rule ID from the Test Plan output:
aws ec2 revoke-security-group-ingress --group-id <SECURITY_GROUP_ID> --security-group-rule-ids <SECURITY_GROUP_RULE_ID>
If access is still needed, allow the port from a trusted IP range only:
aws ec2 authorize-security-group-ingress --group-id <SECURITY_GROUP_ID> --ip-permissions IpProtocol=tcp,FromPort=5432,ToPort=5432,IpRanges='[{CidrIp=<TRUSTED_CIDR>,Description="PostgreSQL access from trusted network"}]'
Backout Plan
Before making changes, save the current inbound rules:
aws ec2 describe-security-group-rules --filters Name=group-id,Values=<SECURITY_GROUP_ID> > <SECURITY_GROUP_ID>-rules-backup.json
To roll back:
Sign in to the AWS Management Console at https://console.aws.amazon.com.
Go to EC2 > Security Groups and select the security group.
In Inbound rules, choose Edit inbound rules.
Re-add the removed rules using the saved backup (protocol, port range and source).
Choose Save rules.
Note: rolling back re-exposes the PostgreSQL port to the Internet. Use it only as a temporary measure while access through trusted sources is arranged.
Reference
https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html
https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html
https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html
https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-group-rules.html