Azure

Infra As Code : scripter les firewall Azure

Nov 23, 2018

Nicolas Bailly

Nous allons voir dans cet article les commandes powershell qui permettent de mettre à jour les firewalls de différentes ressources Azure.
Dans l’optique Infra As Code, il faut pouvoir jouer et rejouer nos scripts de création d’environnement. Ces commandes vous permettront de partir d’un environnement vierge ou bien déjà existant.

Firewall Azure Sql Server

Par défaut, sur Azure Sql Server aucune IP n’est autorisée, vous devez donc obligatoirement passer par ces scripts.

Vous pouvez voir s’il y a déjà des entrées dans le firewall avec la commande suivante :

Get-AzureRmSqlServerFirewallRule -ResourceGroupName $ResourceGroupName -SqlServerName $SqlServerName

Avant d’ajouter de nouvelles entrées nous allons supprimer toutes celles qui existent afin d’avoir un environnement « propre ».

Get-AzureRmSqlServerFirewallRule -ResourceGroupName $ResourceGroupName -SqlServerName $SqlServerName |  `
 ForEach-Object {Remove-AzureRmSqlServerFirewallRule -FirewallRuleName $_.FirewallRuleName -ResourceGroupName $_.ResourceGroupName -ServerName $_.ServerName}

Nous pouvons maintenant ajouter les différentes entrées dans le firewall avec la commande suivante :

New-AzureRmSqlServerFirewallRule -ResourceGroupName $ResourceGroupName -SqlServerName $SqlServerName -FirewallRuleName "Ma règle Firewall" -StartIpAddress "x.x.x.x" -EndIpAddress "x.x.x.x"

Si vous voulez permettre aux ressources azure d’accéder à votre Azure Server Sql, vous devez ajouter une entrée Firewall sur l’IP 0.0.0.0 comme ceci :

New-AzureRmSqlServerFirewallRule -ResourceGroupName $ResourceGroupName -SqlServerName $SqlServerName -FirewallRuleName "AllowAllWindowsAzureIps" -StartIpAddress "0.0.0.0" -EndIpAddress "0.0.0.0"

Firewall Data Lake Store

Nous allons maintenant faire de même sur une ressource Data Lake Store

Pour voir les règles firewall existantes :

Get-AdlStoreFirewallRule -Account $AdlsName

Comme précédemment, nous allons dans un premier temps supprimer toutes les entrées existantes dans le firewall :

Get-AdlStoreFirewallRule -Account $AdlsName | ForEach-Object {Remove-AdlStoreFirewallRule -Account $AdlsName -Name $_.Name}

Puis nous ajoutons les entrées avec la commande suivante :

Add-AdlStoreFirewallRule -Account $AdlsName -Name "Ma règle Firewall" -StartIpAddress "x.x.x.x" -EndIpAddress "x.x.x.x"

Firewall App Service

On peut vouloir ajouter un firewall sur un App Service si on veut restreindre son accès à seulement certaines IP. Le problème, c’est qu’il n’existe pas de commande pour le faire comme nous l’avons fait précédemment sur Azure Sql Server ou sur Data Lake Store. Nous allons donc nous créer nos propres fonctions qui permettent de supprimer les entrées existantes et d’en ajouter de nouvelles.

Voici la fonction qui permet de supprimer les entrées existantes :

function Remove-WebAppIPRestrictions {
    Param(
        [Parameter(Mandatory=$true)] 
        $WebApp,
        [Parameter(Mandatory=$true)] 
        $ResourceGroupName
          
    )
 
    $APIVersion = ((Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Web).ResourceTypes | Where-Object ResourceTypeName -eq sites).ApiVersions[0]
    $WebAppConfig = (Get-AzureRmResource -ResourceType Microsoft.Web/sites/config -ResourceName $WebApp -ResourceGroupName $ResourceGroupName -ApiVersion $APIVersion)
    $IpSecurityRestrictions = $WebAppConfig.Properties.ipsecurityrestrictions
 
    $WebAppConfig.properties.ipSecurityRestrictions = @()
    Set-AzureRmResource -ResourceGroupName  $ResourceGroupName -ResourceType Microsoft.Web/sites/config -ResourceName "$WebApp/web" -ApiVersion $APIVersion -PropertyObject $WebAppConfig.properties -Force
}

Cette fonction récupère la config d’une web app et met à jour le tableau $WebAppConfig.Properties.ipsecurityrestrictions. C’est ce tableau qui contient l’ensemble des IP whitelistées, nous le remplaçons donc par un tableau vide.

Nous pouvons maintenant appeler cette fonction de la manière suivante :

Remove-WebAppIPRestrictions -WebApp $WebAppName -ResourceGroupName $ResourceGroupName

Et voici la fonction qui va nous pemettre d’ajouter une entrée dans le firewall d’une Web App :

function Set-WebAppIPRestrictions {
    Param(
        [Parameter(Mandatory=$true)] 
        $WebApp,
        [Parameter(Mandatory=$true)] 
        $ResourceGroupName,
        [Parameter(Mandatory=$true)] 
        $IPAddress,
        [Parameter(Mandatory=$true)] 
        $Name,
        [Parameter(Mandatory=$true)] 
        $Priority 
    )
 
    $APIVersion = ((Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Web).ResourceTypes | Where-Object ResourceTypeName -eq sites).ApiVersions[0]
    $WebAppConfig = (Get-AzureRmResource -ResourceType Microsoft.Web/sites/config -ResourceName $WebApp -ResourceGroupName $ResourceGroupName -ApiVersion $APIVersion)
    $IpSecurityRestrictions = $WebAppConfig.Properties.ipsecurityrestrictions
 
    if ($ipAddress -in $IpSecurityRestrictions.ipAddress) {
        Write-Host "IP address $IPAddress is already added as restricted to $WebApp."         
    }
    else {
        $webIP = [PSCustomObject]@{ipAddress = $IPAddress;action='Allow';tag='Default';priority=$Priority;name=$Name}
        if($IpSecurityRestrictions -eq $null){
            $IpSecurityRestrictions = @()
        }
 
        [System.Collections.ArrayList]$ArrayList = $IpSecurityRestrictions
        $ArrayList.Add($webIP) | Out-Null
 
        $WebAppConfig.properties.ipSecurityRestrictions = $ArrayList
        Set-AzureRmResource -ResourceGroupName  $ResourceGroupName -ResourceType Microsoft.Web/sites/config -ResourceName "$WebApp/web" -ApiVersion $APIVersion -PropertyObject $WebAppConfig.properties -Force  | Out-Null
    }
}

Cette fonction est assez similaire à la fonction Remove-WebAppIPRestrictions. Elle met à jour le tableau $WebAppConfig.Properties.ipsecurityrestrictions mais là on ajoute une entrée.
Attention, cette fonction Whiteliste des IP. Vous pouvez voir le paramètre action=’Allow’. Il est tout à fait possible de vous faire une autre fonction avec le paramètre action=’Deny’ pour Blacklister des IP.

Nous pouvons maintenant appeler cette fonction comme ceci :

Set-WebAppIPRestrictions -WebApp $WebAppName -ResourceGroupName $ResourceGroupName -IPAddress "X.X.X.X/32" -name "Ma règle Firewall" -priority 100

Contrairement à Azure Sql Server ou Data Lake Store, il ne faut pas fournir un « Range » d’IP mais un CIDR ainsi qu’une priorité.

Conclusion

En scriptant les règles de firewall, vous vous assurez de pouvoir re-créer vos environnements à sécurité équivalente. Vos scripts peuvent ainsi être déposés sur un gestionnaire de code qui permet de suivre son historique.

0 commentaires

Soumettre un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Découvrez nos autres articles

Aller au contenu principal