【安全提醒】几台服务器一直在被暴力破解,开发的朋友注意。

最近阿里云服务器一台windows系统的链接时经常提示下图 ,但是我的一般设置都是记录密码,不可能有错误密码的连接。因此不应该提示这个。

导出服务器日志中的登录失败记录

72小时内共被尝试登录3.5万次其中 79.124.56.98(国外IP)尝试登录9千次。其他很多ip尝试登录超3千次。虽然我的服务器不是弱口令,但是总被暴力破解登录挺不舒服的。

意想不到:

好几年了,一直是开放全部端口,从不认为自己的数据有任何商业价值,所以从未想过会被攻击。(当然也没想到他攻击我的服务器仅为那点可怜的算力)

尝试解决:

本以为软件只尝试默认端口,因此我也尝试了修改默认端口号,但仍然被攻击,他们应该是扫端口号了。

重点提醒:

开发的朋友应该都喜欢设置放开全部端口,最少放开了ssh、rdp和mysql等常用端口,请慎重!

解决办法(非最好):

在安全组只开放了80和443,其他端口设置拒绝,允许我的ip连接其他端口。缺点:家宽会变ip
补充: 家宽变化有规律,一般ip的前三字节不会变,因此可以设置安全组放开 ip xxx.xxx.xxx.0/24 的访问,这样即使宽带ip变化也不会有太大问题

佛系解决办法:

密码上强度,攻击无所谓。

疑问
1.怀疑是不是针对阿里云的尝试,有没有用腾讯云的朋友,看一下有没有登录失败日志。
2.有没有软路由的朋友且映射了公网,看一下自己的后台有没有失败日志。

6 个赞

线上的Windows系统如果开了远程桌面,就非常容易被攻击。除了增加密码的强度,再有就是尽量的改掉所有的端口号。

1 个赞

linux也一样,都有几万条登录失败的记录。

1 个赞

他们都是优先攻击默认端口的

1 个赞

套一层代理,只允许白名单ip连接

1 个赞

主要是家宽ip会变,如果是白名单可以直接设置安全组或者系统自带防火墙

1 个赞

写个脚本,每次连接前,将本机ip设置为白名单

好办法,但是好像阿里云并没开放安全组的相关api

有的,有api的,你找找,开个accesskey就行了。就防火墙的api

powershell脚本

远程桌面登录失败10次拉黑IP

# 设置控制台输出编码为 GB2312 或 GBK
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("GB2312")

# 定义日志名称和事件ID
$logName = "Security" # 安全日志
$eventID = 4625  # 登录失败的事件ID

# 定义时间范围
$startTime = (Get-Date).AddDays(-1)  # 从24小时前开始
$endTime = Get-Date  # 到现在

# 检索指定时间范围内的事件日志条目
$filter = @{
    LogName   = $logName
    ID        = $eventID
    StartTime = $startTime
    EndTime   = $endTime
}
$events = Get-WinEvent -FilterHashtable $filter -MaxEvents 100 -Oldest

# 创建一个字典来记录每个IP地址的失败次数
$ipCounts = @{}

foreach ($event in $events) {
    $message = $event.Message
    # 使用正则匹配IP地址,这里由于Windows语言版本的不同,这样匹配成功率更高
    if ($message -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::(\d{1,5}))?") {
        $sourceAddress = $matches[1] # 匹配到IP地址
        if ($sourceAddress -eq "127.0.0.1") {
            # 如果是本地回环地址,则跳过后续操作
            continue
        }
        # 记录IP地址的失败次数
        if (-not $ipCounts.ContainsKey($sourceAddress)) {
            $ipCounts[$sourceAddress] = 0
        }
        $ipCounts[$sourceAddress]++
    }
}

# 检查每个IP地址的失败次数,如果超过10次,则创建防火墙规则
foreach ($ip in $ipCounts.Keys) {
    if ($ipCounts[$ip] -ge 10) {
        # 获取当前防火墙规则名称是否已经建立
        $existingRule = Get-NetFirewallRule -DisplayName "Block IP $ip" -ErrorAction SilentlyContinue
        if ($existingRule) {
            Write-Output "IP $ip 防火墙规则已存在,跳过创建."
        } else {
            # 创建防火墙规则禁止连接该IP地址
            New-NetFirewallRule -DisplayName "Block IP $ip" -Direction Inbound -Action Block -RemoteAddress $ip
            Write-Output "IP $ip 防火墙规则已新建"
        }
    } else {
        Write-Output "IP $ip 失败次数: $($ipCounts[$ip]),不足10次,跳过创建防火墙规则."
    }
}

