सवाल असफल लॉगिन प्रयासों की एक्स संख्या के आधार पर आईपी पता प्रतिबंधित करें?


विंडोज सर्वर पर असफल लॉगिन प्रयासों की एक्स संख्या के बाद आईपी एड्रेस को प्रतिबंधित करना संभव है? किसी विशेष खाते के लिए नहीं, जो मुझे पता है कि कैसे करना है, लेकिन पूरी मशीन पर।

हम उपयोगकर्ता नामों का अनुमान लगाने की कोशिश कर रहे ब्रूट फोर्स हमलों से बहुत कठिन हिट करते हैं, इसलिए यह वास्तव में सर्वर से कुछ लोड प्राप्त करने में मदद करेगा।


45
2018-02-09 11:21


मूल


* निक्स में fial2ban है ... सुनिश्चित नहीं है कि एक विंडोज समकक्ष / बंदरगाह है। fail2ban.org/wiki/index.php/Main_Page - Chris Nava
इवान एंडरसन से: serverfault.com/questions/43360/... ... fail2ban की कार्यक्षमता का एक अच्छा समकक्ष दिखता है लेकिन जैसा कि आपका प्रश्न पर्याप्त विशिष्ट नहीं है, मुझे नहीं पता कि आप होस्ट किए गए वेबसाइट पर लॉगिन करने का प्रयास कर रहे आईपी को प्रतिबंधित कर रहे हैं, आपका सर्वर (एसएसएच के माध्यम से) या आपका डोमेन। स्पष्टीकरण एक लंबा रास्ता तय करेगा। इसके अतिरिक्त आप अपने फ़ायरवॉल पर सीमा को रेट कर सकते हैं, लेकिन यह कार्यान्वयन-निर्भर है। - kce
आप एक नज़र रखना चाहते हो सकता है serverfault.com/questions/216995/... पिछली चर्चा के लिए आईपी पर आधारित स्वचालित प्रतिबंध कितना उपयोगी है। - pehrs
यदि आप टर्मिनल सर्विसेज / रिमोट डेस्कटॉप के बारे में बात कर रहे हैं तो यहां एक नज़र डालें: serverfault.com/a/335976/7200 - Evan Anderson
मैंने गिटूब पर एक विंडोज़ सेवा करने के लिए बस इतना किया: github.com/jjxtra/Windows-IP-Ban-Service - jjxtra


जवाब:


आप इसे पावरहेल और टास्क मैनेजर के साथ कर सकते हैं। यह शायद सही समाधान नहीं है, लेकिन यह काफी अच्छी तरह से काम करता है और मेरे पास दो महीने में लगभग 100 अवरुद्ध आईपी पते हैं। मैंने स्क्रिप्ट लिखी, जो EventLog निर्दिष्ट घटनाओं ("ऑडिट विफलता") से चुनें। यदि किसी भी आईपी पते से कई असफल लॉग इन हैं, तो इसे "ब्लॉकएटैकर्स" नामक फ़ायरवॉल नियम (मैन्युअल रूप से बनाया गया) में जोड़ा गया है जो निर्दिष्ट आईपी पते पर किसी भी ट्रैफिक को अवरुद्ध करता है।

पीएस 1 स्क्रिप्ट:

$DT = [DateTime]::Now.AddDays(-1) # check only last 24 hours

$l = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DT | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} } # select Ip addresses that has audit failure 
$g = $l | group-object -property IpAddress  | where {$_.Count -gt 20} | Select -property Name # get ip adresses, that have more than 20 wrong logins

$fw = New-Object -ComObject hnetcfg.fwpolicy2 # get firewall object

$ar = $fw.rules | where {$_.name -eq 'BlockAttackers'} # get firewall rule named 'BlockAttackers' (must be created manually)

$arRemote = $ar.RemoteAddresses -split(',') #split the existing IPs into an array so we can easily search for existing IPs

$w = $g | where {$_.Name.Length -gt 1 -and  !($arRemote -contains $_.Name + '/255.255.255.255') } # get ip addresses that are not already in firewal rule. Include the subnet mask which is automatically added to the firewall remote IP declaration.

$w| %{$ar.remoteaddresses += ',' + $_.Name} # add IPs to firewall rule

