Suite au billet Brute Force RDP sur Windows 2016: Bloquer les attaques je refais une mise à jour pour Windows 2019.
En effet dans Windows 2019 il y a un nouvel évènement loggé dans le journal RDS Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational
C’est plus particulièrement l’event ID 140 qui nous intéresse:
Cet évènement nous remonte l’adress IP du client qui a eu un échec de connexion.
J’ai donc remis a jour le script avec la meme base de donnée que pour Windows 2016 (Je rappelle qu’il est recommandé d’implémenter une passerelle RDS bien plus sécurisée que l’exposition directe du port RDP):
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
Import-Module PSSQLite ################## DEFINITIONS ################################### $regex = [regex] "\d+\.\d+\.\d+\.\d+" $logfile = "D:\Firewall\blocked.log" (Get-Date).ToString() + ' Start Script' >> $logfile $Database = "D:\Firewall\IPTable.SQLite" $MaxFailedLogon = 3 # NB d'echec d'authentification MAX $Unban = 24 # 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" ################## DETECTION DE L'EVENT 140 ################################### $DT = [DateTime]::Now.AddSeconds(-120) (Get-Date).ToString() + ' requete Event ' + ($DT).ToString() >> $logfile $af = Get-WinEvent -FilterHashTable @{ LogName = "Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational"; ID = 140 ; StartTime = $DT } -MaxEvents 1 | select-string -inputobject { $_.message } -Pattern $regex | % { $_.Matches } | Select-Object @{n = 'ClientIP'; e = { $_.Value } } $getip = $af | group-object -property ClientIP | Select-Object -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))) } # Suppression des lignes ayant une IP nulle Invoke-SqliteQuery -DataSource $Database -Query "DELETE FROM IP WHERE ip is null" $fw = New-Object -ComObject hnetcfg.fwpolicy2 $BlackListRule = $fw.rules | where { $_.name -eq 'MY BLACKLIST' } $IPValue = $getip | where { $_.Name.Length -gt 1 } #Ajout des IPs dans Sqlite if (($IPValue.name).Length -gt 1) { (Get-Date).ToString() + ' Ajout IP Base ' + $IPValue.name >> $logfile Invoke-SqliteQuery -DataSource $Database -Query $query_insert -SqlParameters @{ IP = $IPValue.name TS = (get-date) } } ################## OPERATIONS dans FIREWALL ################################### $fw = New-Object -ComObject hnetcfg.fwpolicy2 $BlackListRule = $fw.rules | Where-Object { $_.name -eq 'GW BLACKLIST' } #Construction de la nouvelle liste d'ip blacklistées 'Liste ip séparateur virgules) $ListeIP = "" (Get-Date).ToString() + ' Construction de la Blacklist IP' >> $logfile $collectionIP = Invoke-SqliteQuery -DataSource $Database -Query $query_MaxFailed -SqlParameters @{MAXFAILED = $MaxFailedLogon } foreach ($IP in $collectionIP) { if ($ListeIP.Length -gt 0) { $ListeIP = $ListeIP += ',' + $IP.IP } else { $ListeIP = $IP.IP } } if ($ListeIP.length -gt 1) { # Anti lockout $ListeIP = $ListeIP += ',127.0.0.1' $BlackListRule.RemoteAddresses = $ListeIP $ListeIP | % { (Get-Date).ToString() + ' Ajout de IP Firewall ' + $IPValue.name >> $logfile } } # modification de la règle FW Exit |
MERCI !!