# 原创内容,转载请带上原作者信息:作者:ioripalm

添加到任务计划
打开任务计划程序:
按 Win + R,输入 taskschd.msc,然后按 Enter。
创建基本任务:
在右侧窗格中,点击 创建基本任务…。
输入任务名称,例如 BlockFailedLoginIPs,然后点击 下一步。
设置触发器:
选择 当特定事件被记录时,然后点击 下一步。
在 日志 下拉菜单中选择 Security。
在 源 下拉菜单中选择 Microsoft-Windows-Security-Auditing。
在 事件ID 中输入 4625,然后点击 下一步。
设置操作:
选择 启动程序,然后点击 下一步。
浏览并选择 PowerShell 的路径(通常是 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe)。
在 添加参数 框中输入:
powershell
深色版本
-NoProfile -ExecutionPolicy Bypass -File “C:\Users\Administrator\Desktop\blockIP.ps1”
点击 下一步,然后点击 完成。

释放拉黑IP

# 设置控制台输出编码为 GB2312 或 GBK
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("GB2312")

# 定义时间范围
$releaseTime = (Get-Date).AddHours(-24)  # 从24小时前开始

# 获取所有被封锁的IP地址的防火墙规则
$rules = Get-NetFirewallRule | Where-Object { $_.DisplayName -like "Block IP *" }

foreach ($rule in $rules) {
    $ip = $rule.DisplayName -replace "Block IP ", ""
    # 检查该IP地址的最后登录失败时间
    $lastFailedLogin = Get-WinEvent -LogName Security -FilterXPath "*[System/EventID=4625 and EventData/Data[@Name='IpAddress']='$ip']" | Sort-Object TimeCreated -Descending | Select-Object -First 1
    
    if ($lastFailedLogin -and $lastFailedLogin.TimeCreated -lt $releaseTime) {
        # 删除防火墙规则
        Remove-NetFirewallRule -DisplayName $rule.DisplayName
        Write-Output "IP $ip 防火墙规则已删除"
    } else {
        Write-Output "IP $ip 最近有登录失败记录,保持封锁状态"
    }
}

# 原创内容,转载请带上原作者信息:作者:ioripalm

创建任务计划
打开任务计划程序:
按 Win + R,输入 taskschd.msc,然后按 Enter。
创建释放IP地址的任务:
在右侧窗格中,点击 创建基本任务…。
输入任务名称,例如 ReleaseBlockedIPs,然后点击 下一步。
选择 每天,然后点击 下一步。
设置开始日期和时间,然后点击 下一步。
选择 重复任务每,设置为 24 小时,持续时间为 无限期,然后点击 下一步。
选择 启动程序,然后点击 下一步。
浏览并选择 PowerShell 的路径(通常是 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe)。
在 添加参数 框中输入:-NoProfile -ExecutionPolicy Bypass -File “C:\Users\Administrator\Desktop\releaseIPs.ps1”
点击 下一步,然后点击 完成。

1 个赞

我去,这么吓人

我都是三天一重装,五天一更新………

正常情况下我只开443,其它要用的端口都是通过CF转发出来的。

有测试过吗,还是ai生成的?

建议你不再使用密码认证,转而采用SSH密钥登录,并启用ASN白名单,仅允许您家庭网络的ASN访问。同时配置mTLS客户端证书,增加身份验证层。如果以上方法还不能解决,可以考虑采用Cloudflare Zero Trust。

@Cressida

限制登录次数不就好了 同一个IP直接小黑屋 这个不是难事 很多办法都能实现

我是省的麻烦 直接上个开心版不就好了

还不如限制ASN,比如你是北京移动的,又只允许北京移动的IP去尝试,其他的IP根本就是连尝试登录的资格都没有,更别说爆破了,并且同时加上fail2ban防止被同一地区的IP爆破

转载,原作者信息在代码注释。

我配置了fail2ban

jail.local

[squid]

enabled  = true
filter   = squid
port     =  80,443,3128,3129,8080
logpath  = /var/log/squid/access.log
maxretry = 5
bantime  = -1

filter:

failregex = ^\s+\d\s<HOST>\s+(TCP_REJECTED|TCP_DENIED|TCP_MISS|NONE)/\d+\s.*$
            ^\s+\d\s<HOST>\s+[A-Z_]+_DENIED/\d+\s.*$
            ^\s+\d\s<HOST>\s+[A-Z_]+_DENIED(?:_[A-Z_]+)?/\d+\s.*$
            ^\s+\d\s<HOST>\s+NONE/\d+\s.*$
            ^\s+\d\s<HOST>\s+error:invalid-request\s.*$