J’avais déjà écrit un billet à ce sujet concernant Windows 2012 R2. Avec Windows 2016 les choses sont un peu différentes, car l’adresse IP du hacker est présente dans l’évènement système. Donc voici le script mis à jour pour Windows 2016
En prérequis , il faut toujours installer le module PSSQLite SQLite :
1 |
Install-Module -Name PSSQLite |
Ensuite créer la base et la table IP:
1 2 3 4 |
Import-Module PSSQLite $Database = « E:\Firewall\IPTable.SQLite.db » $Query = « CREATE TABLE IP (IP VARCHAR(20),Timestamp DATETIME) » Invoke-SqliteQuery -Query $Query -DataSource $Database |
Puis créér la regle Firewall :
1 |
New-NetFirewallRule -DisplayName "BLACK LIST" -Direction Inbound -LocalPort 3389 -Protocol TCP -RemoteAddress "8.8.8.8" -Action Block |
Et enfin créer le script qui sera déclenché par enlèvement 4625:
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 |
Import-Module PSSQLite $regex = [regex] "\d+\.\d+\.\d+\.\d+" $logfile = "c:\Firewall\blocked.log" (Get-Date).ToString() + ' Start Script' >> $logfile $Database = "c:\Firewall\IPTable.SQLite.db" $MaxFailedLogon = 5 # NB d'echec d'authentification MAX $Unban = 48 # NB d'heure avant débannissement $query_insert = "INSERT INTO IP (IP, Timestamp) VALUES (@IP, @TS)" $query_MaxFailed = "SELECT IP,Timestamp, COUNT(*) FROM IP GROUP BY IP HAVING COUNT(*) > @MAXFAILED" $query_purge = "DELETE FROM IP where TimeStamp < @TS" $DT = [DateTime]::Now.AddSeconds(-120) (Get-Date).ToString() + ' requete Event ' + ($DT).ToString() >> $logfile $af = Get-WinEvent -FilterHashTable @{ LogName = "Security"; ID = 4625 ;StartTime = $DT } -MaxEvents 1 | select-string -inputobject {$_.message} -Pattern $regex |% { $_.Matches } |Select-Object @{n='IpAddress';e={$_.Value} } $getip = $af | group-object -property IpAddress | Select -property Name # Purge des IP bannies (Get-Date).ToString() + ' Purge des IP' >> $logfile Invoke-SqliteQuery -DataSource $Database -Query $query_purge -SqlParameters @{TS = ((get-date).AddHours((-$Unban)))} Invoke-SqliteQuery -DataSource $Database -Query "DELETE FROM IP WHERE ip is null" $fw = New-Object -ComObject hnetcfg.fwpolicy2 $BlackListRule = $fw.rules | where {$_.name -eq 'BLACK LIST'} $IPValue = $getip | where {$_.Name.Length -gt 1 } #Ajout des IPs dans Sqlite (Get-Date).ToString() + ' Ajout IP Base' >> $logfile if (($IPValue.name).Length -gt 1) {Invoke-SqliteQuery -DataSource $Database -Query $query_insert -SqlParameters @{ IP = $IPValue.name TS = (get-date) } } #Mise a jour de la regle FireWall $csv="" (Get-Date).ToString() + ' Construction de la liste IP' >> $logfile $collection = Invoke-SqliteQuery -DataSource $Database -Query $query_MaxFailed -SqlParameters @{MAXFAILED = $MaxFailedLogon} foreach ($item in $collection) { if ($csv.Length -gt 0 ) {$csv= $csv += ',' + $item.IP} else { $csv= $item.IP} } if ($csv.length -gt 1) {$csv= $csv += ',127.0.0.1' # Anti lockout $BlackListRule.RemoteAddresses = $csv $csv| %{(Get-Date).ToString() + ' Ajout de IP Firewall ' + $IPValue.name >> $logfile} } Exit |
Reste a attacher le script a l’événement 4625 ( comme décrit dans le précéent article , et le tour est joué !
Si vou désirez controler le contenu de la base, je vous recommande cet outil : https://sqlitebrowser.org/
Enjoy 🙂
Bonjour
Merci pour le script qui ajoute bien les IP dans la table SQL par contre la règle pare-feu n’est pas mis à jour avec les IP de la table SQL.
Lors d’execution du script aucune erreur.
Comment résoudre pour que la règle pare-feu soit mis à jour.
Merci
Bonsoir,
Je ne m’imaginais pas si exposé 🙂
30000 tentatives en 2 jours… (oui oui vous avez bien lu).
Et presque plus rien après la mise en place du script.
16 @ IP bloquées en quelques minutes.
Merci beaucoup pour votre partage et pour l’efficacité de cette solution.
Bonjour,
Il y a une petite erreur de syntaxe dans la commande de création de la base :
$Database = « E:\Firewall\IPTable.SQLite »
Il manque le « .db ».
Merci pour cet excellent script qui fait régulièrement son job sur mon infra.
@ Jérome C’est corrigé !
Bonsoir,
Le script s’exécute bien et enregistre les ip dans la base de donnée mais j’ai l’impression que la règle dans le pare feux ne s’actualise car j’ai test via mon 4G en faisant une erreur dans le mot de passe et je peux me connecter autant de fois que je veux
Bonsoir,
Normal que l’adresse IP 127.0.0.1 se retrouve dans la blackliste dans le pare feux
Faut regarder sur la règle FW les ip ajoutées…
Oui, sinon si il n’y a aucune IP alors tout le trafic 3389 est bloqué: et faire u rdp sur le 127.0.0.1 n’a aucun interet
Bonjour,
Tout d’abord merci pour votre script qui fonctionne bien sur la plus part de nos serveurs.
J’en ai un qui me pose problème au niveau de la mise à jour de la règle FireWall « Black List » voici le message que powershell me renvoi:
Type [DBNullScrubber] introuvable.
Au caractère C:\Users\Administrateur.WIN-402Q47JKKTP\Documents\WindowsPowerShell\Modules\PSSQLite\Invoke-SqliteQuery.ps1:536 : 25
+ [DBNullScrubber]::DataRowToPSObject($row)
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : (DBNullScrubber:TypeName) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound
Auriez-vous déjà eu le cas?
Cordialement
Bonjour,
Comment peut-on exclure les adresses IP du réseau local de la règle (exemple 192.168.1.x). J’ai plusieurs postes qui génèrent l’ID 4625 alors qu’ils sont connectés en TSE et du coup qui passe dans la règle « BLACK LIST »?
Merci d’avance