แบนที่อยู่ IP ตามจำนวนการพยายามล็อกอินที่ไม่สำเร็จ?


47

เป็นไปได้หรือไม่ที่จะห้ามที่อยู่ IP หลังจากพยายามเข้าสู่ระบบ Windows Server ไม่สำเร็จจำนวน X ไม่ใช่เฉพาะบัญชีซึ่งฉันรู้ว่าต้องทำยังไงกับเครื่องจักรทั้งหมด

เราได้รับผลกระทบอย่างหนักจากการโจมตีอย่างดุเดือดโดยพยายามคาดเดาชื่อผู้ใช้ดังนั้นสิ่งนี้จะช่วยลดภาระของเซิร์ฟเวอร์ได้


8
* ระวังมี fial2ban ... ไม่แน่ใจว่ามีพอร์ตเทียบเท่าของ Windows หรือไม่ fail2ban.org/wiki/index.php/Main_Page
Chris Nava

5
จาก Evan Anderson: serverfault.com/questions/43360/ … ... ดูเหมือนว่าจะเทียบเท่ากับการทำงานของ fail2ban แต่เนื่องจากคำถามของคุณไม่เจาะจงพอฉันไม่รู้ว่าคุณกำลังพยายามห้าม IP ที่พยายามเข้าสู่ระบบหรือไม่ ไปยังเว็บไซต์ที่โฮสต์เซิร์ฟเวอร์ของคุณ (ผ่าน SSH) หรือโดเมนของคุณ ความกระจ่างจะไปไกล นอกจากนี้คุณสามารถให้คะแนนขีด จำกัด ที่ไฟร์วอลล์ของคุณ แต่ขึ้นอยู่กับการใช้งาน

4
คุณอาจต้องการดูserverfault.com/questions/216995/…สำหรับการสนทนาก่อนหน้าเกี่ยวกับวิธีการแบนอัตโนมัติที่มีประโยชน์บนพื้นฐานของ IP
pehrs

1
หากคุณกำลังพูดถึง Terminal Services / Remote Desktop ดูได้ที่นี่: serverfault.com/a/335976/7200
Evan Anderson

3
ฉันทำบริการ windows บน github เพื่อทำสิ่งนั้น: github.com/jjxtra/Windows-IP-Ban-Service
jjxtra

คำตอบ:


28

คุณสามารถทำได้ด้วย powershell และตัวจัดการงาน อาจไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่ใช้งานได้ดีและฉันมีที่อยู่ IP ที่ถูกบล็อกประมาณ 100 รายการในสองเดือน ฉันเขียนสคริปต์ที่เลือกจากเหตุการณ์ที่ระบุของ EventLog ("ความล้มเหลวในการตรวจสอบ") หากมีการเข้าสู่ระบบล้มเหลวจำนวนมากจากที่อยู่ IP ใด ๆ ก็จะถูกเพิ่มในกฎไฟร์วอลล์ (สร้างด้วยตนเอง) ชื่อ "BlockAttackers" ซึ่งจะปิดกั้นการรับส่งข้อมูลไปยังที่อยู่ IP ที่ระบุ

สคริปต์ PS1:

$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 (ลงชื่อเข้าใช้ windows รวมถึงบริการเทอร์มินัล) แต่คุณสามารถตั้งค่าให้ทริกเกอร์ทำงานเช่นสองครั้งต่อชั่วโมงเพื่อหลีกเลี่ยงการโหลดเซิร์ฟเวอร์โดยไม่จำเป็น

ทริกเกอร์กำหนดการ

และหลังจากเรียกใช้สคริปต์ PowerShell คุณต้องตั้งค่าสิทธิ์สูงกว่าเพื่อเรียกใช้สคริปต์นี้มิฉะนั้นจะล้มเหลวด้วยข้อยกเว้นด้านความปลอดภัย

เรียกใช้สคริปต์ PowerShell

คุณสามารถผูกสคริปต์นี้กับเหตุการณ์ความปลอดภัยอื่น ๆ


1
สุดยอดสคริปต์ @remunda - ขอบคุณ! ฉันได้รับ 4625s จำนวนมากจาก FTP เช่นกันซึ่งบันทึกความปลอดภัยไม่มีที่อยู่ IP ดังนั้นฉันจึงขยายสคริปต์ของคุณเพื่อตรวจสอบบันทึก FTP ของวันนี้ด้วย โปรดดูคำตอบของฉันด้านล่างสำหรับข้อมูลเพิ่มเติม: serverfault.com/a/571903/107701
kevinmicke

มีกรณี gotchas และ edge จำนวนมากที่มีบันทึกเหตุการณ์การบันทึกที่อยู่ IP ฯลฯ ที่ฉันจัดการใน IPBan - ฟรีและโอเพนซอร์สที่github.com/jjxtra/Windows-IP-Ban-Service
jjxtra

7

ฉันรู้ว่าคำถามนี้เก่า แต่จริง ๆ แล้วมันเป็นโพสต์ฟอรัมแรกที่ฉันสะดุดเมื่อฉันเริ่มพยายามทำสิ่งเดียวกันนี้เมื่อสองสามสัปดาห์ก่อน ฉันจัดการสคริปต์การทำงานที่จะแยกวิเคราะห์บันทึกเหตุการณ์ 24 ชั่วโมงสำหรับรายการบันทึกเหตุการณ์การเข้าสู่ระบบที่ไม่ดีคว้ารายการที่มีการลงชื่อเข้าใช้ที่ไม่ถูกต้องมากกว่า 10 รายการจากนั้นใส่ลงในรายการตัวกรอง ipsec โดยใช้ คำสั่ง netsh จากนั้นฉันเขียนไฟล์แบตช์ด้วยบรรทัดนี้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}

