前段时间帮一个客户做安全评估,登录他们的一台生产服务器后发现:Administrator密码是 Admin@123、RDP端口3389对外开放、而且还没有装任何安全补丁——这台服务器在公网上裸奔了两年多。这篇文章整理了一份15项自查清单,每项10分,满分150分。你可以对照着给自己的服务器打分,看看在第几级。

为什么要做服务器安全自查?

在等保2.0和密评的要求中,服务器安全加固是必查项。但很多企业在安全方面的实际情况是这样的:

  • 等保三级要求"身份鉴别应采用两种或两种以上组合的鉴别技术" → 大量服务器还是纯密码登录
  • 密评要求"密钥应存储在硬件密码设备中" → 密钥还在配置文件里
  • 护网行动中红队最快拿下的方式就是弱口令+RDP爆破 → 平均一台裸奔服务器15分钟就被拿下

做一次自查,不是为了应付检查,而是搞清楚你的服务器到底有多容易被入侵

在这里插入图片描述


自查清单(共15项,每项10分)

一、身份认证安全(5项,共50分)

1. 管理员密码复杂度

评分标准

分数 密码特征
0分 密码长度 < 8位,或为常见弱口令(Admin123、P@ssw0rd等)
3分 密码长度 8-12位,包含大小写+数字
7分 密码长度 12-16位,包含大小写+数字+特殊字符
10分 密码长度 ≥ 16位,包含大小写+数字+特殊字符,且每90天强制轮换

快速检查(PowerShell):

# 检查Windows密码策略
net accounts

# 检查密码复杂度要求
secedit /export /cfg secpol.cfg
Select-String "PasswordComplexity" secpol.cfg

# 检查密码最短长度
Select-String "MinimumPasswordLength" secpol.cfg

加固建议

# 设置密码策略(需要管理员权限)
net accounts /maxpwage:90 /minpwage:1 /minpwlen:14 /uniquepw:5
secedit /configure /cfg password_policy.cfg

2. 是否启用双因素认证

评分标准

分数 状态
0分 仅密码登录,无任何第二因子
5分 部分关键服务器启用了双因素(但不是全部)
10分 所有服务器登录(本地+远程)均启用双因素认证

为什么这一项这么重要?

暴力破解Windows服务器密码的工具有几十种。Hydra、Mimikatz、Metasploit……只要密码不够复杂或者被社工到,纯密码登录形同虚设。双因素认证是目前性价比最高的安全加固措施。

实现方式

  • OTP动态口令(推荐):管理员登录时输入密码 + 手机令牌6位动态码
  • UKEY硬件令牌:登录时插入USB Key + PIN码
  • 指纹认证:结合指纹读卡器实现生物识别

在这里插入图片描述

典型集成架构:

管理员登录Windows
  → 输入静态密码
  → 弹出双因素认证窗口
  → 输入手机OTP动态码(或插入UKEY)
  → 验证通过 → 登录成功

3. RDP远程桌面安全

评分标准

分数 状态
0分 RDP端口3389对公网开放,无IP白名单
3分 RDP端口对外开放,但有防火墙IP白名单
5分 修改了默认端口(非3389),但未启用网络级别认证(NLA)
7分 RDP仅限内网访问 + 启用NLA
10分 RDP仅限内网 + NLA + 双因素认证 + 超时自动锁定

快速检查

# 检查RDP端口
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "PortNumber"

# 检查是否启用NLA(网络级别认证)
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication"

# 检查RDP是否对外监听
netstat -an | findstr "3389"

加固建议

# 1. 修改RDP端口(改为随机高位端口)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "PortNumber" -Value 43829

# 2. 启用NLA
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1

# 3. 设置空闲超时自动断开(15分钟)
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' -Name "MaxIdleTime" -Value 900000  # 毫秒

