Quickstart: Azure Firewall implementeren met Beschikbaarheidszones - Terraform
In deze quickstart gebruikt u Terraform om een Azure Firewall in drie Beschikbaarheidszones te implementeren.
Terraform maakt de definitie, preview en implementatie van de cloudinfrastructuur mogelijk. Met Behulp van Terraform maakt u configuratiebestanden met behulp van de HCL-syntaxis. Met de HCL-syntaxis kunt u de cloudprovider opgeven, zoals Azure, en de elementen waaruit uw cloudinfrastructuur bestaat. Nadat u uw configuratiebestanden hebt gemaakt, maakt u een uitvoeringsplan waarmee u een voorbeeld van uw infrastructuurwijzigingen kunt bekijken voordat ze worden geïmplementeerd. Zodra u de wijzigingen hebt gecontroleerd, past u het uitvoeringsplan toe om de infrastructuur te implementeren.
De Terraform-configuratie maakt een testnetwerkomgeving met een firewall. Het netwerk heeft één virtueel netwerk (VNet) met drie subnetten: AzureFirewallSubnet, subnet-server en subnet-jump. De subnet-server en subnet-jump subnet hebben elk één virtuele Windows Server-machine met twee kernen.
De firewall bevindt zich in het subnet AzureFirewallSubnet en heeft een verzameling toepassingsregels met één regel die toegang www.microsoft.com
tot .
Een door de gebruiker gedefinieerde routepunten netwerkverkeer van het subnet-serversubnet via de firewall waarop de firewallregels worden toegepast.
Raadpleeg voor meer informatie over Azure Firewall Azure Firewall implementeren en configureren met Azure Portal.
In dit artikel leert u het volgende:
- Een willekeurige waarde maken (te gebruiken in de naam van de resourcegroep) met behulp van random_pet
- Een Azure-resourcegroep maken met behulp van azurerm_resource_group
- Een virtueel Azure-netwerk maken met behulp van azurerm_virtual_network
- Drie Azure-subnetten maken met behulp van azurerm_subnet
- Een openbaar IP-adres van Azure maken met behulp van azurerm_public_ip
- Een Azure Firewall-beleid maken met behulp van azurerm_firewall_policy
- Een Azure Firewall Policy Rule Collection-groep maken met behulp van azurerm_firewall_policy_rule_collection_group
- Een Azure Firewall maken met behulp van azurerm_firewall
- Een netwerkinterface maken met azurerm_network_interface
- Een netwerkbeveiligingsgroep maken (om een lijst met netwerkbeveiligingsregels te bevatten) met behulp van azurerm_network_security_group
- Maak een koppeling tussen de netwerkinterface en de netwerkbeveiligingsgroep met behulp van - azurerm_network_interface_security_group_association
- Een routetabel maken met azurerm_route_table
- Een koppeling maken tussen de routetabel en het subnet met behulp van - azurerm_subnet_route_table_association
- Een willekeurige waarde maken (te gebruiken als opslagnaam) met behulp van random_string
- Een opslagaccount maken met azurerm_storage_account
- Een willekeurig wachtwoord maken voor de Windows-VM met behulp van random_password
- Een virtuele Azure Windows-machine maken met behulp van azurerm_windows_virtual_machine
Vereisten
De Terraform-code implementeren
Notitie
De voorbeeldcode voor dit artikel bevindt zich in de Azure Terraform GitHub-opslagplaats. U kunt het logboekbestand met de testresultaten van de huidige en vorige versies van Terraform bekijken.
Maak een map waarin u de Terraform-voorbeeldcode wilt testen en de huidige map kunt maken.
Maak een bestand met de naam
providers.tf
en voeg de volgende code in:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
Maak een bestand met de naam
main.tf
en voeg de volgende code in:resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "random_string" "storage_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "random_password" "password" { length = 20 min_lower = 1 min_upper = 1 min_numeric = 1 min_special = 1 special = true } resource "azurerm_resource_group" "rg" { name = random_pet.rg_name.id location = var.resource_group_location } resource "azurerm_public_ip" "pip_azfw" { name = "pip-azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" zones = ["1", "2", "3"] } resource "azurerm_storage_account" "sa" { name = random_string.storage_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location account_tier = "Standard" account_replication_type = "LRS" account_kind = "StorageV2" } resource "azurerm_virtual_network" "azfw_vnet" { name = "azfw-vnet" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name address_space = ["10.10.0.0/16"] } resource "azurerm_subnet" "azfw_subnet" { name = "AzureFirewallSubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.0.0/26"] } resource "azurerm_subnet" "server_subnet" { name = "subnet-server" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.1.0/24"] } resource "azurerm_subnet" "jump_subnet" { name = "subnet-jump" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.azfw_vnet.name address_prefixes = ["10.10.2.0/24"] } resource "azurerm_public_ip" "vm_jump_pip" { name = "pip-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" } resource "azurerm_network_interface" "vm_server_nic" { name = "nic-server" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-workload" subnet_id = azurerm_subnet.server_subnet.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_network_interface" "vm_jump_nic" { name = "nic-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig-jump" subnet_id = azurerm_subnet.jump_subnet.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.vm_jump_pip.id } } resource "azurerm_network_security_group" "vm_server_nsg" { name = "nsg-server" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_network_security_group" "vm_jump_nsg" { name = "nsg-jump" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name security_rule { name = "Allow-TCP" priority = 1000 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "3389" source_address_prefix = "*" destination_address_prefix = "*" } } resource "azurerm_network_interface_security_group_association" "vm_server_nsg_association" { network_interface_id = azurerm_network_interface.vm_server_nic.id network_security_group_id = azurerm_network_security_group.vm_server_nsg.id } resource "azurerm_network_interface_security_group_association" "vm_jump_nsg_association" { network_interface_id = azurerm_network_interface.vm_jump_nic.id network_security_group_id = azurerm_network_security_group.vm_jump_nsg.id } resource "azurerm_windows_virtual_machine" "vm_server" { name = "server-vm" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location computer_name = "server" size = var.virtual_machine_size admin_username = var.admin_username admin_password = random_password.password.result network_interface_ids = [azurerm_network_interface.vm_server_nic.id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" disk_size_gb = "128" } source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2019-Datacenter" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.sa.primary_blob_endpoint } } resource "azurerm_windows_virtual_machine" "vm_jump" { name = "jump-vm" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location computer_name = "jumpbox" size = var.virtual_machine_size admin_username = var.admin_username admin_password = random_password.password.result network_interface_ids = [azurerm_network_interface.vm_jump_nic.id] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" disk_size_gb = "128" } source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2019-Datacenter" version = "latest" } boot_diagnostics { storage_account_uri = azurerm_storage_account.sa.primary_blob_endpoint } } resource "azurerm_firewall_policy" "azfw_policy" { name = "azfw-policy" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku = var.firewall_sku_tier threat_intelligence_mode = "Alert" } resource "azurerm_firewall_policy_rule_collection_group" "prcg" { name = "prcg" firewall_policy_id = azurerm_firewall_policy.azfw_policy.id priority = 300 application_rule_collection { name = "appRc1" priority = 101 action = "Allow" rule { name = "appRule1" protocols { type = "Http" port = 80 } protocols { type = "Https" port = 443 } destination_fqdns = ["www.microsoft.com"] source_addresses = ["10.10.1.0/24"] } } network_rule_collection { name = "netRc1" priority = 200 action = "Allow" rule { name = "netRule1" protocols = ["TCP"] source_addresses = ["10.10.1.0/24"] destination_addresses = ["*"] destination_ports = ["8000", "8999"] } } } resource "azurerm_firewall" "fw" { name = "azfw" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku_name = "AZFW_VNet" sku_tier = var.firewall_sku_tier zones = ["1", "2", "3"] ip_configuration { name = "azfw-ipconfig" subnet_id = azurerm_subnet.azfw_subnet.id public_ip_address_id = azurerm_public_ip.pip_azfw.id } firewall_policy_id = azurerm_firewall_policy.azfw_policy.id } resource "azurerm_route_table" "rt" { name = "rt-azfw-eus" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name disable_bgp_route_propagation = false route { name = "azfwDefaultRoute" address_prefix = "0.0.0.0/0" next_hop_type = "VirtualAppliance" next_hop_in_ip_address = azurerm_firewall.fw.ip_configuration[0].private_ip_address } } resource "azurerm_subnet_route_table_association" "jump_subnet_rt_association" { subnet_id = azurerm_subnet.server_subnet.id route_table_id = azurerm_route_table.rt.id }
Maak een bestand met de naam
variables.tf
en voeg de volgende code in:variable "resource_group_location" { type = string description = "Location for all resources." default = "eastus" } variable "resource_group_name_prefix" { type = string description = "Prefix for the Resource Group Name that's combined with a random id so name is unique in your Azure subcription." default = "rg" } variable "firewall_sku_tier" { type = string description = "Firewall SKU." default = "Premium" # Valid values are Standard and Premium validation { condition = contains(["Standard", "Premium"], var.firewall_sku_tier) error_message = "The SKU must be one of the following: Standard, Premium" } } variable "virtual_machine_size" { type = string description = "Size of the virtual machine." default = "Standard_D2_v3" } variable "admin_username" { type = string description = "Value of the admin username." default = "azureuser" }
Maak een bestand met de naam
outputs.tf
en voeg de volgende code in:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "firewall_name" { value = azurerm_firewall.fw.name }
Terraform initialiseren
Voer terraform init uit om de Terraform-implementatie te initialiseren. Met deze opdracht wordt de Azure-provider gedownload die is vereist voor het beheren van uw Azure-resources.
terraform init -upgrade
Belangrijkste punten:
- Met
-upgrade
de parameter worden de benodigde providerinvoegtoepassingen bijgewerkt naar de nieuwste versie die voldoet aan de versiebeperkingen van de configuratie.
Een Terraform-uitvoeringsplan maken
Voer terraform-plan uit om een uitvoeringsplan te maken.
terraform plan -out main.tfplan
Belangrijkste punten:
- De
terraform plan
opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources. - Met de optionele
-out
parameter kunt u een uitvoerbestand voor het plan opgeven. Door de-out
parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.
Een Terraform-uitvoeringsplan toepassen
Terraform uitvoeren is van toepassing om het uitvoeringsplan toe te passen op uw cloudinfrastructuur.
terraform apply main.tfplan
Belangrijkste punten:
- Bij de voorbeeldopdracht
terraform apply
wordt ervan uitgegaan dat u eerder hebt uitgevoerdterraform plan -out main.tfplan
. - Als u een andere bestandsnaam voor de
-out
parameter hebt opgegeven, gebruikt u diezelfde bestandsnaam in de aanroep naarterraform apply
. - Als u de parameter niet hebt gebruikt, roept
terraform apply
u deze-out
aan zonder parameters.
De resultaten controleren
Haal de naam van de Azure-resourcegroep op.
resource_group_name=$(terraform output -raw resource_group_name)
Haal de naam van de firewall op.
firewall_name=$(terraform output -raw firewall_name)
Voer az network firewall show uit met een JMESPath-query om de beschikbaarheidszones voor de firewall weer te geven.
az network firewall show --name $firewall_name --resource-group $resource_group_name --query "{Zones:zones"}
Resources opschonen
Voer de volgende stappen uit wanneer u de resources die zijn gemaakt via Terraform niet meer nodig hebt:
Voer terraform-plan uit en geef de
destroy
vlag op.terraform plan -destroy -out main.destroy.tfplan
Belangrijkste punten:
- De
terraform plan
opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources. - Met de optionele
-out
parameter kunt u een uitvoerbestand voor het plan opgeven. Door de-out
parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.
- De
Terraform uitvoeren is van toepassing om het uitvoeringsplan toe te passen.
terraform apply main.destroy.tfplan
Problemen met Terraform in Azure oplossen
Veelvoorkomende problemen oplossen bij het gebruik van Terraform in Azure
Volgende stappen
Als volgende kunt u de Azure Firewall-logboeken bewaken.