turbot/steampipe-mod-azure-compliance

Control: 6.4 Ensure that HTTP(S) access from the Internet is evaluated and restricted

Description

Network security groups should be periodically evaluated for port misconfigurations. Where certain ports and protocols may be exposed to the Internet, they should be evaluated for necessity and restricted wherever they are not explicitly required and narrowly configured.

The potential security problem with using HTTP(S) over the Internet is that attackers can use various brute force techniques to gain access to Azure resources. Once the attackers gain access, they can use the resource as a launch point for compromising other resources within the Azure tenant.

Remediation

Where HTTP(S) is not explicitly required and narrowly configured for resources attached to the Network Security Group, Internet-level access to your Azure resources should be restricted or eliminated.

For internal access to relevant resources, configure an encrypted network tunnel such as:

  1. ExpressRoute
  2. Site-to-site VPN
  3. Point-to-site VPN

Usage

Run the control in your terminal:

powerpipe control run azure_compliance.control.cis_v200_6_4

Snapshot and share results via Turbot Pipes:

powerpipe login
powerpipe control run azure_compliance.control.cis_v200_6_4 --share

SQL

This control uses a named query:

with network_sg as (
select distinct
name sg_name
from
azure_network_security_group nsg,
jsonb_array_elements(security_rules) sg,
jsonb_array_elements_text(sg -> 'properties' -> 'destinationPortRanges' || (sg -> 'properties' -> 'destinationPortRange') :: jsonb) dport,
jsonb_array_elements_text(sg -> 'properties' -> 'sourceAddressPrefixes' || (sg -> 'properties' -> 'sourceAddressPrefix') :: jsonb) sip
where
sg -> 'properties' ->> 'access' = 'Allow'
and sg -> 'properties' ->> 'direction' = 'Inbound'
and sg -> 'properties' ->> 'protocol' ilike 'TCP'
and sip in
(
'*',
'0.0.0.0',
'0.0.0.0/0',
'Internet',
'any',
'<nw>/0',
'/0'
)
and
(
dport in
(
'80',
'*'
)
or
(
dport like '%-%'
and split_part(dport, '-', 1) :: integer <= 80
and split_part(dport, '-', 2) :: integer >= 80
)
)
)
select
sg.id resource,
case
when nsg.sg_name is null then 'ok'
else 'alarm'
end as status,
case
when nsg.sg_name is null then sg.title || ' restricts HTTPS access from internet.'
else sg.title || ' allows HTTPS access from internet.'
end as reason
, sg.resource_group as resource_group
, sub.display_name as subscription
from
azure_network_security_group sg
left join network_sg nsg on nsg.sg_name = sg.name
join azure_subscription sub on sub.subscription_id = sg.subscription_id;

Tags