# 4. 防火墙限制RDP来源IP
New-NetFirewallRule -DisplayName "RDP Allow Specific IPs" -Direction Inbound -LocalPort 43829 -Protocol TCP -Action Allow -RemoteAddress 10.0.0.0/8,172.16.0.0/12

4. 账号共享和幽灵账号

评分标准

分数 状态
0分 多人共用Administrator账号,存在已离职人员账号
3分 创建了个人账号,但离职后未及时清理
7分 个人账号 + 定期清理离职账号
10分 个人账号 + 离职自动清理 + 登录审计日志

快速检查

# 列出所有本地管理员账号
Get-LocalGroupMember -Group "Administrators" | Format-Table Name, PrincipalSource

# 检查最近90天未登录的账号
$90DaysAgo = (Get-Date).AddDays(-90)
Get-LocalUser | Where-Object { $_.LastLogon -lt $90DaysAgo -and $_.Enabled -eq $true } | Format-Table Name, LastLogon, Enabled

# 检查是否有空密码账号
Get-LocalUser | Where-Object { $_.PasswordRequired -eq $false -and $_.Enabled -eq $true } | Format-Table Name

5. 特权账号权限最小化

评分标准

分数 状态
0分 所有管理员都有完整Administrator权限
5分 区分了管理员和普通用户,但管理员权限没有细分
10分 按职责划分权限(DBA、运维、审计),每个角色最小权限

加固建议:Windows支持"用户权限分配",可以精细化控制:

# 创建只读运维账号
New-LocalUser -Name "ops_readonly" -Description "运维只读账号"

# 只授予"远程登录"权限,不授予"管理员"权限
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "ops_readonly"

# 禁止该账号执行关机、修改系统时间等特权操作
$nopriv = @{
    "SeShutdownPrivilege" = "ops_readonly"
    "SeChangeTimePrivilege" = "ops_readonly"
}

二、系统安全配置(5项,共50分)

6. 操作系统补丁更新

评分标准

分数 状态
0分 未安装任何补丁,或系统已停止更新
5分 开启了自动更新,但不验证是否成功安装
10分 定期检查补丁 + 测试后安装 + 补丁回退方案

快速检查

# 查询已安装的补丁
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10

