For AI agents: A markdown version of this page is available at https://docs.datadoghq.com/security/code_security/iac_security/iac_rules/terraform-aws-security-groups-not-used.md.
A documentation index is available at /llms.txt.
This check ensures that AWS load balancers are associated with appropriate security groups, which control network traffic to and from the resource. When the security_groups attribute is omitted from an aws_lb resource, as shown below, the load balancer may become exposed to unrestricted network access, increasing the risk of unauthorized access or attacks:
resource"aws_security_group""allow_tls"{name="allow_tls"description="Allow TLS inbound traffic"vpc_id=aws_vpc.main.idingress{description="TLS from VPC"from_port=443to_port=443protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}tags={Name="allow_tls"}}resource"aws_lb""test"{name="test"load_balancer_type="application"subnets=[aws_subnet.subnet1.id,aws_subnet.subnet2.id]internal=truesecurity_groups=[aws_security_group.allow_tls.id]}
resource"aws_security_group""allow_tls"{name="allow_tls"description="Allow TLS inbound traffic"vpc_id=aws_vpc.main.idingress{description="TLS from VPC"from_port=443to_port=443protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}tags={Name="allow_tls"}}module"security_groups_test"{source="terraform-aws-modules/security-group/aws//modules/http-80"version="4.3.0"name="web-server"security_group_id=aws_security_group.allow_tls.id}
# given:
# - used security group
# - aws_instance
# when:
# - used security group attached to aws_instance
# then:
# - do not detect any unused security group
resource"aws_security_group""used_sg"{name="used-sg"description="Used security group"vpc_id=aws_vpc.main.idingress{description="Some port"from_port=43to_port=43protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}}resource"aws_instance""negative3"{ami="ami-003634241a8fcdec0"instance_type="t2.micro"vpc_security_group_ids=["aws_security_group.used_sg.id"]}
Non-Compliant Code Examples
resource"aws_lb""test"{name="test"load_balancer_type="application"subnets=[aws_subnet.subnet1.id,aws_subnet.subnet2.id]internal=true}resource"aws_security_group""allow_tls"{name="allow_tls"description="Allow TLS inbound traffic"vpc_id=aws_vpc.main.idingress{description="TLS from VPC"from_port=443to_port=443protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}tags={Name="allow_tls"}}
# given:
# - unused security group
# - aws_instance
# when:
# - no security group attached to aws_instance
# then:
# - detect unused security group as unused
resource"aws_instance""positive1"{ami="ami-003634241a8fcdec0"instance_type="t2.micro"}resource"aws_security_group""unused-sg"{name="unused-sg"description="Unused security group"vpc_id=aws_vpc.main.idingress{description="Some port"from_port=42to_port=42protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}}
# given:
# - unused security group
# - used security group
# - aws_instance
# when:
# - used security group attached to aws_instance
# - unused security group not attached to aws_instance
# then:
# - detect only unused security group as unused
resource"aws_instance""positive1"{ami="ami-003634241a8fcdec0"instance_type="t2.micro"vpc_security_group_ids=[aws_security_group.used_sg.id]}resource"aws_security_group""unused_sg"{name="unused-sg"description="Unused security group"vpc_id=aws_vpc.main.idingress{description="Some port"from_port=42to_port=42protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}}resource"aws_security_group""used_sg"{name="used-sg"description="Used security group"vpc_id=aws_vpc.main.idingress{description="Some port"from_port=43to_port=43protocol="tcp"cidr_blocks=[aws_vpc.main.cidr_block]ipv6_cidr_blocks=[aws_vpc.main.ipv6_cidr_block]}egress{from_port=0to_port=0protocol="-1"cidr_blocks=["0.0.0.0/0"]ipv6_cidr_blocks=["::/0"]}}
1
2
rulesets:- Terraform / AWS # Rules to enforce / AWS.
Request a personalized demo
Get Started with Datadog
Ask AI
AI-generated responses may be inaccurate. Verify important info.