Gestion des règles Azure Firewall
Si tout comme moi vous étiez à la recherche d’une solution afin d’automatiser l’ajout de règles au sein d’Azure Firewall vous avez peut être trouvé que la documentation officielle manquait quelque peu d’exemples…
En effet il est assez aisé de créer un Firewall, d’y ajouter une collection de règles mais qu’en est il lorsque l’on souhaite ajouter des règles qu’elles soient de type NAT, Network ou Applicatives à une collection existante ?
Si on se réfère à la doc officielle la création d’une règle se fait via la commande New-AzFirewallApplicationRule
Selon l’exemple son utilisation est assez simple cependant on ne nous dit pas comment ajouter cette règle à une collection existante…
Voyons voir comment s’en sortir seul.
La première chose à faire est de récupérer notre ressource Azure Firewall via la commande Get-Az
1 |
$Fw = Get-AzFirewall -Name "MyFw001" -ResourceGroupName "MyRg001" |
Voyons voir ce qu’ile est possible de faire sur cet objet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$Fw | Get-Member TypeName: Microsoft.Azure.Commands.Network.Models.PSAzureFirewall Name MemberType Definition ---- ---------- ---------- AddApplicationRuleCollection Method void AddApplicationRuleCollection(Microsoft.Azure.Commands.Network.Mode... AddNatRuleCollection Method void AddNatRuleCollection(Microsoft.Azure.Commands.Network.Models.PSAzu... AddNetworkRuleCollection Method void AddNetworkRuleCollection(Microsoft.Azure.Commands.Network.Models.P... Allocate Method void Allocate(Microsoft.Azure.Commands.Network.Models.PSVirtualNetwork ... Deallocate Method void Deallocate() Equals Method bool Equals(System.Object obj) GetApplicationRuleCollectionByName Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallApplicationRuleC... GetApplicationRuleCollectionByPriority Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallApplicationRuleC... GetHashCode Method int GetHashCode() GetNatRuleCollectionByName Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallNatRuleCollectio... GetNatRuleCollectionByPriority Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallNatRuleCollectio... GetNetworkRuleCollectionByName Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallNetworkRuleColle... GetNetworkRuleCollectionByPriority Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallNetworkRuleColle... GetType Method type GetType() RemoveApplicationRuleCollectionByName Method void RemoveApplicationRuleCollectionByName(string ruleCollectionName) RemoveApplicationRuleCollectionByPriority Method void RemoveApplicationRuleCollectionByPriority(uint32 priority) RemoveNatRuleCollectionByName Method void RemoveNatRuleCollectionByName(string ruleCollectionName) RemoveNatRuleCollectionByPriority Method void RemoveNatRuleCollectionByPriority(uint32 priority) RemoveNetworkRuleCollectionByName Method void RemoveNetworkRuleCollectionByName(string ruleCollectionName) RemoveNetworkRuleCollectionByPriority Method void RemoveNetworkRuleCollectionByPriority(uint32 priority) ToString Method string ToString() ApplicationRuleCollections Property System.Collections.Generic.List[Microsoft.Azure.Commands.Network.Models... ApplicationRuleCollectionsText Property string ApplicationRuleCollectionsText {get;} Etag Property string Etag {get;set;} Id Property string Id {get;set;} IpConfigurations Property System.Collections.Generic.List[Microsoft.Azure.Commands.Network.Models... IpConfigurationsText Property string IpConfigurationsText {get;} Location Property string Location {get;set;} Name Property string Name {get;set;} NatRuleCollections Property System.Collections.Generic.List[Microsoft.Azure.Commands.Network.Models... NatRuleCollectionsText Property string NatRuleCollectionsText {get;} NetworkRuleCollections Property System.Collections.Generic.List[Microsoft.Azure.Commands.Network.Models... NetworkRuleCollectionsText Property string NetworkRuleCollectionsText {get;} ProvisioningState Property string ProvisioningState {get;set;} ResourceGroupName Property string ResourceGroupName {get;set;} ResourceGuid Property string ResourceGuid {get;set;} Tag Property hashtable Tag {get;set;} TagsTable Property string TagsTable {get;} Type Property string Type {get;set;} |
On trouve la méthode AddApplicationRuleCollection mais pas de possibilité d’ajouter une règle directement 🙁
On va donc avoir besoin d’aller voir ce qu’on peux faire à partir d’une collection !
Pour cela rien on va donc utiliser la méthode GetApplicationRuleCollectionByName :
1 |
$RulesCollection = $Fw.GetApplicationRuleCollectionByName("MyCollection") |
J’affiche donc son contenu :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
$RulesCollection Name : TEST Priority : 101 Action : { "Type": "Deny" } Rules : [ { "Name": "R1", "Description": null, "SourceAddresses": [ "10.10.10.0/24" ], "TargetFqdns": [ "*aws.com" ], "FqdnTags": [], "Protocols": [ { "ProtocolType": "Http", "Port": 80 }, { "ProtocolType": "Https", "Port": 443 } ] }, { "Name": "R2", "Description": null, "SourceAddresses": [ "192.168.1.0/24" ], "TargetFqdns": [ "*free.fr" ], "FqdnTags": [], "Protocols": [ { "ProtocolType": "Http", "Port": 80 }, { "ProtocolType": "Https", "Port": 443 } ] } |
Je retrouve donc mes règles existantes, cependant que puis je faire à partir d’une collection ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$RulesCollection | Get-Member TypeName: Microsoft.Azure.Commands.Network.Models.PSAzureFirewallApplicationRuleCollection Name MemberType Definition ---- ---------- ---------- AddRule Method void AddRule(Microsoft.Azure.Commands.Network.Models.PSAzureFirewallApplicationRule rule) Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetRuleByName Method Microsoft.Azure.Commands.Network.Models.PSAzureFirewallApplicationRule GetRuleByName(string rule... GetType Method type GetType() RemoveRuleByName Method void RemoveRuleByName(string ruleName) ToString Method string ToString() Action Property Microsoft.Azure.Commands.Network.Models.PSAzureFirewallRCAction Action {get;set;} ActionText Property string ActionText {get;} Etag Property string Etag {get;set;} Id Property string Id {get;set;} Name Property string Name {get;set;} Priority Property uint32 Priority {get;set;} Rules Property System.Collections.Generic.List[Microsoft.Azure.Commands.Network.Models.PSAzureFirewallApplicati... RulesText Property string RulesText {get;} |
Bingo ! AddRule !!!
Je créé donc une règle :
1 |
$NewRule = New-AzFirewallApplicationRule -Name "R3" -Description "This is my new rule ! " -SourceAddress "192.168.0.0/24" -Protocol "http:80","https:443" -TargetFqdn "*denydomain.com" |
Une fois ma nouvelle règle créée, je l’ajoute à ma collection :
1 |
$RulesCollection.AddRule($NewRule) |
Il me suffit ensuite d’appliquer la nouvelle configuration :
1 |
$Fw | Set-AzFirewall |
Une fois la configuration appliquée je récupère à nouveau mon objet Firewall :
1 |
$Fw = Get-AzFirewall -Name "MyFirewall" -ResourceGroupName "MyRg" |
Puis je vérifie la présence de ma nouvelle règle :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$NewRule = $Fw.GetApplicationRuleCollectionByName("TEST") $NewRule.GetRuleByName("R3") Name : R3 Description : "This is my new rule ! " SourceAddresses : [ "192.168.0.0/24" ] TargetFqdns : [ "*denydomain.com" ] FqdnTags : [] Protocols : [ { "ProtocolType": "Http", "Port": 80 }, { "ProtocolType": "Https", "Port": 443 } ] |
Voila vous avez désormais les clés en main pour gérer de manière simple vos règles Azure Firewall !
N’hésitez pas à tester les différentes méthodes.