ฉันรู้ว่าสคริปต์นี้อาจไม่มีประสิทธิภาพ แต่เมื่อฉันเริ่มทำสิ่งนี้ฉันไม่เคยมีประสบการณ์ใน PowerShell ดังนั้นความสามารถในการเพิ่มประสิทธิภาพสคริปต์ของฉันจึงไม่เป็นที่ต้องการมากนัก อย่างไรก็ตามแม้ว่าฉันจะคิดว่าฉันจะแบ่งปันสิ่งนี้กับใครก็ตามที่สามารถใช้มันได้

ฉันขอบคุณ Remunda ที่ให้แนวคิดเริ่มแรกแก่ฉันโปสเตอร์นั้นเป็นสิ่งที่ทำให้ฉันหันไปใช้ความคิดในการใช้ PowerShell เพื่อค้นหาบันทึกเหตุการณ์


4

สคริปต์นี้สร้างขึ้นจากคำตอบของ remunda และไปที่https://serverfault.com/a/397637/155102อีกเล็กน้อยบัญชีสำหรับกฎ "BlockAttackers" ยังไม่ได้ป้อน IP ใด ๆ (ซึ่งจะส่งกลับ "*" เป็นสตริง) นอกจากนี้ยังเขียนความคิดเห็นไปยังล็อกไฟล์เพื่อแจ้งให้คุณทราบเมื่อมีการเพิ่ม IP ในกฎ

เคล็ดลับที่ดีคือการสร้างกฎ "BlockAttackers" ที่ปิดกั้นที่อยู่ IP แต่ปิดการใช้งานในตอนแรก จากนั้นเรียกใช้สคริปต์นี้ครั้งเดียวด้วยตนเองเพื่อให้สามารถเติมฟิลด์ "RemoteAddresses" ด้วยที่อยู่ IP จริงที่ควรถูกบล็อก ตรวจสอบที่อยู่ IP เหล่านั้นเพื่อให้แน่ใจว่าไม่มีการเพิ่มข้อมูลสำคัญใด ๆ จากนั้นเปิดใช้งานกฎไฟร์วอลล์ เพิ่มกฎนี้ในไฟร์วอลล์ของคุณตามที่อธิบายไว้

คอมไพล์สำหรับสคริปต์นี้

#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'}
}


2

โดยทั่วไปแล้วไม่ใช่ความคิดที่ดีที่จะให้คนอื่นควบคุมกฎไฟร์วอลล์ของคุณ นั่นคือสิ่งที่คุณขอที่นี่


1
+1 นี่คือวิธีที่ยอดเยี่ยมในการตั้งค่าตัวคุณเองสำหรับการปฏิเสธการโจมตีบริการ และถ้าคุณใช้การ จำกัด อัตราดอกเบี้ยเครื่องมือเดรัจฉานอัตโนมัติส่วนใหญ่จะพยายามล็อกอินของพวกเขาห่างกันพอที่จะหลีกเลี่ยงการถูกจับได้

12
ห้าม IPs โดยอัตโนมัติหลังจากที่จำนวนหนึ่งของการเข้าสู่ระบบล้มเหลวเป็นอย่างมากการปฏิบัติร่วมกัน ฉันเห็นโฮสต์ถูกแบนทุกชั่วโมงหลังจากพยายามเดารหัสผ่าน FTP เพียงวิธีนี้จะมีการโจมตีแบบ DoS คือถ้ามีคนจัดการเพื่อหลอก IP ของคุณ (เป็นไปไม่ได้ในการเชื่อมต่อ TCP) หรือถ้าคุณซ้ำ ๆ พิมพ์ผิดรหัสผ่านของคุณ (ซึ่งในกรณีนี้ก็ไม่ได้เป็นคนอื่นควบคุมกฎไฟร์วอลล์ก็คุณ)
devicenull

18
ขออภัยฉันไม่ได้ถามว่ามันเป็นความคิดที่ดีหรือไม่
HeavyWave

1
แน่นอนว่าไม่มีเหตุผลที่ไม่สามารถตั้งค่าข้อยกเว้นสำหรับที่อยู่ IP อย่างน้อยหนึ่งรายการซึ่งจะช่วยลดข้อกังวลของ DoS ได้
John Gardeniers

2

นี่คือเธรดเก่า ฉันใช้สคริปต์ที่จัดทำโดย kevinmicke ในปี 2557-2558 จากนั้นมันก็หยุดทำงาน ดังนั้นฉันจึงต้องแก้ไขเล็กน้อยเพื่อปรับใช้กับการรับรองความถูกต้องของ Windows Network Security ที่ไม่ทิ้งที่อยู่ IP ไว้ในบันทึกความปลอดภัย นอกจากนี้เนื่องจากฉันไม่มี FTP ปกติฉันจึงลบส่วนนั้นเนื่องจากทำให้เกิดข้อผิดพลาดเนื่องจากไม่มีโฟลเดอร์บันทึก การเปลี่ยนแปลงหลักอยู่ในแหล่งที่มาของเหตุการณ์ RDP

    $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
        }
    }