शेड्यूलर में कार्य बनाएं और ईवेंट 4625 (टर्मिनल सेवाओं सहित विंडोज़ लॉगिन) पर ट्रिगर सेट करें। लेकिन आप ट्रिगर सेट करने के लिए सेट कर सकते हैं उदा। अनावश्यक लोडिंग सर्वर से बचने के लिए प्रति घंटे दो बार।

Scheduler trigger

और ट्रिगर चलाने के बाद powerhell स्क्रिप्ट। आपको इस स्क्रिप्ट को चलाने के लिए उच्च विशेषाधिकार भी सेट करना होगा, अन्यथा यह सुरक्षा अपवाद के साथ विफल हो जाएगा।

runing powershell script

आप इस स्क्रिप्ट को अन्य सुरक्षा घटनाओं में भी बांध सकते हैं।


27
2018-06-11 15:27



उत्कृष्ट लिपि @remunda - धन्यवाद! मुझे एफ़टीपी से 4625 से भी बहुत कुछ मिल रहा था, जिसके लिए सुरक्षा लॉग में आईपी पते नहीं हैं, इसलिए मैंने आपकी स्क्रिप्ट पर विस्तार किया ताकि वह वर्तमान दिन के एफ़टीपी लॉग को भी देख सके। अधिक जानकारी के लिए कृपया मेरा उत्तर नीचे देखें: serverfault.com/a/571903/107701 - kevinmicke
इवेंट लॉग, आईपी एड्रेस लॉगिंग इत्यादि के साथ बहुत सारे गॉथ और एज केस हैं जिन्हें मैंने आईपीबीएन - फ्री और ओपन सोर्स में संभाला है github.com/jjxtra/Windows-IP-Ban-Service - jjxtra


मुझे पता है कि यह सवाल पुराना है, लेकिन वास्तव में यह पहला फोरम पोस्ट था जब मैंने कुछ हफ्ते पहले यह वही काम करने की कोशिश शुरू की थी। मैं एक वर्किंग स्क्रिप्ट के साथ आने में कामयाब रहा हूं जो 24 घंटे पहले केवल खराब लॉगिन इवेंट लॉग प्रविष्टियों के लिए इवेंट लॉग का विश्लेषण करेगा, उन 10 को पकड़ें जिनमें 10 से अधिक खराब लॉग इन हैं, और फिर उन्हें आईपीसीईसी फ़िल्टर सूची में डाल दें नेट्स कमांड तब मैंने इस लाइन के साथ एक बैच फ़ाइल लिखी powershell .\*scriptname.ps1* और प्रत्येक 24 घंटों में बैच फ़ाइल चलाने के लिए एक निर्धारित कार्य बनाया (किसी कारण से यह सीधे निष्पादित नहीं होगा)।

$DATE = [DateTime]::Now.AddDays(-1)

$EVS = Get-EventLog Security -InstanceId 529 -after $DATE

$EVS | select-string -inputobject {$_.message} -pattern "Source Network Address:(.)*\.*\.*\.*"  -allmatches | foreach-object {$_.Matches} | foreach-object {$_.Value} | foreach-object {$_.replace("Source Network Address:", "")} | group-object -property $_ | where-object {$_.count -gt 10} | select-object -property name | format-list | out-file c:\rdpblock.txt 

get-content -path c:\rdpblock.txt | foreach-object {$_.replace("Name :", "")} | out-file c:\rdpblockcleaned.txt 

get-content -path c:\rdpblockcleaned.txt | select-object -unique | out-file c:\rdpblocknospaces.txt

$RDPIP = get-content -path c:\rdpblocknospaces.txt | select-object -skip 1

$RDPIP | foreach-object {$_.replace("     ", "")} | foreach-object {netsh ipsec static add filter filterlist=RDP_BLOCK srcaddr=$($_) dstaddr=any}

मुझे पता है कि यह स्क्रिप्ट शायद अक्षम है लेकिन जब मैंने इस पर काम करना शुरू किया तो मुझे शक्तियों में बिल्कुल कोई अनुभव नहीं था, इसलिए स्क्रिप्ट को अनुकूलित करने की मेरी क्षमता वांछित होने के लिए बहुत कुछ छोड़ देती है। हालांकि, इस तथ्य के बावजूद मैंने सोचा कि मैं इसे किसी भी व्यक्ति के साथ साझा करूंगा जो इसका उपयोग कर सकता है।

