Control: 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.
Usage
Run the control in your terminal:
powerpipe control run azure_compliance.control.network_security_group_https_access_restricted
Snapshot and share results via Turbot Pipes:
powerpipe loginpowerpipe control run azure_compliance.control.network_security_group_https_access_restricted --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 subscriptionfrom 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;