สคริปต์ด้านบนจะทำงานบน Windows 2012 หากคุณยังใช้ Remote Desktop กับการตรวจสอบสิทธิ์การเข้าถึงเครือข่ายใน Windows 2008 คุณอาจต้องทำตามเคล็ดลับต่อไปนี้ Windows 2008 ไม่มีที่อยู่ IP ในบันทึกความปลอดภัยและดูเหมือนไม่มีอยู่ในบันทึกของ Microsoft-Windows-RemoteDesktopServices-RdpCoreTS ดังนั้นฉันต้องใช้จริง 2 ล็อก - จับคู่เหตุการณ์จากบันทึกความปลอดภัยเพื่อพยายามเข้าถึงพอร์ต 3389 ในไฟร์วอลล์ได้สำเร็จ นี่เป็นงานที่เดาได้ แต่ดูเหมือนว่าจะตรวจจับการโจมตีด้วยรหัสผ่าน นี่คือส่วนที่รวบรวมการละเมิด IP:

    $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: ฉันไม่ใช่ผู้เชี่ยวชาญ PowerShell ดังนั้นจะดีถ้ากูรูบางคนสามารถแก้ไข / ปรับปรุงรหัสของฉันได้


1

ฉันใช้ts_blockฟรีโดย

โดยทั่วไปมันเป็น "โปรแกรม VBScript ที่ทำหน้าที่เป็นตัวเก็บเหตุการณ์ WMI เพื่อรับเหตุการณ์ที่บันทึกโดย Windows เพื่อตอบสนองต่อการเข้าสู่ระบบบริการเทอร์มินัลที่ไม่ถูกต้อง"

ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์และสคริปต์นั้นตรงไปตรงมาหากคุณต้องการแก้ไข คุณสามารถปล่อยให้มันพยายามเข้าสู่ระบบแล้วแบนขึ้นอยู่กับจำนวนครั้งที่อนุญาตและ / หรือคุณสามารถใช้ชื่อในการเข้าสู่ระบบที่คุณไม่ต้องการให้เข้าถึง

ฉันถูกจับโดยการเพิ่มชื่อเดียวกันสองครั้งโดยไม่ตั้งใจและบริการเพิ่งเข้าสู่วงวนไม่รู้จบที่เริ่มต้นใหม่ทุก ๆ 1500ms แต่การแก้ไข / mod ทำได้ง่ายมากถ้าคุณตกลงกับ vbs

การตั้งค่าปัจจุบันของฉันเป็นการลองใหม่เพียงครั้งเดียวและคุณถูกแบนเป็นเวลา 2 วันด้วยการเข้าสู่ระบบเช่น 'admin' 'Admin' 'ผู้ดูแลระบบ' 'แขก' ฯลฯ จะถูกแบนโดยอัตโนมัติ ควรตรงไปตรงมาเพื่อเปลี่ยนเป็น ip?

ค่อนข้างเสพติดเข้าไปข้างในและดูว่าสัตว์เลื้อยคลานตัวไหนถูกแบนในชั่วข้ามคืน ...


0

คุณหมายถึงการเข้าสู่เซิร์ฟเวอร์ / โดเมนหรือเข้าสู่เว็บไซต์ที่ทำงานบนเซิร์ฟเวอร์หรือไม่ หากคุณหมายถึงการเข้าสู่เซิร์ฟเวอร์ / โดเมนคำตอบคือไม่ Windows ไม่มีแนวคิดในการปิดกั้นที่อยู่ IP โดยขึ้นอยู่กับความพยายามในการเข้าสู่ระบบที่ล้มเหลวเนื่องจากที่อยู่ IP ไม่ใช่หน่วยงานด้านความปลอดภัย อาจมีเครื่องมือของบุคคลที่สามที่สามารถทำสิ่งนี้ได้ แต่ฉันไม่ได้ตระหนักถึงสิ่งใด ๆ


0

หากมีเว็บเซิร์ฟเวอร์ที่จะถูกโจมตีคุณสามารถติดตั้งส่วนขยายแบบไดนามิก จำกัด IP หากนี่คือการรับรองความถูกต้องมาตรฐานไปยังเซิร์ฟเวอร์คุณควรจะสามารถใช้การแยกโดเมนและเซิร์ฟเวอร์ซึ่งจะ จำกัด ขอบเขตของการโจมตีคอมพิวเตอร์ที่เข้าร่วมโดเมนและสามารถตั้งค่าให้อนุญาตความพยายามจากระบบที่คุณจำเป็นต้องเข้าถึงเท่านั้น เซิฟเวอร์. ในหน้าต่างการป้องกันการโจมตีแบบเดรัจฉานบังคับให้ตั้งค่านโยบายการล็อกบัญชีเป็นการตั้งค่าเช่น 10 นาทีและนโยบายรหัสผ่านไม่ถูกต้องเป็น 3 ครั้ง - ซึ่งหมายความว่าบัญชีที่ถูกโจมตีจะล็อคเป็นเวลา 10 นาทีหลังจากพยายาม 3 ครั้ง การเชื่อมต่อ IP จะไม่สามารถล็อคได้โดยค่าเริ่มต้นใน windows (นอกเหนือจากนี้ฉันยังสงสัยว่ามีความพยายามในการเข้าสู่ระบบกี่ครั้งต่อวินาทีเพื่อส่งผลกระทบต่อระบบ)


ในอินสแตนซ์ขนาดเล็ก AWS ของฉัน 1 ครั้งทุก ๆ 4 วินาทีก็เพียงพอที่จะใช้ CPU 50% อึสวยถ้าคุณถามฉัน ...
RomanSt

