Firewallregels (toevoegen, wijzigen, verwijderen)¶
Standaardwijzigingen: Nieuwe firewallregels toevoegen en Firewallregels wijzigen in de centrale Azure Firewall(s).
Effect: rule collection groups en IP groups in de hub firewall policy van elke regio worden aangemaakt, bijgewerkt of
verwijderd. Alleen de firewall-layer verandert. Verkeer wordt toegestaan of geweigerd zodra de apply klaar is.
Voor naamgeving, prioriteitsbereiken, eigenaarschap van regels en de werkwijze met IP groups, zie de richtlijnen voor firewallregels en IP groups. Voor de review van een pull request, zie Pull request review en de runbooks Een aanvraag voor een firewallregel afhandelen, Review van een pull request voor een firewallregel en Deployment van een firewallregel. IP groups hebben een eigen runbook: IP groups. Workload teams die de pull request zelf voorbereiden, beginnen bij Firewallregels en IP groups voor workload teams.
Aanvraagvelden¶
| Aanvraagveld | Waar het terechtkomt | Opmerkingen |
|---|---|---|
| Workload Name | namen van rule collection group / collection / rule | Gebruik het in namen zodat regels te herleiden zijn, bijv. RCG App1, regel Allow-App1-Sql. |
| Spoke | pull request-beschrijving | De spoke waarvoor de regel bedoeld is. Helpt bij het vinden van het bronbereik en de eigenaar. |
| Onderbouwing | pull request / wijzigingsrecord | |
| Beschrijving en integratie | pull request-beschrijving | Waarvoor de regel wordt gebruikt en met welke andere workloads of on-premises systemen hij verbinding maakt. |
| Regelnaam | regelsleutel in de rules-map |
Geef de regel een naam waaruit het verkeer duidelijk blijkt, bijv. app1-vm-to-servicebus. |
| Regeltype (application of network) | in welke collection-map de regel komt | Weet de aanvrager het niet, bepaal het dan met de checklist hieronder. |
| Omgeving | platformomgeving (canary / prod) en regiomap(pen) |
|
| Source IP | source_addresses (IP's/CIDR's) of source_ip_groups (IP group-namen) |
Slechts één brontype per regel (config-test). |
| Source FQDN | niet ondersteund | Azure Firewall-regels in deze configuratie kunnen niet matchen op een bron-FQDN. Vraag in plaats daarvan om het bron-IP-bereik of een IP group. |
| Destination IP | network rule: destination_addresses (IP/CIDR/service tag) of destination_ip_groups |
Eén doeltype per regel. |
| Destination FQDN | network rule destination_fqdns, of application rule destination_fqdns |
Gebruik een application rule voor HTTP/HTTPS/MSSQL. Network rules met FQDN's vereisen DNS proxy op de firewall policy (firewall_policy_dns.proxy_enabled). |
| Protocol | network: TCP, UDP, ICMP, Any. Application: Http:<port>, Https:<port>, Mssql:<port> |
|
| Port | network: destination_ports. Application: onderdeel van protocols |
|
| Opmerkingen |
Waar de bestanden staan¶
De locaties worden ingesteld in <env-folder>/<region>/firewall.auto.tfvars:
firewall_rule_collection_global_file_location = "firewall_rule_configuration" # all regions
firewall_rule_collection_file_location = "weu/firewall_rule_configuration" # this region
firewall_rule_collection_file_filter = "/**/*.json"
ip_group_global_json_file_relative_path = "ip_groups/" # optional, all regions
ip_group_json_file_relative_path = "weu/ip_groups/" # this region
ip_group_json_file_pattern = "/**/*.json"
use_new_fwp_rulecollectiongroup_naming = true
use_multiregion_fwp_rulecollectiongroup_naming = true
use_new_ip_group_naming = true
Paden zijn relatief ten opzichte van de <env-folder> (zie
Hoe relatieve paden in tfvars worden opgelost).
Submappen zijn toegestaan (/**/*.json), bijvoorbeeld weu/firewall_rule_configuration/0.Platform/.
Globale en regionale bestanden (infra/deploy/firewall/locals.tf, alleen wanneer
use_multiregion_fwp_rulecollectiongroup_naming = true):
- Elke regio deployt haar regionale bestanden plus de globale bestanden.
- Een regionaal bestand met dezelfde bestandsnaam als een globaal bestand vervangt het globale bestand in die regio.
Voor IP groups geldt dezelfde samenvoegregel zodra ip_group_global_json_file_relative_path is gezet, ongeacht de waarde van
de naming-flag.
Behoud de mapnamen firewall_rule_configuration en ip_groups. De config-tests vinden regelbestanden en IP groups aan de hand van
deze mapnamen.
JSON van een rule collection group¶
Eén bestand is één rule collection group (RCG). Alle drie de collection-maps moeten aanwezig zijn. Gebruik {} als een map leeg is.
{
"rule_collection_group": {
"name": "App1",
"priority": 400,
"nat_rule_collections": {},
"network_rule_collections": {
"App1-Network": {
"priority": 410,
"action": "Allow",
"rules": {
"Allow-App1-to-Sql": {
"protocols": ["TCP"],
"source_addresses": [],
"source_ip_groups": ["ipgrp-app1"],
"destination_addresses": [],
"destination_ip_groups": ["ipgrp-sql-servers"],
"destination_fqdns": [],
"destination_ports": ["1433"]
}
}
}
},
"application_rule_collections": {
"App1-Application": {
"priority": 420,
"action": "Allow",
"rules": {
"Allow-App1-to-Vendor-Api": {
"protocols": ["Https:443"],
"source_addresses": [],
"source_ip_groups": ["ipgrp-app1"],
"destination_fqdns": ["api.vendor.example"],
"destination_fqdn_tags": []
}
}
}
}
}
}
Elke sleutel in het voorbeeld is verplicht, ook als het een lege array is. De Terraform-module leest elke sleutel rechtstreeks
(infra/modules/rule_collection_group/main.tf). Het schema is src/Xebia.Mcp/Files/json/firewallschema.json.
| Niveau | Veld | Regels |
|---|---|---|
| RCG | name |
Uniek over alle bestanden die naar de regio worden gedeployed (globaal + regionaal). Het is de Azure-naam en de Terraform-sleutel. |
| RCG | priority |
100–65000 (Azure), en uniek per firewall_rule_configuration-map (config-test). Houd ze ook uniek tussen de globale en regionale set. Gebruik 8999 niet: het platform maakt RCG rcg-platform-agent-… met die priority aan wanneer deployment_agents_private_network_range is gezet. |
| Collection | map key | De naam van de collection. Patroon ^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9_]$. |
| Collection | priority |
Binnen één RCG geldt: laagste NAT-priority < laagste network-priority < laagste application-priority (config-test). |
| Collection | action |
Network/application: Allow of Deny. NAT: Dnat. |
| Rule | map key | De naam van de regel, zelfde patroon. |
| Network rule | protocols, source_addresses, source_ip_groups, destination_addresses, destination_ip_groups, destination_fqdns, destination_ports |
Eén brontype en één doeltype per regel. |
| Application rule | protocols, source_addresses, source_ip_groups, destination_fqdns, destination_fqdn_tags |
Waarden voor destination_fqdn_tags: AppServiceEnvironment, AzureBackup, AzureKubernetesService, HDInsight, MicrosoftActiveProtectionService, WindowsDiagnostics, WindowsUpdate, WindowsVirtualDesktop, Internet. Target-URL's, web categories en TLS inspection worden door de module niet ondersteund. |
| NAT rule | protocols, destination_address, destination_ports, source_addresses, source_ip_groups, translated_address, translated_fqdn, translated_port |
Neem translated_fqdn op (mag null zijn). |
IP group-verwijzingen (source_ip_groups, destination_ip_groups): gebruik de naam van de IP group. Terraform
resolvet ook een volledige Microsoft.Network/ipGroups-resource-ID, maar de config-test van de pipeline accepteert alleen namen die in een
ip_groups-map zijn gedefinieerd, dus een resource-ID laat de run falen. De Terraform check-blokken voor onbekende verwijzingen geven alleen
waarschuwingen, dus de config-test is je echte vangnet.
IP group-JSON¶
{
"ip_group": {
"name": "ipgrp-app1",
"cidrs": ["10.20.4.0/24"]
}
}
namemoet uniek zijn binnen de omgeving. Het is de Azure-naam en de verwijzing die in regels wordt gebruikt.- IP groups worden aangemaakt in de connectivity resource group
rg-<company>-connectivity-<env>-<region>-001.
Het volledige runbook voor IP groups, met naamgeving en validatie, is IP groups.
Application- of network-regel¶
Zegt de aanvraag niet welk type regel je moet gebruiken, beantwoord dan twee vragen:
- Bevat de aanvraag alleen de poorten
80(HTTP) en443(HTTPS), of1433via het protocolMssql? - Is de bestemming een FQDN (of een FQDN tag)?
Zijn beide antwoorden ja, gebruik dan een application rule. Gebruik anders een network rule. De rest van de sectie
Het regeltype en de bestemming kiezen legt de redenen uit. In een application rule heeft protocols
de vorm Http:<port>, Https:<port> of Mssql:<port>.
Globale of regionale regel¶
Een globale regel is actief in elke regio en hub. Een regionale regel alleen in één regio. Beslis op basis van de inhoud:
- DNS-regels moeten overal werken: globaal.
- Een regel tussen twee spokes in één regio: regionaal.
- Als regio's elkaars back-up zijn, houd de regels van beide regio's dan gelijk.
Kun je niet beslissen, vraag het dan aan de eigenaar van het platformontwerp. Een regel in de verkeerde map ontbreekt in een regio of staat open in een regio die hem niet nodig heeft.
Een regel toevoegen¶
- Verzamel de aanvraagvelden. Geef de voorkeur aan IP groups boven letterlijke adressen. Ze zijn herbruikbaar en houden regels leesbaar.
- Maak indien nodig een IP group-bestand aan of vul er een aan in
<region>/ip_groups/(of de globaleip_groups/). - Voeg een regel toe aan een bestaande collection in het RCG-bestand van de eigenaar-workload, of maak een nieuw RCG-bestand aan met een ongebruikte priority. Bij verkeer tussen twee workloads is de eigenaar de bestemmingsworkload (wie vraagt welke regel aan).
- Voer dezelfde wijziging door in de map van elke platformomgeving die haar moet krijgen (
canaryenprodzijn aparte mappen), en pas haar eerst toe op canary. - Valideer lokaal (
pwsh ./dev/dev.ps1 -Action TestmetMCP_CONFIGwijzend naar jemcp.json, zie De tests lokaal draaien) en open daarna een pull request. - Draai
hub. Alleen de firewall-layer mag wijzigingen tonen:azurerm_firewall_policy_rule_collection_groupen/ofazurerm_ip_grouptoegevoegd of bijgewerkt. - Pas toe. De firewall-layer wordt toegepast met
-parallelism=1(ADR-0009), dus grote wijzigingen duren enkele minuten. Houd elke pull request beperkt tot één rule collection group, zodat een wijziging klein genoeg blijft om toe te passen en terug te draaien (zie Als een grote wijziging een time-out krijgt).
Een bestaande regel wijzigen of verwijderen¶
- Wijzigen: pas de regel in place aan. De RCG wordt in place bijgewerkt. Azure vervangt de volledige regelset in één bewerking.
- Een regel verwijderen: verwijder de regelsleutel uit de
rules-map. - Een hele RCG verwijderen: verwijder het bestand. Het plan toont dat de RCG wordt vernietigd (destroyed).
- Een RCG hernoemen (
name): dit is een destroy + create, omdat de naam de Terraform-sleutel is. Even zijn er geen regels van die groep actief.
DNAT-regels voor inkomend verkeer¶
Met een DNAT-regel kan een client van internet een private bestemming bereiken via een publiek IP-adres van de firewall. De firewall vertaalt het bestemmingsadres en de poort. Gebruik dit alleen voor specifieke gevallen en met een korte lijst bronadressen. Een typisch geval is een externe partij die bestanden via SFTP moet uploaden naar een storage account dat alleen een private endpoint heeft (zie de afnemerspagina Inbound SFTP naar een storage account).
Het patroon is:
client -> <firewall public IP> : <custom port> -> DNAT -> <storage account FQDN> : 22
Zet de DNAT-collection in de nat_rule_collections-map van een RCG. De action is Dnat.
{
"rule_collection_group": {
"name": "sftp-inbound",
"priority": 200,
"nat_rule_collections": {
"AllowSftpNatToStorage": {
"priority": 110,
"action": "Dnat",
"rules": {
"AllowSftpNatToApp1Prd": {
"protocols": ["TCP"],
"source_addresses": ["203.0.113.10"],
"source_ip_groups": [],
"destination_address": "<firewall public IP>",
"destination_ports": ["<custom port>"],
"translated_address": null,
"translated_port": "22",
"translated_fqdn": "<storage account>.blob.core.windows.net"
}
}
}
},
"network_rule_collections": {},
"application_rule_collections": {}
}
}
source_addressesofsource_ip_groups: de externe partij die de sessie start. Gebruik vaste, specifieke adressen.destination_address: het publieke IP-adres van de firewall waarmee de partij verbindt. Elke regio heeft een eigen firewall en een eigen publiek IP-adres, dus kies de regio en gebruik dat adres.destination_ports: een unieke custom poort voor deze bestemming, nooit22. Houd een register van toegewezen poorten bij, zodat twee storage accounts nooit dezelfde poort krijgen.translated_fqdnentranslated_port: de FQDN van de private endpoint en de poort waarnaar de firewall doorstuurt.translated_addressisnullals je de FQDN gebruikt.
Voeg de regel toe in elke omgevingsmap die haar moet hebben, en laat haar reviewen door security. De regel staat open naar
internet, dus stel ook een reviewdatum in en verwijder haar als de uitwisseling stopt. De firewall-logs tonen DNAT-matches in
AZFWNatRule.
Controleren¶
- Azure portal → Firewall Policies →
afwp-<company>-connectivity-<env>-<region>-001→ Rule collections: de RCG, collection en regel zijn aanwezig. - Test de flow vanaf de bron, bijvoorbeeld met
Test-NetConnection <dest> -Port <port>ofcurl. - Firewall-logs: bevraag de Log Analytics workspace op
AZFWNetworkRule/AZFWApplicationRule-records die overeenkomen met de bron en bestemming. Hiervoor moeten firewall diagnostics naar Log Analytics zijn ingeschakeld. De logtabellen staan in De firewall-logs lezen.
Rollback¶
Draai de pull request terug en draai hub opnieuw.
Veelvoorkomende problemen¶
| Symptoom | Oorzaak |
|---|---|
Config-test Referenced IP Group '<x>' should exist |
Verkeerde naam, een resource-ID in plaats van een naam, of het IP group-bestand staat niet in een map met de naam ip_groups. |
Config-test Priority <n> already used |
Twee RCG-bestanden in dezelfde map gebruiken dezelfde priority. |
Config-test Only one source type allowed per rule |
Zowel source_addresses als source_ip_groups zijn gevuld. |
| Het plan wil alle RCG's vernietigen (destroy) | Verkeerde firewall_rule_collection_file_location, of de naming-flags zijn gewijzigd. Stop en herstel het pad. |
409 AnotherOperationInProgress |
Parallelle updates op de firewall policy. Draai opnieuw. De layer past al toe met -parallelism=1. |
| Apply faalt omdat een rule collection group al bestaat | Een eerdere run is afgebroken (bijvoorbeeld door een time-out) nadat Azure de groep had aangemaakt maar voordat de state was opgeslagen. Importeer de bestaande groep in de state. Vernietig haar niet in productie. Zie Als een grote wijziging een time-out krijgt. |
| Een IP group kan niet worden hernoemd of verwijderd | Een regel verwijst er nog naar. Verwijder of verplaats eerst de verwijzingen en deploy, en wijzig de groep daarna in een tweede pull request. |
| De regel is gedeployd maar het verkeer faalt nog steeds | Zie Als het verkeer nog steeds faalt. |
Als het verkeer nog steeds faalt¶
Controleer dit, in deze volgorde:
- Priorities. Een collection of RCG met een lager nummer wordt als eerste verwerkt. De deployment weigert normaal gesproken botsende priorities, maar controleer het toch.
- Overlappende regels. De eerste match beslist en geen latere regel wordt nog beoordeeld. Een network rule die poort 443 naar een FQDN weigert, wint van een application rule die HTTPS naar dezelfde FQDN toestaat als hij eerst wordt verwerkt: binnen dezelfde groep komen network rules vóór application rules, en een groep met een lager prioriteitsnummer komt vóór andere groepen.
- IP-adres in plaats van FQDN. Gebruik voor internetbestemmingen (updates, API's van leveranciers, applicaties van derden) FQDN's. Het adres van een dienst van een derde kan veranderen, en dan matcht de regel ongemerkt niet meer.
- Andere lagen. Network security groups, application security groups en instellingen op de netwerkinterface filteren ook verkeer. Controleer de NSG van het bron- en doelsubnet en de route table.
- Naamresolutie. FQDN-regels in network rules hebben de DNS proxy van de firewall policy nodig
(
firewall_policy_dns.proxy_enabled). Controleer eerst de naamresolutie (Incident management). - Handmatige regels. Een regel die iemand in de portal heeft aangemaakt, wordt door de volgende deployment overschreven. Wijzig de firewall niet in de portal.