मैं मुझे प्रारंभिक विचार देने के लिए रिमुंडा का धन्यवाद करता हूं, कि पोस्टर वह है जिसने मुझे इवेंट लॉग खोजने के लिए पावरहेल का उपयोग करने के विचार पर बदल दिया।


7
2017-12-04 22:09





यह स्क्रिप्ट रिमांडा के जवाब पर बनाता है और थोड़ा आगे जाता है https://serverfault.com/a/397637/155102 यह "BlockAttackers" नियम के लिए खाता है, अभी तक कोई भी आईपी दर्ज नहीं है (जो स्ट्रिंग के रूप में "*" देता है)। यह एक लॉग फ़ाइल को एक टिप्पणी भी लिखता है ताकि आपको यह पता चल सके कि आईपी को नियम में कब जोड़ा गया था।

एक अच्छी युक्ति है "ब्लॉकएटकर्स" नियम बनाना जो आईपी पते को अवरुद्ध करता है लेकिन इसे पहले अक्षम कर देता है। फिर, मैन्युअल रूप से एक बार इस स्क्रिप्ट को चलाएं ताकि यह वास्तविक आईपी पते वाले "रिमोट एड्रेस" फ़ील्ड को अवरुद्ध कर सके जिसे अवरुद्ध किया जाना चाहिए। यह सुनिश्चित करने के लिए उन आईपी पतों पर नज़र डालें कि कुछ भी महत्वपूर्ण नहीं जोड़ा गया है और फिर फ़ायरवॉल नियम को सक्षम करें। इस नियम को आपके फ़ायरवॉल में वर्णित रिमांडा के रूप में जोड़ें।

इस लिपि के लिए गिट

#Checks for IP addresses that used incorrect password more than 10 times
#within 24 hours and blocks them using a firewall rule 'BlockAttackers'

#Check only last 24 hours
$DT = [DateTime]::Now.AddHours(-24)

#Select Ip addresses that has audit failure
$l = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DT | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} }

#Get ip adresses, that have more than 10 wrong logins
$g = $l | group-object -property IpAddress | where {$_.Count -gt 10} | Select -property Name

#Get firewall object
$fw = New-Object -ComObject hnetcfg.fwpolicy2

#Get firewall rule named 'BlockAttackers' (must be created manually)
$ar = $fw.rules | where {$_.name -eq 'BlockAttackers'}

#Split the existing IPs into an array so we can search it for existing IPs
$arRemote = $ar.RemoteAddresses -split(',')

#Only collect IPs that aren't already in the firewall rule
$w = $g | where {$_.Name.Length -gt 1 -and !($arRemote -contains $_.Name + '/255.255.255.255') }

#Add the new IPs to firewall rule
$w| %{
  if ($ar.RemoteAddresses -eq '*') {
    $ar.remoteaddresses = $_.Name
  }else{
    $ar.remoteaddresses += ',' + $_.Name
  }
}

#Write to logfile
if ($w.length -gt 1) {
  $w| %{(Get-Date).ToString() + ' ' + $_.Name >> '.\blocked.txt'}
}

4
2018-01-20 20:59





मैं इस जवाब के लिए क्रेडिट नहीं ले सकता, लेकिन https://serverfault.com/users/7200/evan-anderson ने अपनी परियोजना का उल्लेख किया है http://opensource.wellbury.com/projects/windows_sshd_block/newest-release/


3
2018-02-18 18:14





आमतौर पर किसी और को आपके फ़ायरवॉल नियमों को नियंत्रित करने का अच्छा विचार नहीं है। यह मूल रूप से आप यहां क्या पूछ रहे हैं।


2
2018-02-10 22:09