ว้าวฉันสงสัยว่าทำไมการใช้ประโยชน์ถึงสูงมาก ฉันจะต้องทำการทดสอบบางอย่างเพื่อดูว่าต้องใช้ความพยายามหลายครั้งกับ VMs ของฉันในการลงทะเบียน
Jim B

ฉันคิดว่าเป็นเพราะฉันไม่ได้ใช้การรับรองความถูกต้องระดับเครือข่ายดังนั้นทุกครั้งที่พยายามลงชื่อเข้าใช้จะมีการเข้าสู่ระบบ UI เพื่อนำเสนอต่อผู้โจมตีผ่านทางเซสชันเดสก์ท็อประยะไกล ฉันเห็นว่าทำไมมันถึงแพง
RomanSt

0

http://nerderies.blogspot.co.at/2012/12/automatically-banning-ips-with-windows.html

หากสิ่งที่คุณต้องการคือโซลูชันนอกกรอบ (ติดตั้งแล้วเสร็จ) คุณสามารถหาเครื่องมือฟรีได้ที่นี่และน่าจะอ่านต่อไป

เวอร์ชั่นปัจจุบัน: 1.2 (โปรไฟล์ไคลเอนต์. NET Framework 4.0) -> ดาวน์โหลดเวอร์ชันปัจจุบันของ EvlWatcher (ฟรีสำหรับการใช้ส่วนตัวและเพื่อการพาณิชย์)

ใหม่ใน 1.2 (ข้อมูลเพิ่มเติมในเอกสารประกอบ):

  • คอนโซลการจัดการ
  • รูปแบบการบริการ WCF
  • ขึ้นบัญชีดำ
  • ย้ายไปยังบัญชีดำโดยอัตโนมัติหลังจาก 3 นัด (ต่อค่าเริ่มต้น)

สำหรับเซิร์ฟเวอร์รุ่นเก่า (.NET Framework 2.0)

-> ดาวน์โหลดเวอร์ชั่นที่ลดลงของ EvlWatcher (ฟรีสำหรับการใช้ส่วนตัวและเพื่อการค้า)


0

ใช้remunda 's สคริปต์ที่ดีเป็นจุดเริ่มต้นที่ฉันเพิ่มสิ่งหนึ่งที่สำคัญที่ขาดหายไป: การปิดกั้นที่อยู่ IP ล้มเหลวในการเข้าสู่ระบบ Windows Server จะไม่บันทึกที่อยู่ IP ไปที่บันทึกการรักษาความปลอดภัยเมื่อมีคนไม่สามารถเข้าสู่ระบบผ่าน FTP ได้ แต่จะตั้งค่า "ที่อยู่เครือข่ายต้นทาง" เป็นเส้นประแทน FTP เป็นเวกเตอร์การโจมตีที่พบบ่อยมากสำหรับการโจมตีแบบ brute force ดังนั้นฉันจึงเพิ่มความสามารถในการสแกนบันทึก FTP ของวันปัจจุบันสำหรับความล้มเหลวในการเข้าสู่ระบบหลายครั้งและบล็อกที่อยู่ IP เหล่านั้นด้วย

อัปเดต 2014/02/07:เมื่อฉันทำ tweaks นี้เพื่อประมวลผลบันทึก FTP เก่าทั้งหมดของฉันฉันรู้ว่าเมื่อพวกเขามีความพยายามมากมาย (50,000+), อาร์เรย์ที่สร้างขึ้นจะมีขนาดใหญ่และทำให้การประมวลผลช้าอย่างไม่น่าเชื่อ ฉันได้เขียนมันใหม่เพื่อให้มีประสิทธิภาพมากขึ้นเมื่อประมวลผลบันทึก FTP

ฉันยังพบว่ามีขีด จำกัด ที่ จำกัด โดยพลการของ 1,000 สำหรับจำนวน IP ที่สามารถอยู่ในกฎ Windows Firewall หนึ่งกฎ เนื่องจากข้อ จำกัด นั้นฉันต้องการให้สร้างกฎใหม่โดยอัตโนมัติเมื่อกฎล่าสุดเต็ม ตอนนี้ก็ทำเช่นนั้นและยังสร้างกฎไฟร์วอลล์เริ่มต้น (ถ้าคุณไม่ได้สร้างของคุณเอง) เพื่อให้การตั้งค่าเดียวที่ต้องทำคือการเพิ่มลงใน Scheduler เพื่อทำงานเมื่อมีเหตุการณ์ 4625

นี่คือรหัสที่ได้รับการทดสอบบน Windows Server 2008 R2 และ Windows 7:

# This Windows Powershell script will automatically block IP addresses that attempt to login to the system
# and fail the number of times set below with the $int_block_limit variable or more. Is scans both the Security
# log, which covers Remote Desktop and other attempts, as well as the current day's FTP log. If the $int_block_limit
# limit is hit on either of those logs (separately, not combined), then the IP address will be added to the
# firewall rule.
#
# The script will automatically create a firewall rule named "BlockAttackers (Created yyyy-MM-dd HH:mm:ss UTC)" using
# the current time if one with a name that includes "BlockAttackers" doesn't already exist. Because there's a hard
# limit of 1000 entries (IP addresses) you can block per rule, it will also create similarly-named rules once that
# limit is reached for the latest one.
#
# I recommend setting the script to run as a scheduled task triggered by event 4625 login audit failures from the
# Security log, or alternatively you could set it to run after some amount of time (i.e. every 10 minutes).
#
# Authors:
# Majority of script written by serverfault.com user kevinmicke
# Windows Security Log portion written by serverfault.com user remunda, which provided the starting point for kevinmicke
#
# Details: https://serverfault.com/questions/233222/ban-ip-address-based-on-x-number-of-unsuccessful-login-attempts


