Windows服务器安全加固自查清单:15项逐条打分,你的服务器在第几级?
安全加固不是装一个杀毒软件就完事了,而是要从身份认证、系统配置、数据保护三个层面全面覆盖。双因素认证(第2项)—— 成本最低、效果最好,直接杜绝弱口令和暴力破解RDP安全加固(第3项)—— 改端口+NLA+IP白名单,15分钟搞定如果你的服务器自查分数在C级以下,建议优先处理这两项,能立刻堵住最大的安全漏洞。
前段时间帮一个客户做安全评估,登录他们的一台生产服务器后发现: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 }
}
写在最后
这份清单的核心思路是:安全加固不是装一个杀毒软件就完事了,而是要从身份认证、系统配置、数据保护三个层面全面覆盖。
其中投入产出比最高的两项加固措施:
- 双因素认证(第2项)—— 成本最低、效果最好,直接杜绝弱口令和暴力破解
- RDP安全加固(第3项)—— 改端口+NLA+IP白名单,15分钟搞定
如果你的服务器自查分数在C级以下,建议优先处理这两项,能立刻堵住最大的安全漏洞。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)