modules/management/locals.tf (784 lines of code) (raw):
# The following block of locals are used to avoid using
# empty object types in the code.
locals {
empty_string = ""
empty_list = []
empty_map = {}
}
# Convert the input vars to locals, applying any required
# logic needed before they are used in the module.
# No vars should be referenced elsewhere in the module.
# NOTE: Need to catch error for resource_suffix when
# no value for subscription_id is provided.
locals {
enabled = var.enabled
root_id = var.root_id
subscription_id = coalesce(var.subscription_id, "00000000-0000-0000-0000-000000000000")
settings = var.settings
location = lower(var.location)
tags = var.tags
resource_prefix = coalesce(var.resource_prefix, local.root_id)
resource_suffix = length(var.resource_suffix) > 0 ? "-${var.resource_suffix}" : local.empty_string
existing_resource_group_name = var.existing_resource_group_name
existing_log_analytics_workspace_resource_id = var.existing_log_analytics_workspace_resource_id
existing_automation_account_resource_id = var.existing_automation_account_resource_id
link_log_analytics_to_automation_account = var.link_log_analytics_to_automation_account
custom_settings = var.custom_settings_by_resource_type
asc_export_resource_group_name = coalesce(var.asc_export_resource_group_name, "${local.root_id}-asc-export")
}
# Extract individual custom settings blocks from
# the custom_settings_by_resource_type variable.
locals {
custom_settings_rsg = try(local.custom_settings.azurerm_resource_group["management"], local.empty_map)
custom_settings_la_workspace = try(local.custom_settings.azurerm_log_analytics_workspace["management"], local.empty_map)
custom_settings_la_solution = try(local.custom_settings.azurerm_log_analytics_solution["management"], local.empty_map)
custom_settings_aa = try(local.custom_settings.azurerm_automation_account["management"], local.empty_map)
custom_settings_uami = try(local.custom_settings.azurerm_user_assigned_identity["management"], local.empty_map)
custom_settings_la_linked_service = try(local.custom_settings.azurerm_log_analytics_linked_service["management"], local.empty_map)
custom_settings_dcr_vm_insights = try(local.custom_settings.azurerm_data_collection_rule["vm_insights"], local.empty_map)
custom_settings_dcr_change_tracking = try(local.custom_settings.azurerm_data_collection_rule["change_tracking"], local.empty_map)
custom_settings_dcr_defender_sql = try(local.custom_settings.azurerm_data_collection_rule["defender_sql"], local.empty_map)
}
# Logic to determine whether specific resources
# should be created by this module
locals {
deploy_monitoring_settings = local.settings.log_analytics.enabled
deploy_monitoring_for_vm = local.deploy_monitoring_settings && local.settings.log_analytics.config.enable_monitoring_for_vm
deploy_monitoring_for_vmss = local.deploy_monitoring_settings && local.settings.log_analytics.config.enable_monitoring_for_vmss
deploy_monitoring_resources = local.enabled && local.deploy_monitoring_settings
deploy_resource_group = local.deploy_monitoring_resources && local.existing_resource_group_name == local.empty_string
deploy_log_analytics_workspace = local.deploy_monitoring_resources && local.existing_log_analytics_workspace_resource_id == local.empty_string
deploy_log_analytics_linked_service = local.deploy_monitoring_resources && local.link_log_analytics_to_automation_account
deploy_automation_account = local.deploy_monitoring_resources && local.existing_automation_account_resource_id == local.empty_string
deploy_azure_monitor_solutions = {
ChangeTracking = local.deploy_monitoring_resources && local.settings.log_analytics.config.enable_change_tracking
VMInsights = local.deploy_monitoring_resources && local.settings.log_analytics.config.enable_solution_for_vm_insights
ContainerInsights = local.deploy_monitoring_resources && local.settings.log_analytics.config.enable_solution_for_container_insights
SecurityInsights = local.deploy_monitoring_resources && local.settings.log_analytics.config.enable_sentinel
}
deploy_security_settings = local.settings.security_center.enabled
deploy_defender_for_app_services = local.settings.security_center.config.enable_defender_for_app_services
deploy_defender_for_arm = local.settings.security_center.config.enable_defender_for_arm
deploy_defender_for_containers = local.settings.security_center.config.enable_defender_for_containers
deploy_defender_for_cosmosdbs = local.settings.security_center.config.enable_defender_for_cosmosdbs
deploy_defender_for_cspm = local.settings.security_center.config.enable_defender_for_cspm
deploy_defender_for_key_vault = local.settings.security_center.config.enable_defender_for_key_vault
deploy_defender_for_oss_databases = local.settings.security_center.config.enable_defender_for_oss_databases
deploy_defender_for_servers = local.settings.security_center.config.enable_defender_for_servers
deploy_defender_for_servers_vulnerability_assessments = local.settings.security_center.config.enable_defender_for_servers_vulnerability_assessments
deploy_defender_for_sql_servers = local.settings.security_center.config.enable_defender_for_sql_servers
deploy_defender_for_sql_server_vms = local.settings.security_center.config.enable_defender_for_sql_server_vms
deploy_defender_for_storage = local.settings.security_center.config.enable_defender_for_storage
deploy_ama_uami = local.deploy_monitoring_resources && local.settings.ama.enable_uami
deploy_vminsights_dcr = local.deploy_monitoring_resources && local.settings.ama.enable_vminsights_dcr
deploy_change_tracking_dcr = local.deploy_monitoring_resources && local.settings.ama.enable_change_tracking_dcr
deploy_mdfc_defender_for_sql_dcr = local.deploy_monitoring_resources && local.settings.ama.enable_mdfc_defender_for_sql_dcr
}
# Configuration settings for resource type:
# - azurerm_resource_group
locals {
resource_group_name = coalesce(
local.existing_resource_group_name,
lookup(local.custom_settings_rsg, "name", "${local.resource_prefix}-mgmt"),
)
resource_group_resource_id = "/subscriptions/${local.subscription_id}/resourceGroups/${local.resource_group_name}"
azurerm_resource_group = {
name = local.resource_group_name,
location = lookup(local.custom_settings_rsg, "location", local.location)
tags = lookup(local.custom_settings_rsg, "tags", local.tags)
}
}
# Configuration settings for resource type:
# - azurerm_log_analytics_workspace
locals {
log_analytics_workspace_resource_id = coalesce(
local.existing_log_analytics_workspace_resource_id,
"${local.resource_group_resource_id}/providers/Microsoft.OperationalInsights/workspaces/${local.azurerm_log_analytics_workspace.name}"
)
azurerm_log_analytics_workspace = {
name = lookup(local.custom_settings_la_workspace, "name", "${local.resource_prefix}-la${local.resource_suffix}")
resource_group_name = lookup(local.custom_settings_la_workspace, "resource_group_name", local.resource_group_name)
location = lookup(local.custom_settings_la_workspace, "location", local.location)
allow_resource_only_permissions = lookup(local.custom_settings_la_workspace, "allow_resource_only_permissions", true) # Available only in v3.36.0 onwards
sku = lookup(local.custom_settings_la_workspace, "sku", "PerGB2018")
retention_in_days = lookup(local.custom_settings_la_workspace, "retention_in_days", local.settings.log_analytics.config.retention_in_days)
daily_quota_gb = lookup(local.custom_settings_la_workspace, "daily_quota_gb", local.settings.log_analytics.config.daily_quota_gb)
cmk_for_query_forced = lookup(local.custom_settings_la_workspace, "cmk_for_query_forced", null)
internet_ingestion_enabled = lookup(local.custom_settings_la_workspace, "internet_ingestion_enabled", true)
internet_query_enabled = lookup(local.custom_settings_la_workspace, "internet_query_enabled", true)
reservation_capacity_in_gb_per_day = lookup(local.custom_settings_la_workspace, "reservation_capacity_in_gb_per_day", null)
tags = lookup(local.custom_settings_la_workspace, "tags", local.tags)
}
}
# Configuration settings for resource type:
# - azurerm_log_analytics_solution
locals {
log_analytics_solution_resource_id = {
for resource in local.azurerm_log_analytics_solution :
resource.solution_name => "${local.resource_group_resource_id}/providers/Microsoft.OperationsManagement/solutions/${resource.solution_name}(${local.azurerm_log_analytics_workspace.name})"
}
azurerm_log_analytics_solution = [
for solution_name, solution_enabled in local.deploy_azure_monitor_solutions :
{
solution_name = solution_name
resource_group_name = lookup(local.custom_settings_la_solution, "resource_group_name", local.resource_group_name)
location = lookup(local.custom_settings_la_solution, "location", local.location)
workspace_resource_id = local.log_analytics_workspace_resource_id
workspace_name = basename(local.log_analytics_workspace_resource_id)
tags = lookup(local.custom_settings_la_solution, "tags", local.tags)
plan = {
publisher = "Microsoft"
product = "OMSGallery/${solution_name}"
}
}
if solution_enabled
]
}
# Configuration for the user assigned managed identity
locals {
user_assigned_managed_identity_resource_id = "${local.resource_group_resource_id}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${local.user_assigned_managed_identity.name}"
user_assigned_managed_identity = {
name = lookup(local.custom_settings_uami, "name", "${local.resource_prefix}-uami${local.resource_suffix}")
resource_group_name = lookup(local.custom_settings_uami, "resource_group_name", local.resource_group_name)
location = lookup(local.custom_settings_uami, "location", local.location)
tags = lookup(local.custom_settings_uami, "tags", local.tags)
}
}
# Configuration for the change tracking DCR
locals {
azure_monitor_data_collection_rule_change_tracking_resource_id = "${local.resource_group_resource_id}/providers/Microsoft.Insights/dataCollectionRules/${local.azure_monitor_data_collection_rule_change_tracking.name}"
azure_monitor_data_collection_rule_change_tracking = {
name = lookup(local.custom_settings_dcr_change_tracking, "name", "${local.resource_prefix}-dcr-changetracking-prod${local.resource_suffix}")
type = "Microsoft.Insights/dataCollectionRules@2021-04-01"
parent_id = local.resource_group_resource_id
location = lookup(local.custom_settings_dcr_change_tracking, "location", local.location)
schema_validation_enabled = true
tags = lookup(local.custom_settings_dcr_change_tracking, "tags", local.tags)
body = {
properties = {
description = "Data collection rule for CT"
dataSources = {
extensions = [
{
streams = [
"Microsoft-ConfigurationChange",
"Microsoft-ConfigurationChangeV2",
"Microsoft-ConfigurationData"
]
extensionName = "ChangeTracking-Windows"
extensionSettings = {
enableFiles = true,
enableSoftware = true,
enableRegistry = true,
enableServices = true,
enableInventory = true,
registrySettings = {
registryCollectionFrequency = 3600
registryInfo = [
{
name = "Registry_1",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\Scripts\\Startup",
valueName = ""
},
{
name = "Registry_2",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\Scripts\\Shutdown",
valueName = ""
},
{
name = "Registry_3",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run",
valueName = ""
},
{
name = "Registry_4",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Active Setup\\Installed Components",
valueName = ""
},
{
name = "Registry_5",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Classes\\Directory\\ShellEx\\ContextMenuHandlers",
valueName = ""
},
{
name = "Registry_6",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Classes\\Directory\\Background\\ShellEx\\ContextMenuHandlers",
valueName = ""
},
{
name = "Registry_7",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Classes\\Directory\\Shellex\\CopyHookHandlers",
valueName = ""
},
{
name = "Registry_8",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIconOverlayIdentifiers",
valueName = ""
},
{
name = "Registry_9",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellIconOverlayIdentifiers",
valueName = ""
},
{
name = "Registry_10",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects",
valueName = ""
},
{
name = "Registry_11",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects",
valueName = ""
},
{
name = "Registry_12",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Internet Explorer\\Extensions",
valueName = ""
},
{
name = "Registry_13",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Internet Explorer\\Extensions",
valueName = ""
},
{
name = "Registry_14",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32",
valueName = ""
},
{
name = "Registry_15",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32",
valueName = ""
},
{
name = "Registry_16",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\KnownDlls",
valueName = ""
},
{
name = "Registry_17",
groupTag = "Recommended",
enabled = false,
recurse = true,
description = "",
keyName = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify",
valueName = ""
}
]
}
fileSettings = {
fileCollectionFrequency = 2700,
},
softwareSettings = {
softwareCollectionFrequency = 1800
},
inventorySettings = {
inventoryCollectionFrequency = 36000
},
servicesSettings = {
serviceCollectionFrequency = 1800
}
}
name = "CTDataSource-Windows"
},
{
streams = [
"Microsoft-ConfigurationChange",
"Microsoft-ConfigurationChangeV2",
"Microsoft-ConfigurationData"
]
extensionName = "ChangeTracking-Linux"
extensionSettings = {
enableFiles = true,
enableSoftware = true,
enableRegistry = false,
enableServices = true,
enableInventory = true,
fileSettings = {
fileCollectionFrequency = 900,
fileInfo = [
{
name = "ChangeTrackingLinuxPath_default",
enabled = true,
destinationPath = "/etc/.*.conf",
useSudo = true,
recurse = true,
maxContentsReturnable = 5000000,
pathType = "File",
type = "File",
links = "Follow",
maxOutputSize = 500000,
groupTag = "Recommended"
}
]
},
softwareSettings = {
softwareCollectionFrequency = 300
},
inventorySettings = {
inventoryCollectionFrequency = 36000
},
servicesSettings = {
serviceCollectionFrequency = 300
}
}
name = "CTDataSource-Linux"
}
]
}
destinations = {
logAnalytics = [
{
name = "Microsoft-CT-Dest"
workspaceResourceId = local.log_analytics_workspace_resource_id
}
]
}
dataFlows = [
{
streams = [
"Microsoft-ConfigurationChange",
"Microsoft-ConfigurationChangeV2",
"Microsoft-ConfigurationData"
]
destinations = ["Microsoft-CT-Dest"]
}
]
}
}
}
}
# Configuration for the change tracking DCR
locals {
azure_monitor_data_collection_rule_defender_sql_resource_id = "${local.resource_group_resource_id}/providers/Microsoft.Insights/dataCollectionRules/${local.azure_monitor_data_collection_rule_defender_sql.name}"
azure_monitor_data_collection_rule_defender_sql = {
name = lookup(local.custom_settings_dcr_defender_sql, "name", "${local.resource_prefix}-dcr-defendersql-prod${local.resource_suffix}")
parent_id = local.resource_group_resource_id
type = "Microsoft.Insights/dataCollectionRules@2021-04-01"
location = lookup(local.custom_settings_dcr_defender_sql, "location", local.location)
schema_validation_enabled = true
tags = lookup(local.custom_settings_dcr_defender_sql, "tags", local.tags)
body = {
properties = {
description = "Data collection rule for Defender for SQL.",
dataSources = {
extensions = [
{
extensionName = "MicrosoftDefenderForSQL",
name = "MicrosoftDefenderForSQL",
streams = [
"Microsoft-DefenderForSqlAlerts",
"Microsoft-DefenderForSqlLogins",
"Microsoft-DefenderForSqlTelemetry",
"Microsoft-DefenderForSqlScanEvents",
"Microsoft-DefenderForSqlScanResults",
],
extensionSettings = {
enableCollectionOfSqlQueriesForSecurityResearch = local.settings.ama.enable_mdfc_defender_for_sql_query_collection_for_security_research
}
}
]
},
destinations = {
logAnalytics = [
{
workspaceResourceId = local.log_analytics_workspace_resource_id,
name = "LogAnalyticsDest"
}
]
},
dataFlows = [
{
streams = [
"Microsoft-DefenderForSqlAlerts",
"Microsoft-DefenderForSqlLogins",
"Microsoft-DefenderForSqlTelemetry",
"Microsoft-DefenderForSqlScanEvents",
"Microsoft-DefenderForSqlScanResults",
],
destinations = [
"LogAnalyticsDest"
]
}
]
}
}
}
}
# Configuration for the VM Insights DCR
locals {
azure_monitor_data_collection_rule_vm_insights_resource_id = "${local.resource_group_resource_id}/providers/Microsoft.Insights/dataCollectionRules/${local.azure_monitor_data_collection_rule_vm_insights.name}"
azure_monitor_data_collection_rule_vm_insights = {
name = lookup(local.custom_settings_dcr_vm_insights, "name", "${local.resource_prefix}-dcr-vm-insights${local.resource_suffix}")
parent_id = local.resource_group_resource_id
type = "Microsoft.Insights/dataCollectionRules@2021-04-01"
location = lookup(local.custom_settings_dcr_vm_insights, "location", local.location)
tags = lookup(local.custom_settings_dcr_vm_insights, "tags", local.tags)
schema_validation_enabled = false
body = {
properties = {
description = "Data collection rule for VM Insights.",
dataSources = {
performanceCounters = [
{
name = "VMInsightsPerfCounters",
streams = [
"Microsoft-InsightsMetrics"
],
scheduledTransferPeriod = "PT1M",
samplingFrequencyInSeconds = 60,
counterSpecifiers = [
"\\VmInsights\\DetailedMetrics"
]
}
],
extensions = [
{
streams = [
"Microsoft-ServiceMap"
],
extensionName = "DependencyAgent",
extensionSettings = {},
name = "DependencyAgentDataSource"
}
]
},
destinations = {
logAnalytics = [
{
workspaceResourceId = local.log_analytics_workspace_resource_id,
name = "VMInsightsPerf-Logs-Dest"
}
]
},
dataFlows = [
{
streams = [
"Microsoft-InsightsMetrics"
],
destinations = [
"VMInsightsPerf-Logs-Dest"
]
},
{
streams = [
"Microsoft-ServiceMap"
],
destinations = [
"VMInsightsPerf-Logs-Dest"
]
}
]
}
}
}
}
# Configuration settings for resource type:
# - azurerm_automation_account
locals {
automation_account_resource_id = coalesce(
local.existing_automation_account_resource_id,
"${local.resource_group_resource_id}/providers/Microsoft.Automation/automationAccounts/${local.azurerm_automation_account.name}"
)
# As per issue #449, some automation accounts should be created in a different region to the log analytics workspace
# The automation_account_location_map local is used to track these
automation_account_location_map = {
eastus = "eastus2"
eastus2 = "eastus"
}
automation_account_location = coalesce(
lookup(local.custom_settings_aa, "location", null),
lookup(local.automation_account_location_map, local.location, local.location)
)
azurerm_automation_account = {
name = lookup(local.custom_settings_aa, "name", "${local.resource_prefix}-automation${local.resource_suffix}")
resource_group_name = lookup(local.custom_settings_aa, "resource_group_name", local.resource_group_name)
location = lookup(local.custom_settings_aa, "location", local.automation_account_location)
sku_name = lookup(local.custom_settings_aa, "sku_name", "Basic")
public_network_access_enabled = lookup(local.custom_settings_aa, "public_network_access_enabled", true)
local_authentication_enabled = lookup(local.custom_settings_aa, "local_authentication_enabled", true)
identity = lookup(local.custom_settings_aa, "identity", local.empty_list)
encryption = lookup(local.custom_settings_aa, "encryption", local.empty_list)
tags = lookup(local.custom_settings_aa, "tags", local.tags)
}
}
# Configuration settings for resource type:
# - azurerm_log_analytics_linked_service
locals {
log_analytics_linked_service_resource_id = "${local.log_analytics_workspace_resource_id}/linkedServices/Automation"
azurerm_log_analytics_linked_service = {
resource_group_name = lookup(local.custom_settings_la_linked_service, "resource_group_name", local.resource_group_name)
workspace_id = lookup(local.custom_settings_la_linked_service, "workspace_id", local.log_analytics_workspace_resource_id)
read_access_id = lookup(local.custom_settings_la_linked_service, "read_access_id", local.automation_account_resource_id) # This should be used for linking to an Automation Account resource.
write_access_id = null # DO NOT USE. This should be used for linking to a Log Analytics Cluster resource
}
}
# Archetype configuration overrides
locals {
archetype_config_overrides = {
(local.root_id) = {
parameters = {
Deploy-MDFC-Config-H224 = {
emailSecurityContact = local.settings.security_center.config.email_security_contact
logAnalytics = local.log_analytics_workspace_resource_id
ascExportResourceGroupName = local.asc_export_resource_group_name
ascExportResourceGroupLocation = local.location
enableAscForAppServices = local.deploy_defender_for_app_services ? "DeployIfNotExists" : "Disabled"
enableAscForArm = local.deploy_defender_for_arm ? "DeployIfNotExists" : "Disabled"
enableAscForContainers = local.deploy_defender_for_containers ? "DeployIfNotExists" : "Disabled"
enableAscForCosmosDbs = local.deploy_defender_for_cosmosdbs ? "DeployIfNotExists" : "Disabled"
enableAscForCspm = local.deploy_defender_for_cspm ? "DeployIfNotExists" : "Disabled"
enableAscForKeyVault = local.deploy_defender_for_key_vault ? "DeployIfNotExists" : "Disabled"
enableAscForOssDb = local.deploy_defender_for_oss_databases ? "DeployIfNotExists" : "Disabled"
enableAscForServers = local.deploy_defender_for_servers ? "DeployIfNotExists" : "Disabled"
enableAscForServersVulnerabilityAssessments = local.deploy_defender_for_servers_vulnerability_assessments ? "DeployIfNotExists" : "Disabled"
enableAscForSql = local.deploy_defender_for_sql_servers ? "DeployIfNotExists" : "Disabled"
enableAscForSqlOnVm = local.deploy_defender_for_sql_server_vms ? "DeployIfNotExists" : "Disabled"
enableAscForStorage = local.deploy_defender_for_storage ? "DeployIfNotExists" : "Disabled"
}
Deploy-AzActivity-Log = {
logAnalytics = local.log_analytics_workspace_resource_id
}
Deploy-Diag-LogsCat = {
logAnalytics = local.log_analytics_workspace_resource_id
}
}
enforcement_mode = {
Deploy-MDFC-Config = local.deploy_security_settings
Deploy-VM-Monitoring = local.deploy_monitoring_for_vm
Deploy-VMSS-Monitoring = local.deploy_monitoring_for_vmss
}
}
"${local.root_id}-landing-zones" = {
parameters = {
DenyAction-DeleteUAMIAMA = {
resourceName = local.user_assigned_managed_identity.name
resourceType = "Microsoft.ManagedIdentity/userAssignedIdentities"
}
Deploy-MDFC-DefSQL-AMA = {
userWorkspaceResourceId = local.log_analytics_workspace_resource_id
}
Deploy-AzSqlDb-Auditing = {
logAnalyticsWorkspaceId = lower(local.log_analytics_workspace_resource_id)
}
}
enforcement_mode = {}
}
"${local.root_id}-platform" = {
parameters = {
DenyAction-DeleteUAMIAMA = {
resourceName = local.user_assigned_managed_identity.name
resourceType = "Microsoft.ManagedIdentity/userAssignedIdentities"
}
Deploy-MDFC-DefSQL-AMA = {
userWorkspaceResourceId = local.log_analytics_workspace_resource_id
}
Deploy-AzSqlDb-Auditing = {
logAnalyticsWorkspaceId = lower(local.log_analytics_workspace_resource_id)
}
}
enforcement_mode = {}
}
"${local.root_id}-management" = {
parameters = {
Deploy-Log-Analytics = {
automationAccountName = local.azurerm_automation_account.name
automationRegion = local.azurerm_automation_account.location
rgName = local.azurerm_resource_group.name
workspaceName = local.azurerm_log_analytics_workspace.name
workspaceRegion = local.azurerm_log_analytics_workspace.location
# Need to ensure dataRetention gets handled as a string
dataRetention = tostring(local.azurerm_log_analytics_workspace.retention_in_days)
# Need to ensure sku value is set to lowercase only when "PerGB2018" specified
# Evaluating in lower() to ensure the correct error is surfaced on the resource if invalid casing is used
sku = lower(local.azurerm_log_analytics_workspace.sku) == "pergb2018" ? lower(local.azurerm_log_analytics_workspace.sku) : local.azurerm_log_analytics_workspace.sku
}
}
enforcement_mode = {
Deploy-Log-Analytics = false
}
}
}
}
# Sentinel onboarding
locals {
azapi_sentinel_onboarding_resource_id = "${local.log_analytics_workspace_resource_id}/Microsoft.SecurityInsights/onboardingStates/default"
azapi_sentinel_onboarding = {
type = "Microsoft.SecurityInsights/onboardingStates@2024-03-01"
body = {
properties = {
customerManagedKey = try(local.settings.log_analytics.config.sentinel_customer_managed_key_enabled, false)
}
}
name = "default"
parent_id = local.log_analytics_workspace_resource_id
}
}
# Template file variable outputs
locals {
template_file_variables = {
automation_account_location = local.azurerm_automation_account.location
automation_account_name = local.azurerm_automation_account.name
automation_account_resource_id = local.automation_account_resource_id
azure_monitor_data_collection_rule_change_tracking_resource_id = local.azure_monitor_data_collection_rule_change_tracking_resource_id
azure_monitor_data_collection_rule_sql_resource_id = local.azure_monitor_data_collection_rule_defender_sql_resource_id
azure_monitor_data_collection_rule_vm_insights_resource_id = local.azure_monitor_data_collection_rule_vm_insights_resource_id
data_retention = tostring(local.azurerm_log_analytics_workspace.retention_in_days)
log_analytics_workspace_location = local.azurerm_log_analytics_workspace.location
log_analytics_workspace_name = local.azurerm_log_analytics_workspace.name
log_analytics_workspace_resource_id = local.log_analytics_workspace_resource_id
management_location = local.location
management_resource_group_name = local.azurerm_resource_group.name
user_assigned_managed_identity_resource_id = local.user_assigned_managed_identity_resource_id
}
}
# Generate the configuration output object for the management module
locals {
module_output = {
azurerm_resource_group = [
{
resource_id = local.resource_group_resource_id
resource_name = basename(local.resource_group_resource_id)
template = {
for key, value in local.azurerm_resource_group :
key => value
if local.deploy_resource_group
}
managed_by_module = local.deploy_resource_group
},
]
azurerm_log_analytics_workspace = [
{
resource_id = local.log_analytics_workspace_resource_id
resource_name = basename(local.log_analytics_workspace_resource_id)
template = {
for key, value in local.azurerm_log_analytics_workspace :
key => value
if local.deploy_log_analytics_workspace
}
managed_by_module = local.deploy_log_analytics_workspace
},
]
azurerm_log_analytics_solution = [
for resource in local.azurerm_log_analytics_solution :
{
resource_id = local.log_analytics_solution_resource_id[resource.solution_name]
resource_name = basename(local.log_analytics_solution_resource_id[resource.solution_name])
template = resource
managed_by_module = true
}
]
azurerm_automation_account = [
{
resource_id = local.automation_account_resource_id
resource_name = basename(local.automation_account_resource_id)
template = {
for key, value in local.azurerm_automation_account :
key => value
if local.deploy_automation_account
}
managed_by_module = local.deploy_automation_account
},
]
azurerm_log_analytics_linked_service = [
{
resource_id = local.log_analytics_linked_service_resource_id
resource_name = basename(local.log_analytics_linked_service_resource_id)
template = {
for key, value in local.azurerm_log_analytics_linked_service :
key => value
if local.deploy_log_analytics_linked_service
}
managed_by_module = local.deploy_log_analytics_linked_service
},
]
azurerm_user_assigned_identity = [
{
resource_id = local.user_assigned_managed_identity_resource_id
resource_name = basename(local.user_assigned_managed_identity_resource_id)
template = {
for key, value in local.user_assigned_managed_identity :
key => value
if local.deploy_ama_uami
}
managed_by_module = local.deploy_ama_uami
}
]
azurerm_monitor_data_collection_rule = [
{
resource_id = local.azure_monitor_data_collection_rule_vm_insights_resource_id
resource_name = basename(local.azure_monitor_data_collection_rule_vm_insights_resource_id)
template = {
for key, value in local.azure_monitor_data_collection_rule_vm_insights :
key => value
if local.deploy_vminsights_dcr
}
managed_by_module = local.deploy_vminsights_dcr
},
{
resource_id = local.azure_monitor_data_collection_rule_change_tracking_resource_id
resource_name = basename(local.azure_monitor_data_collection_rule_change_tracking_resource_id)
template = {
for key, value in local.azure_monitor_data_collection_rule_change_tracking :
key => value
if local.deploy_change_tracking_dcr
}
managed_by_module = local.deploy_change_tracking_dcr
},
{
resource_id = local.azure_monitor_data_collection_rule_defender_sql_resource_id
resource_name = basename(local.azure_monitor_data_collection_rule_defender_sql_resource_id)
template = {
for key, value in local.azure_monitor_data_collection_rule_defender_sql :
key => value
if local.deploy_mdfc_defender_for_sql_dcr
}
managed_by_module = local.deploy_mdfc_defender_for_sql_dcr
}
]
azapi_sentinel_onboarding = [
{
resource_id = local.azapi_sentinel_onboarding_resource_id
resource_name = basename(local.azapi_sentinel_onboarding_resource_id)
template = {
for key, value in local.azapi_sentinel_onboarding :
key => value
if local.deploy_azure_monitor_solutions.SecurityInsights
}
managed_by_module = local.deploy_azure_monitor_solutions.SecurityInsights
}
]
archetype_config_overrides = local.archetype_config_overrides
template_file_variables = local.template_file_variables
}
}