# 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)

# Select from the Security log all IP addresses that have more than $int_block_limit audit failures (event 4625) within $dat_time_window
$arr_new_bad_ips_security_log = @()
$arr_new_bad_ips_security_log = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $dat_time_window |
    Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]}} |
    Group-Object -property IpAddress |
    Where {$_.Count -ge $int_block_limit} |
    Select -property Name

# Get current time UTC to figure out filename for current FTP log
$current_date_utc = (Get-Date).ToUniversalTime()

# Set path to today's FTP log file
$str_log_file_name = "C:\inetpub\logs\LogFiles\FTPSVC2\u_ex" + $current_date_utc.ToString("yyMMdd") + ".log"

# Search today's FTP log file for "530 1326" to find lines that contain IPs of systems that failed to log in,
# get just the IP from each line, group the IPs by IP to count the attempts from each one, and select only the
# IPs that have $int_block_limit or more bad logins today
$arr_new_bad_ips_ftp = @()
$arr_new_bad_ips_ftp = Select-String $str_log_file_name -pattern "530 1326" |
    ForEach-Object {$_.Line.Substring(20,15) -replace " .*", ""} |
    Group |
    Where {$_.Count -ge $int_block_limit} |
    Select -property Name

# Concatenate the two arrays of IPs (one from Security log, one from FTP log)
$arr_new_bad_ips_all = @()
# $arr_new_bad_ips_all = @($arr_new_bad_ips_security_log) + @($arr_new_bad_ips_ftp_over_limit)
$arr_new_bad_ips_all = @($arr_new_bad_ips_security_log) + @($arr_new_bad_ips_ftp)

# 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_sorted = @()
$arr_new_bad_ips_all_sorted = $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 by BlockAttackers Powershell script written by Kevin Micke." 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_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_for_firewall = $arr_new_bad_ips_all_sorted | 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('10.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:\blockattackers.txt
    # Write newly-blocked IP addresses to log file
    $arr_new_bad_ips_for_firewall | Out-File -Append -Encoding utf8 C:\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:\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 by BlockAttackers Powershell script written by Kevin Micke." 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:\blockattackers.txt
    }
}

FYI: สำหรับผู้ที่ไม่ได้เรียกใช้สคริปต์ PowerShell ในระบบมาก่อนคุณจะต้องเปิด PowerShell ใหม่และเรียกใช้ก่อนSet-ExecutionPolicy RemoteSignedเพื่อให้คุณสามารถเรียกใช้สคริปต์ในเครื่อง มิฉะนั้นคุณจะได้รับข้อผิดพลาด: "blockattackers.ps1 ไม่สามารถโหลดได้เนื่องจากการทำงานของสคริปต์ถูกปิดใช้งานในระบบนี้"
kevinmicke

0

สคริปต์ของremudaแก้ไขโดยkevinmicke (7 ก.พ. เวลา 21:59 น.) ไม่ได้ตรวจสอบช่องควบคุมของ FTP ซึ่งมีโฟลเดอร์ของตัวเองในระบบของฉัน (Windows Server 2008 R2) นอกจากนี้ยัง530 11001ไม่ได้รับการยอมรับเหตุการณ์ซึ่งดูเหมือนจะปรากฏขึ้นเมื่อแฮกเกอร์พยายามเข้าถึงช่องทางควบคุมเท่านั้น ดังนั้นฉันจึงเพิ่มบางบรรทัดในสคริปต์เพื่อตรวจสอบ FTP-log-folder อันที่สอง:

# สคริปต์ Windows Powershell นี้จะบล็อกที่อยู่ IP ที่พยายามเข้าสู่ระบบโดยอัตโนมัติ
# และล้มเหลวจำนวนครั้งที่ตั้งไว้ด้านล่างด้วยตัวแปร $ int_block_limit หรือมากกว่า สแกนทั้งความปลอดภัย
# log ซึ่งครอบคลุมถึง Remote Desktop และความพยายามอื่น ๆ รวมถึงบันทึก FTP ของวันปัจจุบัน ถ้า $ int_block_limit
# limit ถูกเข้าชมบันทึกเหล่านั้น (แยกกันไม่รวมกัน) จากนั้นที่อยู่ IP จะถูกเพิ่มไปยัง
# กฎไฟร์วอลล์
#
# สคริปต์จะสร้างกฎไฟร์วอลล์โดยอัตโนมัติชื่อ "BlockAttackers (สร้าง yyyy-MM-dd HH: mm: ss UTC)"
# เวลาปัจจุบันหากไม่มีชื่อที่มี "BlockAttackers" อยู่แล้ว เพราะมันมีเรื่องยาก
# limit ของ 1,000 รายการ (ที่อยู่ IP) ที่คุณสามารถบล็อกได้ต่อกฎมันจะสร้างกฎที่มีชื่อคล้ายกันอีกครั้ง
ถึงขีด จำกัด # สำหรับระดับล่าสุด
#
# ฉันขอแนะนำให้ตั้งค่าสคริปต์ให้ทำงานเป็นภารกิจที่กำหนดเวลาไว้ซึ่งเกิดจากเหตุการณ์การตรวจสอบการเข้าสู่ระบบล้มเหลว 4625 รายการจาก
# บันทึกความปลอดภัยหรือคุณสามารถตั้งค่าให้เรียกใช้หลังจากผ่านไประยะเวลาหนึ่ง (เช่นทุกๆ 10 นาที)
#
# ผู้แต่ง:
# ส่วนใหญ่ของสคริปต์ที่เขียนโดยผู้ใช้ serverfault.com kevinmicke
# ส่วนล็อกการรักษาความปลอดภัยของ Windows ที่เขียนโดย remunda ผู้ใช้ serverfault.com ซึ่งเป็นจุดเริ่มต้นสำหรับ kevinmicke
# การตรวจสอบช่องควบคุมของ FTP ที่เพิ่มโดย Uf Martens ผู้ใช้ serverfault.com
#
# รายละเอียด: https://serverfault.com/questions/233222/ban-ip-address-based-on-x-number-of-unsuccessful-login-attempts