+1, यह सेवा हमले से इनकार करने के लिए स्वयं को स्थापित करने का एक शानदार तरीका है। और यदि आप रेट-लिमिटिंग का उपयोग कर रहे हैं, तो सबसे स्वचालित ब्रूट फोर्स टूल्स स्पेस उनके लॉगिन प्रयासों को पकड़ने से बचने के लिए काफी दूर प्रयास करता है। - kce
विफल लॉग इन की एक निश्चित संख्या के बाद आईपी को स्वचालित रूप से प्रतिबंधित करना है बहुत आम प्रक्रिया। मैं देखता हूं कि एफ़टीपी पासवर्ड अनुमान लगाने के बाद मेजबानों को एक घंटे के आधार पर प्रतिबंधित किया जा रहा है। डीओएस हमला हो सकता है एकमात्र तरीका यह है कि अगर कोई आपके आईपी (टीसीपी कनेक्शन पर असंभव) को खराब करने में कामयाब रहा है, या यदि आप बार-बार अपना पासवर्ड गलत टाइप करते हैं (इस मामले में यह फ़ायरवॉल नियमों को नियंत्रित करने वाला कोई और नहीं है, तो यह आप हैं) - devicenull
क्षमा करें, लेकिन मैंने नहीं पूछा कि यह एक अच्छा विचार था या नहीं। - HeavyWave
निस्संदेह एक या अधिक विशिष्ट आईपी पतों के लिए कोई कारण अपवाद नहीं लगाया जा सकता है, जो डीओएस चिंता को काफी खत्म कर देगा। - John Gardeniers


