Powershell: configurer paramètres firewall via GPO
Dans ce post nous allons étudier comment mettre en place des règles pare-feu via GPO avec Windows 2008 Server. Quand vous intallez un composant Windows les ouvertures nécessaires se font automatiquement, pour certaines applications la configuration firewall ad-hoc est appliquée lors de l’installation. Par contre d’autres nécessitent l’ouverture explicite de certains ports, nous allons voir comment importer ces paramètres dans une GPO via la commande netsh advfirewall.
Tout d’abord cherchez les règles nécessaires au bon fonctionnement de votre application en éditant les règles firewall locales de votre serveur de tests, ces règles auront un préfixe donné ($prefix=LDAP389 dans notre exemple). Nous exportons ces règles dans un ficher wfw avec la commande:
netsh advfirewall export $wfwfile
Nous voulons ensuite importer les règles $prefix=LDAP389 dans une GPO ($GPONAME), ceci afin de les appliquer à un ensemble de serveurs:
Pour importer ces paramètres vous devez utiliser netsh advfirewall puis vous connecter au magasin de données d’objets de stratégie de groupes. Or celui-ci n’est pas directement accessible via la commande “netsh advfirewall set store gpo=domain/gpo_name”:
Ce qui donne en PsH, merci VMdude 🙂
$stream = [System.IO.StreamWriter] $netshinput $stream.WriteLine('advfirewall') $stream.WriteLine('set store gpo=' + $domainfqdn + '\' + $GPONAME) $stream.WriteLine('show store') $stream.WriteLine('import ' + $wfwfile) $stream.WriteLine('exit') $stream.close() get-content $netshinput | netsh |
Via cette commande tous les paramètres d’ouverture firewall sont importés dans la GPO, pas seulement ceux explicitement créés, ce qui peut ralentir l’application de cette dernière. Nous allons grace au cmdlet Remove-GPRegistryValue, effacer les règles dont le préfixe n’est pas $prefix=LDAP389 et donc garder seulement les règles qui nous intéressent.
Avant d’effacer ces paramètres nous devons déterminer sur quel DC ($bindserver) la commande netsh advfirewall les a édités, pour cela il faut déterminer la cible active correspondant au partage SYSVOL:
Pour avoir la valeur de $bindserver:
$dfs = dfsutil cache referral foreach ($dfss in $dfs) {if (($dfss -like '*ACTIVE TARGETSET*') -and ($dfss -like '*sysvol*')) { $bindserver = $dfss.split("\")[1]}} |
Reste donc a rechercher les règles pare-feu qui ne commencent pas par $prefix=LDAP389 et les effacer sur DC $bindserver, ceci afin de s’affranchir des problèmes de réplication:
# Get GPO reg settings for FW rules $gporeg = get-GPRegistryValue -Name $GPONAME -server $bindserver -Key "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules" # Remove FW rules which do not match $prefix* foreach ($gporegs in $gporeg) { if ($gporegs.Value -notlike '*Name=' + $prefix + '*') {Remove-GPRegistryValue -Name $GPONAME -server $bindserver -key "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules" -ValueName $gporegs.ValueName} } |
Pour télécharger le script complet c’est ici:
Vous devez éditer les valeurs:
- $prefix: Péfixe des règles FW éditées manuellement.
- $GPONAME: Nom de la GPO à éditer pour importer les paramètres FW.
This post is also available in: Anglais