# ตั้งค่าจำนวนครั้งในการพยายามลงชื่อเข้าใช้ที่ล้มเหลวหลังจากนั้นที่อยู่ IP จะถูกบล็อก
$ int_block_limit = 3

# หน้าต่างเวลาที่จะตรวจสอบบันทึกความปลอดภัยซึ่งขณะนี้ถูกตั้งค่าให้ตรวจสอบเฉพาะ 24 ชั่วโมงที่ผ่านมา
$ dat_time_window = [DateTime] :: Now.AddDays (-1)

# เลือกจากบันทึกการรักษาความปลอดภัยที่อยู่ IP ทั้งหมดที่มีมากกว่า $ int_block_limit การตรวจสอบล้มเหลว (เหตุการณ์ 4625) ภายใน $ dat_time_window
$ arr_new_bad_ips_security_log = @ ()
$ arr_new_bad_ips_security_log = Get-EventLog -LogName 'ความปลอดภัย' -InstanceId 4625 หลังจาก $ dat_time_window |
    Select-Object @ {n = 'IpAddress'; e = {$ _. ReplacementStrings [-2]}} |
    กลุ่มวัตถุ - คุณสมบัติ IpAddress |
    โดยที่ {$ _. นับ -ge $ int_block_limit} |
    เลือกชื่อคุณสมบัติ

# รับเวลา UTC ปัจจุบันเพื่อหาชื่อไฟล์สำหรับบันทึก FTP ปัจจุบัน
$ current_date_utc = (รับวันที่). ToUniversalTime ()

# กำหนดเส้นทางไปยังไฟล์บันทึกช่องควบคุม FTP วันนี้
$ str_log_file_name_control_channel = "C: \ inetpub \ logs \ LogFiles \ FTPSVC \ u_ex" + $ current_date_utc.ToString ("yyMMdd") + ".log"

# ค้นหาไฟล์บันทึกช่องควบคุม FTP วันนี้สำหรับ "530 1" เพื่อค้นหาบรรทัดที่มี IP ของระบบที่ล้มเหลวในการเข้าสู่ระบบ
# รับเพียง IP จากแต่ละบรรทัดจัดกลุ่ม IP ตาม IP เพื่อนับความพยายามจากแต่ละรายการและเลือกเฉพาะ
# IP ที่มีการเข้าสู่ระบบ $ int_block_limit หรือมากกว่านั้นในวันนี้
$ arr_new_bad_ips_ftp_control_channel = @ ()
$ arr_new_bad_ips_ftp_control_channel = เลือกสตริง $ str_log_file_name_control_channel -pattern "530 1" |
    ForEach-Object {$ _. Line.Substring (20,15) - แทนที่ ". *", ""} |
    กลุ่ม |
    โดยที่ {$ _. นับ -ge $ int_block_limit} |
    เลือกชื่อคุณสมบัติ

# กำหนดเส้นทางไปยังล็อกไฟล์ FTP ของวันนี้
$ str_log_file_name = "C: \ inetpub \ logs \ LogFiles \ FTPSVC * \ u_ex" + $ current_date_utc.ToString ("yyMMdd") + ".log"

# ค้นหาไฟล์บันทึก FTP ปัจจุบันสำหรับ "530 1" เพื่อค้นหาบรรทัดที่มี IP ของระบบที่ไม่สามารถเข้าสู่ระบบได้
# รับเพียง IP จากแต่ละบรรทัดจัดกลุ่ม IP ตาม IP เพื่อนับความพยายามจากแต่ละรายการและเลือกเฉพาะ
# IP ที่มีการเข้าสู่ระบบ $ int_block_limit หรือมากกว่านั้นในวันนี้
# ใน FTPSVC * จะต้องเพิ่ม ID ของเซิร์ฟเวอร์ FTP แทน * หรือใช้โฟลเดอร์บันทึกที่ถูกต้อง
$ arr_new_bad_ips_ftp = @ ()
$ arr_new_bad_ips_ftp = เลือกสตริง $ str_log_file_name -pattern "530 1" |
    ForEach-Object {$ _. Line.Substring (20,15) - แทนที่ ". *", ""} |
    กลุ่ม |
    โดยที่ {$ _. นับ -ge $ int_block_limit} |
    เลือกชื่อคุณสมบัติ

# เชื่อมต่อสองอาร์เรย์ของ IP (หนึ่งรายการจากบันทึกความปลอดภัยหนึ่งรายการจากบันทึก FTP)
$ arr_new_bad_ips_all = @ ()
# $ arr_new_bad_ips_all = @ ($ arr_new_bad_ips_security_log) + @ ($ arr_new_bad_ips_all_ips_ftp_over_limit)
$ arr_new_bad_ips_all = @ ($ arr_new_bad_ips_security_log) + @ ($ arr_new_bad_ips_all_ips_ftp_control_channel) + @ ($ arr_new_bad_ips_ftp)

