Scenarios/Secure-Baseline/terraform/modules/vnet/firewall.tf (420 lines of code) (raw):
resource "azurerm_public_ip" "fw_pip" {
name = "${var.fw_name}-pip"
resource_group_name = var.hub_rg_name
location = var.location
allocation_method = "Static"
sku = "Standard"
}
resource "azurerm_firewall" "fw" {
name = var.fw_name
location = var.location
resource_group_name = var.hub_rg_name
sku_name = "AZFW_VNet"
sku_tier = "Standard"
# https://docs.microsoft.com/en-us/azure/virtual-network/what-is-ip-address-168-63-129-16
# This is the Azure VIP for DNS and is an workaround tracked in issue: https://github.com/hashicorp/terraform-provider-azurerm/issues/9184
dns_servers = ["168.63.129.16"]
ip_configuration {
name = "azfw-ipconfig"
subnet_id = azurerm_subnet.fw.id
public_ip_address_id = azurerm_public_ip.fw_pip.id
}
}
resource "azurerm_firewall_network_rule_collection" "aro" {
name = "Aro-required-ports"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 200
action = "Allow"
rule {
name = "NTP"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
destination_ports = [
"123"
]
destination_addresses = [
"*"
]
protocols = [
"Any"
]
}
}
# Minimum Required FQDN / application rules
resource "azurerm_firewall_application_rule_collection" "min" {
name = "Minimum-required-FQDN"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 200
action = "Allow"
rule {
name = "minimum_required_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"arosvc.${var.location}.data.azurecr.io",
"*.quay.io",
"registry.redhat.io",
"mirror.openshift.com",
"api.openshift.com",
"arosvc.azurecr.io",
"management.azure.com",
"login.microsoftonline.com",
"gcs.prod.monitoring.core.windows.net",
"*.blob.core.windows.net",
"*.servicebus.windows.net",
"*.table.core.windows.net"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro ]
}
# FIRST GROUP: INSTALLING AND DOWNLOADING PACKAGES AND TOOLS
resource "azurerm_firewall_application_rule_collection" "aro" {
name = "Aro-required-urls"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 201
action = "Allow"
rule {
name = "first_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"quay.io",
"registry.redhat.io",
"sso.redhat.com",
"openshift.org"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min ]
}
# SECOND GROUP: TELEMETRY
resource "azurerm_firewall_application_rule_collection" "telem" {
name = "Telemetry-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 202
action = "Allow"
rule {
name = "second_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"cert-api.access.redhat.com",
"api.access.redhat.com",
"infogw.api.openshift.com",
"cloud.redhat.com"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro ]
}
# THIRD GROUP: CLOUD APIs
resource "azurerm_firewall_application_rule_collection" "cloud" {
name = "Cloud-APIs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 203
action = "Allow"
rule {
name = "third_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"management.azure.com"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem ]
}
# FOURTH GROUP: OTHER OPENSHIFT REQUIREMENTS
resource "azurerm_firewall_application_rule_collection" "open_shift" {
name = "OpenShift-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 204
action = "Allow"
rule {
name = "fourth_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"mirror.openshift.com",
"storage.googleapis.com",
"api.openshift.com",
"registry.access.redhat.com"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem,
azurerm_firewall_application_rule_collection.cloud ]
}
# FIFTH GROUP: MICROSOFT & RED HAT ARO MONITORING SERVICE
resource "azurerm_firewall_application_rule_collection" "monitoring" {
name = "Monitoring-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 205
action = "Allow"
rule {
name = "fifth_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"login.microsoftonline.com",
"gcs.prod.monitoring.core.windows.net",
"*.blob.core.windows.net",
"*.servicebus.windows.net",
"*.table.core.windows.net"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem,
azurerm_firewall_application_rule_collection.cloud,
azurerm_firewall_application_rule_collection.open_shift ]
}
# SIXTH GROUP: ONBOARDING ARO ON TO ARC
resource "azurerm_firewall_application_rule_collection" "arc" {
name = "Arc-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 206
action = "Allow"
rule {
name = "sixth_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"${var.location}.login.microsoft.com",
"management.azure.com",
"${var.location}.dp.kubernetesconfiguration.azure.com",
"login.microsoftonline.com",
"login.windows.net",
"mcr.microsoft.com",
"*.data.mcr.microsoft.com",
"gbl.his.arc.azure.com",
"*.his.arc.azure.com",
"*.servicebus.windows.net",
"guestnotificationservice.azure.com",
"*.guestnotificationservice.azure.com",
"sts.windows.net",
"k8connecthelm.azureedge.net"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem,
azurerm_firewall_application_rule_collection.cloud,
azurerm_firewall_application_rule_collection.open_shift,
azurerm_firewall_application_rule_collection.monitoring ]
}
# SEVENTH GROUP: Azure Monitor Container Insights extension for Arc
resource "azurerm_firewall_application_rule_collection" "container_insights_arc" {
name = "Arc-ContainerInsights-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 207
action = "Allow"
rule {
name = "seventh_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"*.ods.opinsights.azure.com",
"*.oms.opinsights.azure.com",
"dc.services.visualstudio.com",
"*.monitoring.azure.com",
"login.microsoftonline.com"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem,
azurerm_firewall_application_rule_collection.cloud,
azurerm_firewall_application_rule_collection.open_shift,
azurerm_firewall_application_rule_collection.monitoring,
azurerm_firewall_application_rule_collection.arc ]
}
# EIGHTH GROUP: Docker HUB, GCR Optional for testing purpose
resource "azurerm_firewall_application_rule_collection" "docker_hub" {
name = "Docker-HUB-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 208
action = "Allow"
rule {
name = "eighth_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"registry.hub.docker.com",
"*.docker.io",
"production.cloudflare.docker.com",
"auth.docker.io",
"*.gcr.io"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem,
azurerm_firewall_application_rule_collection.cloud,
azurerm_firewall_application_rule_collection.open_shift,
azurerm_firewall_application_rule_collection.monitoring,
azurerm_firewall_application_rule_collection.arc,
azurerm_firewall_application_rule_collection.container_insights_arc ]
}
# NINETH GROUP: Miscellaneous - Optional for testing purpose
resource "azurerm_firewall_application_rule_collection" "misc" {
name = "Miscellaneous-URLs"
azure_firewall_name = azurerm_firewall.fw.name
resource_group_name = var.hub_rg_name
priority = 209
action = "Allow"
rule {
name = "nineth_group_target_fqdns"
source_addresses = concat(var.hub_prefix, var.spoke_prefix)
target_fqdns = [
"quayio-production-s3.s3.amazonaws.com"
]
protocol {
port = "80"
type = "Http"
}
protocol {
port = "443"
type = "Https"
}
}
depends_on = [ azurerm_firewall_network_rule_collection.aro,
azurerm_firewall_application_rule_collection.min,
azurerm_firewall_application_rule_collection.aro,
azurerm_firewall_application_rule_collection.telem,
azurerm_firewall_application_rule_collection.cloud,
azurerm_firewall_application_rule_collection.open_shift,
azurerm_firewall_application_rule_collection.monitoring,
azurerm_firewall_application_rule_collection.arc,
azurerm_firewall_application_rule_collection.container_insights_arc,
azurerm_firewall_application_rule_collection.docker_hub ]
}
resource "azurerm_virtual_network_dns_servers" "hub" {
virtual_network_id = azurerm_virtual_network.hub.id
dns_servers = ["${azurerm_firewall.fw.ip_configuration[0].private_ip_address}"]
}
resource "azurerm_virtual_network_dns_servers" "spoke" {
virtual_network_id = azurerm_virtual_network.spoke.id
dns_servers = ["${azurerm_firewall.fw.ip_configuration[0].private_ip_address}"]
}
# Diagnostic Settings
resource "azurerm_monitor_diagnostic_setting" "fw_diag" {
name = var.diag_name
target_resource_id = azurerm_firewall.fw.id
log_analytics_workspace_id = var.la_id
log_analytics_destination_type = "AzureDiagnostics"
enabled_log {
category = "AzureFirewallApplicationRule"
}
enabled_log {
category = "AzureFirewallNetworkRule"
}
enabled_log {
category = "AzureFirewallDnsProxy"
}
enabled_log {
category = "AZFWApplicationRule"
}
enabled_log {
category = "AZFWApplicationRuleAggregation"
}
enabled_log {
category = "AZFWDnsQuery"
}
enabled_log {
category = "AZFWFqdnResolveFailure"
}
enabled_log {
category = "AZFWIdpsSignature"
}
enabled_log {
category = "AZFWNatRule"
}
enabled_log {
category = "AZFWNatRuleAggregation"
}
enabled_log {
category = "AZFWNetworkRule"
}
enabled_log {
category = "AZFWNetworkRuleAggregation"
}
enabled_log {
category = "AZFWThreatIntel"
}
enabled_log {
category = "AZFWFatFlow"
}
metric {
category = "AllMetrics"
enabled = false
}
}