यह एक पुराना थ्रेड है। मैं 2014-2015 में केविनमिक द्वारा प्रदान की गई स्क्रिप्ट का उपयोग कर रहा था। फिर यह काम करना बंद कर दिया। इसलिए मुझे इसे विंडोज नेटवर्क सुरक्षा प्रमाणीकरण को अपनाने के लिए थोड़ा सा संपादित करना पड़ा जो सुरक्षा लॉग में आईपी पते नहीं छोड़ता है। इसके अलावा, चूंकि मेरे पास नियमित एफ़टीपी नहीं चल रहा है, इसलिए मैंने उस भाग को हटा दिया क्योंकि यह त्रुटियों का कारण बन रहा था क्योंकि कोई लॉग फ़ोल्डर नहीं था। मुख्य परिवर्तन आरडीपी घटनाओं के स्रोत में है।

    $current_date_utc = (Get-Date).ToUniversalTime()

    # Set number of failed login attempts after which an IP address will be blocked
    $int_block_limit = 10

    # Time window during which to check the Security log, which is currently set to check only the last 24 hours
    $dat_time_window = [DateTime]::Now.AddDays(-1)

    $arr_new_bad_ips_all = (get-winevent -filterhashtable @{ logname='Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational'; starttime=$dat_time_window; id=140 }).message |
        % { if ($_ -match "of (.+) failed") { $Matches[1] }} |
        Group-Object |
        Where {$_.Count -ge $int_block_limit} |
        Select -property Name

    # Sort the array, selecting only unique IPs (in case one IP shows up in both the Security and FTP logs)
    $arr_new_bad_ips_all = $arr_new_bad_ips_all | Foreach-Object { [string]$_.Name } | Select-Object -unique

    # Get firewall object
    $firewall = New-Object -comobject hnetcfg.fwpolicy2

    # Get all firewall rules matching "BlockAttackers*"
    $arr_firewall_rules = $firewall.Rules | Where {$_.Name -like 'BlockAttackers*'}

    # If no "BlockAttackers*" firewall rule exists yet, create one and set it to a variable
    if ($arr_firewall_rules -eq $null) {
        $str_new_rule_name = "BlockAttackers (Created " + $current_date_utc.ToString("yyyy-MM-dd HH:mm:ss") + " UTC)"
        netsh advfirewall firewall add rule dir=in action=block name=$str_new_rule_name description="Rule automatically created." enable=yes remoteip="0.0.0.0" | Out-Null
        $arr_firewall_rules = $firewall.Rules | Where {$_.Name -like 'BlockAttackers*'}
    }

    # Split the existing IPs from current "BlockAttackers*" firewall rule(s) into an array so we can easily search them
    $arr_existing_bad_ips = @()
    foreach ($rule in $arr_firewall_rules) {
        $arr_existing_bad_ips += $rule.RemoteAddresses -split(',')
    }

    # Clean subnet masks off of IPs that are currently blocked by the firewall rule(s)
    $arr_existing_bad_ips_without_masks = $arr_existing_bad_ips | ForEach-Object {$_ -replace "/.*", ""}

    # Select IP addresses to add to the firewall, but only ones that...
    $arr_new_bad_ips_for_firewall = $arr_new_bad_ips_all | Where {
        # contain an IP address (i.e. aren't blank or a dash, which the Security log has for systems that failed FTP logins)
        $_.Length -gt 6 -and
        # aren't already in the firewall rule(s)
        !($arr_existing_bad_ips_without_masks -contains $_) -and
        # aren't the local loopback
        !($_.StartsWith('127.0.0.1')) -and
        # aren't part of the local subnet
        !($_.StartsWith('192.168.')) -and
        !($_.StartsWith('0.0.'))
    }

    # If there are IPs to block, do the following...
    if ($arr_new_bad_ips_for_firewall -ne $null) {
        # Write date and time to script-specific log file
        [DateTime]::Now | Out-File -Append -Encoding utf8 C:\Security\blockattackers.txt
        # Write newly-blocked IP addresses to log file
        $arr_new_bad_ips_for_firewall | Out-File -Append -Encoding utf8 C:\Security\blockattackers.txt

        # Boolean to make sure the new IPs are only added on one rule
        $bln_added_to_rule = 0

        # Array to hold bad IPs from each rule one at a time, so we can count to make sure adding the new ones won't exceed 1000 IPs
        $arr_existing_bad_ips_current_rule = @()

        # For each "BlockAttackers*" rule in the firewall, do the following...
        foreach ($rule in $arr_firewall_rules) {
            if ($bln_added_to_rule -ne 1) {
                # Split the existing IPs from the current rule into an array so we can easily count them
                $arr_existing_bad_ips_current_rule = $rule.RemoteAddresses -split(',')

                # If the number of IPs to add is less than 1000 minus the current number of IPs in the rule, add them to this rule
                if ($arr_new_bad_ips_for_firewall.Count -le (1000 - $arr_existing_bad_ips_current_rule.Count)) {
                    # Add new IPs to firewall rule
                    $arr_new_bad_ips_for_firewall | %{$rule.RemoteAddresses += ',' + $_}

                    # Write which rule the IPs were added to to log file
                    echo "New IP addresses above added to Windows Firewall rule:" $rule.Name | Out-File -Append -Encoding utf8 C:\Security\blockattackers.txt

                    # Set boolean so any other rules are skipped when adding IPs
                    $bln_added_to_rule = 1
                }
            }
        }

        # If there wasn't room in any other "BlockAttackers*" firewall rule, create a new one and add the IPs to it
        if ($bln_added_to_rule -ne 1) {
            $str_new_rule_name = "BlockAttackers (Created " + $current_date_utc.ToString("yyyy-MM-dd HH:mm:ss") + " UTC)"
            netsh advfirewall firewall add rule dir=in action=block name=$str_new_rule_name description="Rule automatically created." enable=yes remoteip="0.0.0.0" | Out-Null
            $new_rule = $firewall.rules | Where {$_.Name -eq $str_new_rule_name}

            # Add new IPs to firewall rule
            $arr_new_bad_ips_for_firewall | %{$new_rule.RemoteAddresses += ',' + $_}

            # Write which rule the IPs were added to to log file
            echo "New IP addresses above added to newly created Windows Firewall rule:" $new_rule.Name | Out-File -Append -Encoding utf8 C:\Security\blockattackers.txt
        }
    }