# เรียงลำดับอาร์เรย์โดยเลือกเฉพาะ IP ที่ไม่ซ้ำกัน (ในกรณีที่ IP หนึ่งรายการปรากฏในบันทึกการรักษาความปลอดภัยและ FTP)
$ arr_new_bad_ips_all_sorted = @ ()
$ arr_new_bad_ips_all_sorted = $ arr_new_bad_ips_all |
    Foreach-Object {[string] $ _. Name} |
    เลือกวัตถุ -unique

# รับวัตถุไฟร์วอลล์
$ firewall = วัตถุใหม่ -comobject hnetcfg.fwpolicy2

# รับกฎไฟร์วอลล์ทั้งหมดที่ตรงกับ "BlockAttackers *"
$ arr_firewall_rules = $ firewall.Rules | โดยที่ {$ _. ชื่อคล้าย 'BlockAttackers *'}

# หากยังไม่มีกฎไฟร์วอลล์ "BlockAttackers *" ให้สร้างขึ้นมาและตั้งเป็นตัวแปร
if ($ arr_firewall_rules -eq $ null) {
    $ str_new_rule_name = "BlockAttackers (สร้าง" + $ ปัจจุบัน_date_utc.ToString ("yyyy-MM-dd HH: mm: ss") + "UTC)"
    ไฟร์วอลล์ advfirewall netsh เพิ่มกฎ dir = ในการดำเนินการ = บล็อกชื่อ = $ str_new_rule_name คำอธิบาย = "กฎที่สร้างขึ้นโดยอัตโนมัติ" เปิดใช้งาน = ใช่ remoteip = "0.0.0.0" | ออก Null
    $ arr_firewall_rules = $ firewall.Rules | โดยที่ {$ _. ชื่อคล้าย 'BlockAttackers *'}
}

# แยก IP ที่มีอยู่จากกฎไฟร์วอลล์ "BlockAttackers *" ปัจจุบันลงในอาร์เรย์เพื่อให้เราสามารถค้นหาได้อย่างง่ายดาย
$ arr_existing_bad_ips = @ ()
foreach ($ rule ใน $ arr_firewall_rules) {
    $ arr_existing_bad_ips + = $ rule.RemoteAddresses -split (',')
}

# Clean subnet mask ปิด IP ที่ถูกบล็อกโดยกฎไฟร์วอลล์ในปัจจุบัน
$ arr_existing_bad_ips_without_masks = @ ()
$ arr_existing_bad_ips_without_masks = $ arr_existing_bad_ips | ForEach-Object {$ _ -replace "/.*", ""}

