Control: 6.6 Ensure that UDP Services are restricted from the Internet
Description
Disable Internet exposed UDP ports on network security groups.
The potential security problem with broadly exposing UDP services over the Internet is that attackers can use DDoS amplification techniques to reflect spoofed UDP traffic from Azure Virtual Machines. The most common types of these attacks use exposed DNS, NTP, SSDP, SNMP, CLDAP and other UDP-based services as amplification source for disrupting services of other machines on the Azure Virtual Network or even attack networked devices outside of Azure.
Note: Opting-out of Network Watcher automatic enablement is a permanent change. Once you opt-out you cannot opt-in without contacting support.
Remediation
Disable direct UDP access to your Azure Virtual Machines from the Internet. After direct UDP access from the Internet is disabled, you have other options you can use to access UDP based services running on these virtual machines:
Note: By default, UDP access from internet is not enabled.
Usage
Run the control in your terminal:
powerpipe control run azure_compliance.control.cis_v140_6_6Snapshot and share results via Turbot Pipes:
powerpipe loginpowerpipe control run azure_compliance.control.cis_v140_6_6 --shareSQL
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' = 'UDP'    and sip in ('*', '0.0.0.0', '0.0.0.0/0', 'Internet', 'any', '<nw>/0', '/0')    and (      dport = '*'      or (        dport like '%-%'        and (          53 between split_part(dport, '-', 1) :: integer and split_part(dport, '-', 2) :: integer          or 123 between split_part(dport, '-', 1) :: integer and split_part(dport, '-', 2) :: integer          or 161 between split_part(dport, '-', 1) :: integer and split_part(dport, '-', 2) :: integer          or 389 between split_part(dport, '-', 1) :: integer and split_part(dport, '-', 2) :: integer          or 1900 between split_part(dport, '-', 1) :: integer and split_part(dport, '-', 2) :: integer        )      )    ))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 UDP services from internet.'    else sg.title || ' allows UDP services 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  left join azure_subscription sub on sub.subscription_id = sg.subscription_id;