# 检查最后一次补丁安装时间
(Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn

# 使用PSWindowsUpdate模块检查可用更新
Install-Module PSWindowsUpdate -Force
Get-WindowsUpdate

7. 防火墙规则

评分标准

分数 状态
0分 防火墙关闭
3分 防火墙开启,但有大量"允许所有"规则
7分 防火墙开启,仅开放必要端口(白名单策略)
10分 防火墙开启 + 白名单 + 出站规则限制 + 日志记录
# 检查防火墙状态
Get-NetFirewallProfile | Select-Object Name, Enabled

# 检查是否有"允许所有入站"的宽泛规则
Get-NetFirewallRule | Where-Object { $_.Direction -eq 'Inbound' -and $_.Action -eq 'Allow' -and $_.Enabled -eq 'True' } | Select-Object DisplayName, Direction, Action

# 检查远程桌面相关规则
Get-NetFirewallRule -DisplayGroup "Remote Desktop" | Select-Object DisplayName, Enabled, Action

8. 不必要的系统服务

评分标准

分数 状态
0分 所有默认服务都在运行,未做任何优化
5分 关闭了明显不需要的服务(如打印后台处理)
10分 按最小化原则精简服务 + 定期审计运行服务列表
# 列出所有运行中的服务
Get-Service | Where-Object { $_.Status -eq 'Running' } | Sort-Object DisplayName | Format-Table DisplayName, Status, StartType

# 常见建议关闭的服务
$servicesToDisable = @(
    "Print Spooler",        # 打印服务(服务器通常不需要)
    "Remote Registry",      # 远程注册表
    "Xbox *",               # Xbox相关
    "Windows Sidebar"       # 桌面小工具
)

$servicesToDisable | ForEach-Object {
    $svc = Get-Service -DisplayName $_ -ErrorAction SilentlyContinue
    if ($svc -and $svc.Status -eq 'Running') {
        Write-Host "建议关闭: $($_) (当前运行中)" -ForegroundColor Yellow
    }
}

9. 安全审计日志

评分标准

分数 状态
0分 未开启审计日志,或日志被关闭
5分 开启了登录审计,但日志未集中管理
10分 登录+权限变更+文件访问全部审计 + SYSLOG集中收集 + 日志防篡改

加固建议

# 开启关键审计策略
$auditPolicy = @{
    "Logon" = "Success, Failure"            # 登录成功/失败
    "Account Logon" = "Success, Failure"    # 网络登录
    "Object Access" = "Failure"             # 对象访问失败
    "Privilege Use" = "Success, Failure"    # 特权使用
    "Policy Change" = "Success, Failure"    # 策略变更
}

foreach ($key in $auditPolicy.Keys) {
    auditpol /set /category:"$key" /success:enable /failure:enable
}

# 设置日志保留大小(至少1GB)
wevtutil sl Security /ms:1073741824

# 发送到SYSLOG服务器(Windows原生不支持,需要安装NXLog或类似工具)

10. USB外设管控

评分标准

分数 状态
0分 允许任意USB设备接入,无任何限制
5分 通过组策略限制USB存储设备
10分 USB白名单 + 接入审计日志 + 敏感数据USB拷贝告警
# 禁止USB存储设备写入(允许读取,适用于运维场景)
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\USBSTOR\Parameters"
New-ItemProperty -Path $regPath -Name "Start" -Value 4 -PropertyType DWord -Force

# 仅允许特定USB设备(白名单)
# 通过设备的DeviceID进行过滤,需要在注册表中配置
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\

三、数据安全(5项,共50分)

11. 敏感数据加密存储

评分标准

分数 状态
0分 数据库、配置文件、日志中的敏感数据全部明文存储
5分 部分敏感字段加密,但密钥存储在服务器本地
10分 透明加密(TDE)+ 密钥由HSM硬件保护 + 进程级访问控制

12. 密钥和凭据管理

评分标准

分数 状态
0分 密钥/密码写在配置文件中
5分 密钥加密存储,但加密密钥仍在本地
10分 凭据由统一平台管理 + HSM保护 + 自动轮换 + 使用审计

13. 数据备份安全

评分标准

分数 状态
0分 无备份,或备份和原始数据在同一台服务器
5分 有定期备份,但备份数据未加密
10分 3-2-1备份策略 + 备份加密 + 异地/离线保存 + 定期恢复演练

14. 临时文件和日志中的敏感信息

评分标准

分数 状态
0分 日志中包含明文密码、Token等敏感信息
5分 对日志做了脱敏,但可能遗漏
10分 日志自动脱敏 + 定期扫描 + 敏感信息泄露告警

15. 防勒索措施

评分标准

分数 状态
0分 仅依赖杀毒软件,无额外防护措施
5分 有定期备份 + 杀毒软件
10分 进程白名单管控 + 透明加密(TDE) + 实时告警 + 离线备份

评分等级

等级 分数区间 状态描述 建议行动
A级 130-150 安全加固完善 保持,定期审计即可
B级 100-129 基本达标,有改进空间 对照扣分项逐项加固
C级 70-99 存在明显安全隐患 优先处理0分项,制定整改计划
D级 40-69 高风险状态 立即处理身份认证和RDP安全问题
E级 0-39 几乎不设防 建议暂停对外服务,全面整改后再上线

快速自评脚本

把下面的脚本保存为 server_security_check.ps1,直接在服务器上运行:

# Windows服务器安全自评脚本
# 使用管理员权限运行
Write-Host "========== Windows服务器安全自评 ==========" -ForegroundColor Cyan
Write-Host ""

$score = 0

# 1. 密码复杂度
$minPwLen = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -ErrorAction SilentlyContinue).MinimumPasswordLength
if ($minPwLen -ge 14) { $score += 10; Write-Host "[10分] 密码最短长度: $minPwLen" -ForegroundColor Green }
elseif ($minPwLen -ge 8) { $score += 5; Write-Host "[5分] 密码最短长度: $minPwLen" -ForegroundColor Yellow }
else { Write-Host "[0分] 密码最短长度: $minPwLen (建议>=14)" -ForegroundColor Red }

