turbot/steampipe-mod-aws-compliance

Control: 21 Network ACLs should not allow ingress from 0.0.0.0/0 to port 22 or port 3389

Description

This control checks if default ports for SSH/RDP ingress traffic for network access control lists (NACLs) is unrestricted. The rule fails if a NACL inbound entry allows a source CIDR block of '0.0.0.0/0' or '::/0' for ports 22 or 3389

Access to remote server administration ports, such as port 22 (SSH) and port 3389 (RDP), should not be publicly accessible, as this may allow unintended access to resources within your VPC.

Remediation

For more information about NACLs, see Network ACLs in the VPC User Guide.

Usage

Run the control in your terminal:

powerpipe control run aws_compliance.control.foundational_security_ec2_21

Snapshot and share results via Turbot Pipes:

powerpipe login
powerpipe control run aws_compliance.control.foundational_security_ec2_21 --share

SQL

This control uses a named query:

with bad_rules as (
select
network_acl_id,
count(*) as num_bad_rules,
tags,
region,
account_id
from
aws_vpc_network_acl,
jsonb_array_elements(entries) as att
where
att ->> 'Egress' = 'false' -- as per aws egress = false indicates the ingress
and (
att ->> 'CidrBlock' = '0.0.0.0/0'
or att ->> 'Ipv6CidrBlock' = '::/0'
)
and att ->> 'RuleAction' = 'allow'
and (
(
att ->> 'Protocol' = '-1' -- all traffic
and att ->> 'PortRange' is null
)
or (
(att -> 'PortRange' ->> 'From') :: int <= 22
and (att -> 'PortRange' ->> 'To') :: int >= 22
and att ->> 'Protocol' in('6', '17') -- TCP or UDP
)
or (
(att -> 'PortRange' ->> 'From') :: int <= 3389
and (att -> 'PortRange' ->> 'To') :: int >= 3389
and att ->> 'Protocol' in('6', '17') -- TCP or UDP
)
)
group by
network_acl_id,
region,
account_id,
tags
order by
network_acl_id,
region,
account_id,
tags
),
aws_vpc_network_acls as (
select
network_acl_id,
tags,
partition,
region,
account_id
from
aws_vpc_network_acl
order by
network_acl_id,
region,
account_id
)
select
'arn:' || acl.partition || ':ec2:' || acl.region || ':' || acl.account_id || ':network-acl/' || acl.network_acl_id as resource,
case
when bad_rules.network_acl_id is null then 'ok'
else 'alarm'
end as status,
case
when bad_rules.network_acl_id is null then acl.network_acl_id || ' does not allow ingress to port 22 or 3389 from 0.0.0.0/0 or ::/0.'
else acl.network_acl_id || ' contains ' || bad_rules.num_bad_rules || ' rule(s) allowing ingress to port 22 or 3389 from 0.0.0.0/0 or ::/0.'
end as reason
, acl.region, acl.account_id
from
aws_vpc_network_acls as acl
left join bad_rules on bad_rules.network_acl_id = acl.network_acl_id;

Tags