उपर्युक्त स्क्रिप्ट विंडोज 2012 पर काम करेगी। यदि आप अभी भी विंडोज 2008 पर नेटवर्क एक्सेस लेवल प्रमाणीकरण के साथ रिमोट डेस्कटॉप का उपयोग कर रहे हैं तो आपको निम्न चाल करने की आवश्यकता हो सकती है। विंडोज 2008 में सुरक्षा लॉग में आईपी पते नहीं हैं और ऐसा लगता है कि उन्हें माइक्रोसॉफ्ट-विंडोज-रिमोटडिस्कटॉप सर्विसेज-आरडीपी कॉरेट्स लॉग में भी नहीं लगता है। इसलिए मुझे वास्तव में 2 लॉग का उपयोग करना था - सुरक्षा लॉग से मिलान ईवेंट फ़ायरवॉल लॉग में पोर्ट 3389 को सफल पहुंच प्रयासों के लिए। यह एक अनुमान है, लेकिन ऐसा लगता है कि यह पासवर्ड हमलों का पता लगा रहा है। यहां वह हिस्सा है जो आईपी का उल्लंघन करता है:

    $current_date_utc = (Get-Date).ToUniversalTime()

    # Set number of failed login attempts after which an IP address will be blocked
    $int_block_limit = 10

    $dat_time_window = [DateTime]::Now.AddDays(-1)

    $logfn = (netsh advfirewall show allprofiles | Select-String Filename | select-object -unique | % { $_ -replace "%systemroot%",$env:systemroot }).substring(10).trimstart().trimend()

    $badevts = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $dat_time_window | foreach-object { [datetime]$_.TimeWritten } | sort-object

    $fwlog = Select-String -Path $logfn -Pattern "ALLOW TCP" |
        % {
            if ($_ -match "(201.-..-..) (.+) ALLOW TCP (.+) (.+) (.+) 3389") 
            {
                new-object psobject -property @{ 
                  dt = $Matches[1] + ' ' + $Matches[2]
                  ip = $Matches[3]
                }
            }
        }

    $ipa = @()
    $j = 0

    for ($i=0; $i -lt $fwlog.Count; $i++)
    {
        $conn = ([datetime]$fwlog[$i].dt).ticks
        while (($j -lt $badevts.Count) -and (($badevts[$j]).ticks -lt $conn)) { $j++ }
        if ($j -ge $badevts.Count) { break }
        if ((($badevts[$j]).ticks - $conn) -le 30000000) { $ipa += ,($fwlog[$i].ip) }
    }

    $arr_new_bad_ips_all = $ipa |
        Group-Object |
        Where {$_.Count -ge $int_block_limit} |
        Select -property Name

नोट: फ़ायरवॉल लॉग सक्षम करने के लिए मत भूलना। नोट 2: मैं पावरहेल विशेषज्ञ नहीं हूं इसलिए कुछ अच्छा होगा यदि कुछ गुरु मेरे कोड को सही / सुधार सकते हैं।


2
2017-11-15 19:01





मैं उपयोग कर रहा हूँ ts_block freeby।

असल में यह एक "वीबीस्क्रिप्ट प्रोग्राम है जो प्राप्त करने के लिए डब्लूएमआई इवेंट सिंक के रूप में कार्य करता है अवैध टर्मिनल सेवाओं के जवाब में विंडोज द्वारा लॉग इन की गई घटनाएं लॉग ऑन को। "

पूरी तरह से काम करने लगता है, और यदि आपको इसे संशोधित करने की आवश्यकता है तो स्क्रिप्ट सीधा है। आप इसे या तो प्रयासों को लॉग इन कर सकते हैं और फिर अपने अनुमत प्रयासों के आधार पर प्रतिबंध लगा सकते हैं, और / या आप उन लॉगिन नामों को हार्ड-कोड कर सकते हैं जिन्हें आप एक्सेस नहीं देना चाहते हैं।

मैं गलती से दो बार एक ही नाम जोड़कर पकड़ा गया और सेवा केवल 1500 एमएमएस को फिर से शुरू करने के अंतहीन पाश में जाती है, लेकिन यदि आप vbs के साथ ठीक हैं तो ठीक / मोड को ठीक करना बहुत आसान है।

मेरी वर्तमान सेटिंग्स केवल एक ही पुनः प्रयास हैं और आपको 2 दिनों तक प्रतिबंधित कर दिया गया है, जैसे 'व्यवस्थापक' 'व्यवस्थापक' 'प्रशासक' अतिथि 'आदि जैसे लॉग इन स्वचालित रूप से प्रतिबंधित हैं। आईपी ​​में बदलने के लिए सीधा होना चाहिए?

किंडा नशे की लत में जाने और देखने के लिए कि कौन से क्रिटर्स को रात भर प्रतिबंधित कर दिया गया है ...


1
2018-05-01 06:52