Control: 5.1.5 Ensure that Network Security Group Flow logs are captured and sent to Log Analytics
Description
Ensure that network flow logs are captured and fed into a central log analytics workspace.
Network Flow Logs provide valuable insight into the flow of traffic around your network and feed into both Azure Monitor and Azure Sentinel (if in use), permitting the generation of visual flow diagrams to aid with analyzing for lateral movement, etc.
Remediation
From Azure Portal
- Navigate to
Network Watcher
. - Select
NSG flow logs
. - Select
+ Create
. - Select the desired Subscription.
- Select
+ Select NSG
. - Select a network security group.
- Click
Confirm selection
. - Select or create a new Storage Account.
- Input the retention in days to retain the log.
- Click
Next
. - Under
Configuration
, selectVersion 2
. - If rich analytics are required, select
Enable Traffic Analytics
, a processing interval, and aLog Analytics Workspace
. - Select
Next
. - Optionally add Tags.
- Select
Review + create
. - Select
Create
.
Warning The remediation policy creates remediation deployment and names them by concatenating the subscription name and the resource group name. The MAXIMUM permitted length of a deployment name is 64 characters. Exceeding this will cause the remediation task to fail.
Default Value
By default Network Security Group logs are not sent to Log Analytics.
Usage
Run the control in your terminal:
powerpipe control run azure_compliance.control.cis_v210_5_1_5
Snapshot and share results via Turbot Pipes:
powerpipe loginpowerpipe control run azure_compliance.control.cis_v210_5_1_5 --share
SQL
This control uses a named query:
with nsg_network_watcher_flow_log as ( select subscription_id, count(*) as nsg_flow_log_count from azure_network_watcher_flow_log where traffic_analytics -> 'workspaceId' is not null and target_resource_id like '%/Microsoft.Network/networkSecurityGroups/%' group by subscription_id)select sub.id resource, case when nsg_flow_log_count > 0 then 'ok' else 'alarm' end as status, case when nsg_flow_log_count > 0 then sub.display_name || ' has ' || nsg_flow_log_count || ' NSG flow log(s) captured and sent to log analytics.' else sub.display_name || ' has no NSG flow log captured and sent to log analytics.' end as reason , display_name as subscriptionfrom azure_subscription as sub left join nsg_network_watcher_flow_log as nsg_flow_log on nsg_flow_log.subscription_id = sub.subscription_id;