# 2. 防火墙状态
$fwProfiles = Get-NetFirewallProfile
if ($fwProfiles | Where-Object { $_.Enabled -eq $true }) {
    $score += 7; Write-Host "[7分] 防火墙已开启" -ForegroundColor Green
} else {
    Write-Host "[0分] 防火墙关闭" -ForegroundColor Red
}

# 3. RDP检查
$rdpPort = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -ErrorAction SilentlyContinue).PortNumber
$rdpListening = Get-NetTCPConnection -LocalPort $rdpPort -ErrorAction SilentlyContinue
if (-not $rdpListening) {
    $score += 10; Write-Host "[10分] RDP未监听" -ForegroundColor Green
} else {
    $nla = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -ErrorAction SilentlyContinue).UserAuthentication
    if ($nla -eq 1) { $score += 5; Write-Host "[5分] RDP端口$rdpPort开放,已启用NLA" -ForegroundColor Yellow }
    else { Write-Host "[0分] RDP端口$rdpPort开放,未启用NLA" -ForegroundColor Red }
}

# 4. 共享账号检查
$admins = Get-LocalGroupMember -Group "Administrators" -ErrorAction SilentlyContinue
$adminCount = ($admins | Measure-Object).Count
if ($adminCount -le 3) { $score += 7; Write-Host "[7分] 管理员账号数: $adminCount" -ForegroundColor Yellow }
else { $score += 3; Write-Host "[3分] 管理员账号数: $adminCount (建议<=3)" -ForegroundColor Red }

# 5. 最近补丁
$lastPatch = Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1
$daysSincePatch = ((Get-Date) - $lastPatch.InstalledOn).Days
if ($daysSincePatch -le 30) { $score += 10; Write-Host "[10分] 最近补丁安装: $($lastPatch.InstalledOn.ToString('yyyy-MM-dd'))" -ForegroundColor Green }
elseif ($daysSincePatch -le 90) { $score += 5; Write-Host "[5分] 最近补丁安装: $($lastPatch.InstalledOn.ToString('yyyy-MM-dd'))" -ForegroundColor Yellow }
else { Write-Host "[0分] 最近补丁安装: $($lastPatch.InstalledOn.ToString('yyyy-MM-dd')) (已过期$daysSincePatch天)" -ForegroundColor Red }

Write-Host ""
Write-Host "========== 自评总分: $score / 150 ==========" -ForegroundColor Cyan
switch ($score) {
    { $_ -ge 130 } { Write-Host "等级: A级 — 安全加固完善" -ForegroundColor Green }
    { $_ -ge 100 } { Write-Host "等级: B级 — 基本达标,有改进空间" -ForegroundColor Green }
    { $_ -ge 70 }  { Write-Host "等级: C级 — 存在明显安全隐患" -ForegroundColor Yellow }
    { $_ -ge 40 }  { Write-Host "等级: D级 — 高风险状态" -ForegroundColor Red }
    default         { Write-Host "等级: E级 — 几乎不设防" -ForegroundColor Red }
}

写在最后

这份清单的核心思路是:安全加固不是装一个杀毒软件就完事了,而是要从身份认证、系统配置、数据保护三个层面全面覆盖。

其中投入产出比最高的两项加固措施:

  1. 双因素认证(第2项)—— 成本最低、效果最好,直接杜绝弱口令和暴力破解
  2. RDP安全加固(第3项)—— 改端口+NLA+IP白名单,15分钟搞定

如果你的服务器自查分数在C级以下,建议优先处理这两项,能立刻堵住最大的安全漏洞。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