# ป้อน IP ของเซิร์ฟเวอร์ของคุณ (IPv4 และ IPv6) ในบรรทัดที่ 115 และ 116
# เลือกที่อยู่ IP เพื่อเพิ่มในไฟร์วอลล์ แต่เฉพาะที่ ...
$ arr_new_bad_ips_for_firewall = @ ()
$ arr_new_bad_ips_for_firewall = $ arr_new_bad_ips_all_sorted | ที่ไหน {
    # มีที่อยู่ IP (เช่นไม่ว่างเปล่าหรือเส้นประซึ่งบันทึกความปลอดภัยมีไว้สำหรับระบบที่ล้มเหลวในการเข้าสู่ระบบ FTP)
    $ _. ความยาว -gt 6 - และ
    # ยังไม่ได้อยู่ในกฎไฟร์วอลล์
    ! ($ arr_existing_bad_ips_without_masks - รับ $ _) - และ
    # ไม่ใช่ลูปแบ็คในเครื่อง
    ! ($ _. StartsWith ('127.0.0.1')) - และ
    # ไม่ใช่ส่วนหนึ่งของเครือข่ายย่อยท้องถิ่น
    ! ($ _. StartsWith ('192.168.')) - และ
    ! ($ _. StartsWith ('0.0.')) - และ
    ! ($ _. StartsWith ('10 .0. ')) - และ
    ! ($ _. StartsWith ('*. *. *. *')) - และ
    ! ($ _ startswith (. * * * * * * * * * * * * * * * * * * * * * * * * '))
}

# หากมี IP ที่จะบล็อกให้ทำดังต่อไปนี้ ...
if ($ arr_new_bad_ips_for_firewall -ne $ null) {
    # เขียนวันที่และเวลาไปยังไฟล์บันทึกเฉพาะสคริปต์
    [DateTime] :: Now | Out-File - ผนวก - การเข้ารหัส utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt
    # เขียนที่อยู่ IP ที่ถูกบล็อกใหม่ไปยังล็อกไฟล์
    $ arr_new_bad_ips_for_firewall | Out-File - ผนวก - การเข้ารหัส utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt

    # บูลีนเพื่อให้แน่ใจว่ามีการเพิ่ม IP ใหม่ในกฎเดียวเท่านั้น
    $ bln_added_to_rule = 0

    # อาร์เรย์เพื่อเก็บ IP ที่ไม่ดีจากแต่ละกฎทีละครั้งดังนั้นเราสามารถนับได้เพื่อให้แน่ใจว่าการเพิ่มใหม่จะไม่เกิน 1,000 IP
    $ arr_existing_bad_ips_current_rule = @ ()

    # สำหรับแต่ละกฎ "BlockAttackers *" ในไฟร์วอลล์ให้ทำดังนี้ ...
    foreach ($ rule ใน $ arr_firewall_rules) {
        if ($ bln_added_to_rule -ne 1) {
            # แยก IP ที่มีอยู่จากกฎปัจจุบันเป็นอาร์เรย์เพื่อให้เราสามารถนับได้อย่างง่ายดาย
            $ arr_existing_bad_ips_current_rule = $ rule.RemoteAddresses -split (',')

            # หากจำนวน IP ที่ต้องการเพิ่มน้อยกว่า 1,000 ลบจำนวน IP ปัจจุบันในกฎให้เพิ่มไปยังกฎนี้
            ถ้า ($ arr_new_bad_ips_for_firewall.Count -le (1,000 - $ arr_existing_bad_ips_current_rule.Count)) {
                # เพิ่ม IP ใหม่ให้กับกฎไฟร์วอลล์
                $ arr_new_bad_ips_for_firewall | % {$ rule.RemoteAddresses + = ',' + $ _}

                # เขียนกฎที่เพิ่ม IPs ไปยังล็อกไฟล์
                echo "ที่อยู่ IP ใหม่ด้านบนเพิ่มไว้ในกฎ Windows Firewall:" $ rule.Name | Out-File - ผนวก - การเข้ารหัส utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt

                # ตั้งค่าบูลีนเพื่อให้กฎอื่น ๆ ถูกข้ามเมื่อเพิ่ม IP
                $ bln_added_to_rule = 1
            }
        }
    }

    # หากไม่มีที่ว่างในกฎไฟร์วอลล์ "BlockAttackers *" อื่น ๆ ให้สร้างใหม่และเพิ่ม IP ลงไป
    if ($ bln_added_to_rule -ne 1) {
        $ str_new_rule_name = "BlockAttackers (สร้าง" + $ ปัจจุบัน_date_utc.ToString ("yyyy-MM-dd HH: mm: ss") + "UTC)"
        ไฟร์วอลล์ advfirewall netsh เพิ่มกฎ dir = ในการดำเนินการ = บล็อกชื่อ = $ str_new_rule_name คำอธิบาย = "กฎที่สร้างขึ้นโดยอัตโนมัติ" เปิดใช้งาน = ใช่ remoteip = "0.0.0.0" | ออก Null
        $ new_rule = $ firewall.rules | โดยที่ {$ _. ชื่อ -eq $ str_new_rule_name}

        # เพิ่ม IP ใหม่ให้กับกฎไฟร์วอลล์
        $ arr_new_bad_ips_for_firewall | % {$ new_rule.RemoteAddresses + = ',' + $ _}

        # เขียนกฎที่เพิ่ม IPs ไปยังล็อกไฟล์
        echo "ที่อยู่ IP ใหม่ด้านบนเพิ่มไว้ในกฎ Windows Firewall ที่สร้างขึ้นใหม่:" $ new_rule.Name | Out-File - ผนวก - การเข้ารหัส utf8 C: \ inetpub \ logs \ LogFiles \ blockattackers.txt
    }
}

ชื่อของโฟลเดอร์บันทึกของ FTP FTPSVC*ที่บรรทัด 54 จะต้องทำให้สมบูรณ์ ในบรรทัดที่ 115 และ 116 ต้องป้อน IP ของเซิร์ฟเวอร์ของคุณ (IPv4 และ IPv6) มิฉะนั้น IP ของเซิร์ฟเวอร์ของตัวเองอาจถูกเพิ่มเข้าไปในกฎไฟร์วอลล์ร้อยครั้ง ตัวแปรที่$int_block_limitฉันตั้งค่าไว้ที่ 1 ที่เซิร์ฟเวอร์ของฉันดังนั้นสคริปต์จึงบล็อกการโจมตีของแฮกเกอร์ที่ก่อให้เกิดเหตุการณ์ 4625 เหตุการณ์ภายในสองวินาที ฉันยังคงคิดที่จะเรียกใช้สคริปต์เพิ่มเติมจากการเกิดเหตุการณ์ 4625 เหตุการณ์ในช่วงเวลาไม่กี่นาที สาเหตุก็เป็นไปได้เช่นกันที่จะแยกสคริปต์และให้สคริปต์หนึ่งตรวจสอบเหตุการณ์ 4625 ที่ถูกกระตุ้นโดยเหตุการณ์ 4625 และอีกหนึ่งบันทึกของโฟลเดอร์ FTP ของการตรวจสอบเป็นระยะทุก 5 หรือ 10 นาทีแม้จะมีกฎไฟร์วอลล์แยกต่างหาก และล็อกไฟล์


-1

ฉันได้เพิ่มของฉันสำหรับ SQL

# Select from the Application log (SQL) all IP addresss that have more than $int_block_limit logon failure within $dat_time_window
$arr_new_bad_ips_SQL_log = @()
$arr_new_bad_ips_SQL_log = Get-EventLog -LogName 'Application' -After $dat_time_window |
    Where-Object{$_.EventID -eq 18456} |
    Select-Object @{n='CLIENT';e={$_.ReplacementStrings[-1]}} |
    Group-Object -property CLIENT |
    Where {$_.Count -ge $int_block_limit} |
    Select -property Name |
    {
        $_.Name = $_.Name.Replace(" [CLIENT: ", "");
        $_.Name = $_.Name.Replace("]", "");
        return $_;
    }

จากนั้นคุณจะต้องเพิ่มอาร์เรย์ลงใน ips_all

$arr_new_bad_ips_all = @($arr_new_bad_ips_SQL_log) + @($arr_new_bad_ips_security_log) + @($arr_new_bad_ips_ftp_control_channel) + @($arr_new_bad_ips_ftp)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.