这篇文章,我用一个真实案例,把服务器安全防护的核心知识梳理一遍。不管你是后端、运维还是全栈,看完至少知道自己的服务有哪些"洞"。
一、事情是这样的
最近项目过等保测评,安全团队用绿盟漏洞扫描系统对两台业务系统服务器做了一轮扫描。结果出来,两台都是 “比较危险” 级别:
| 服务器 | 角色 | 风险评分 | 开放端口数 |
|---|---|---|---|
| 192.168.x.x(A) | 数据库服务器(Oracle + RDP) | 6.6 | 7个 |
| 192.168.x.x(B) | 应用服务器(IIS 10.0 + RDP) | 6.4 | 13个 |
说实话,看到13个开放端口的时候我是有点懵的——这应用服务器到底是跑业务还是开杂货铺?
更让我意外的是,扫出来的漏洞大部分不是什么0day,而是 存在了10年甚至20年的老问题:2005年的CVE还在,2011年的漏洞还在,TLS 1.0还在用,自签名证书还在顶着……
这就引出了一个扎心的事实:大多数安全风险不是"技术做不到",而是"压根没想过要做"。
二、从漏洞看安全:五大类问题逐个拆
我把这次扫描出的十几个漏洞归了五大类,基本上覆盖了大多数企业内网服务器的通病。
2.1 远程访问安全:RDP的大门敞开着
漏洞: RDP中间人攻击(CVE-2005-1794,威胁6.4)+ RDP未启用NLA(威胁4.3)
这个漏洞2005年就公布了,20年了。简单说就是:RDP连接时客户端不验证服务器身份,攻击者通过ARP欺骗或DNS劫持,就能中间人窃听所有RDP通信内容。
而 NLA(Network Level Authentication,网络级身份验证) 没开,意味着RDP协议栈完全暴露——连接建立之后才验证身份,暴力破解、蠕虫攻击都从这里进来。
修复很简单,一条注册表搞定:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 1
但更重要的是:3389端口谁都能连吗?
正确的做法是:
- 启用NLA
- 防火墙限制3389仅运维网段可访问
- 如果不需要远程桌面,直接关掉
# 仅允许运维网段访问RDP
New-NetFirewallRule -DisplayName "RDP-Allow-Admin" -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Allow -RemoteAddress 172.16.x.0/24
New-NetFirewallRule -DisplayName "RDP-Block-Other" -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Block
💡 开发者启示: 你写的服务暴露在哪个端口,就应该想清楚"谁需要连它"。默认全开放是最常见的坏习惯。
2.2 传输加密安全:TLS的三个老坑
数据库服务器A的5500端口(Oracle XML DB)一口气扫出三个TLS相关漏洞,每一个都是等保必改项:
坑1:TLS 1.0还在用(威胁6.5)
TLS 1.0是1999年的协议,存在POODLE、BEAST等已知攻击。等保2.0明确要求禁用TLS 1.0和SSL 3.0。
# 禁用TLS 1.0
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" -Force
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" -Name "Enabled" -Value 0
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" -Name "DisabledByDefault" -Value 1
# 确保TLS 1.2启用
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -Force
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -Name "Enabled" -Value 1
坑2:RSA静态密钥交换,没有前向保密(威胁5.0)
用RSA做密钥交换意味着:私钥一旦泄露,所有历史流量都能被解密。这是典型的"一把钥匙开所有锁"。
正确做法是使用ECDHE临时密钥交换——每次握手生成新的临时密钥,私钥泄露也不影响历史会话,这叫 前向保密(Forward Secrecy)。
坑3:TLS客户端重协商DoS(CVE-2011-1473,威胁5.0)
攻击者反复发起SSL重协商,一台普通电脑就能打垮服务器。修复方式:禁用客户端发起的重协商。
💡 开发者启示: 你开发HTTPS服务时,有没有检查过TLS版本和密码套件配置?大多数人配一次就忘了,直到安全扫描来敲门。以下是一份现代TLS配置检查清单:
- ✅ 仅启用TLS 1.2和1.3
- ✅ 密码套件只保留ECDHE开头的(前向保密)
- ✅ 禁用客户端发起的SSL重协商
- ✅ 禁用RC4、DES、3DES等弱加密算法
2.3 证书安全:自签名证书不是"能用就行"
5500端口还扫出三个证书问题:自签名证书、证书不受信任、证书链不完整,每个威胁3.5分。
很多人觉得"内网服务嘛,自签名证书够用了"。但自签名证书的核心问题是:任何人都能伪造一个一模一样的证书,中间人攻击零门槛。
内网也需要正规证书,方案有两条:
- 企业内部PKI: 部署AD CS或OpenSSL CA,由内部根CA签发证书,所有内网机器信任该根CA
- Let’s Encrypt: 如果服务有域名,即使是内网解析,也可以申请免费证书
💡 开发者启示: 自签名证书在开发环境可以接受,但在生产环境——哪怕是内网——就是安全漏洞。等保测评一定会查。
2.4 端口与信息泄露:13个端口的反思
应用服务器B开了13个TCP端口。让我列一下:
| 端口 | 服务 | 用途 |
|---|---|---|
| 135 | MSRPC | Windows基础服务 |
| 443 | HTTPS | ✅ 业务 |
| 445 | SMB | 文件共享 |
| 3389 | RDP | 远程桌面 |
| 8088 | ASP.NET | ✅ 业务 |
| 9090 | .NET Remoting | ⚠️ 老技术 |
| 10010/10011/10012 | IIS/ASP.NET | ✅ 业务 |
| 1010/1099/1199/1999 | ASP.NET | ❓ 是否还在用? |
13个端口里,真正业务必须的可能不到一半。
每一个开放端口都是一个攻击面。扫描报告里光"可通过HTTP获取远端服务信息"就有7条——Banner里ASP.NET、IIS版本、.NET CLR版本全暴露了,攻击者还没动手就知道你用什么技术栈。
收敛端口的原则:
- 最小化原则: 不需要的端口一律关掉
- 白名单原则: 需要的端口也要限制访问来源
- 隐藏Banner: 移除Server、X-Powered-By等HTTP响应头
<!-- IIS web.config 隐藏Banner -->
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
<security>
<requestFiltering removeServerHeader="true" />
</security>
</system.webServer>
💡 开发者启示: 部署服务时,默认只开放业务端口。数据库端口(1521、3306等)绝不应该对全网开放,只允许应用服务器IP访问。SMB(445)、RPC(135)这种Windows基础服务端口,能限制就限制。
2.5 网络协议安全:ICMP和Traceroute
这两个是低风险漏洞,但经常被忽视:
- ICMP Timestamp响应: 攻击者可以获取服务器时间,用于时间认证协议的攻击
- Traceroute探测: 暴露网络拓扑
修复也是一行命令:
# 阻止ICMP Timestamp
New-NetFirewallRule -DisplayName "Block ICMP Timestamp" -Protocol ICMPv4 -IcmpType 13,14 -Action Block -Direction Inbound
# 阻止Traceroute响应
New-NetFirewallRule -DisplayName "Block Traceroute Response" -Protocol ICMPv4 -IcmpType 0,3,11 -Action Block -Direction Outbound
💡 开发者启示: 安全是纵深防御,没有哪个漏洞"太低不需要修"。攻击者往往组合利用多个低危漏洞来实施高危攻击。
三、用AI辅助安全加固:我的实战经验
这次修漏洞,我用AI做了两件事:分析扫描报告和生成修复脚本。说说感受。
3.1 让AI帮你读报告
绿盟的扫描报告一份就十几页,两台服务器加起来二十多页PDF。我直接把PDF丢给AI,几秒钟就拿到了:
- 漏洞分类汇总(哪些是同一类问题)
- 两台服务器的对比分析
- 按优先级排序的修复建议
- 每个漏洞的修复脚本
手动整理这些至少得半天,AI两分钟出结果。但有个前提:你得会提问。
我的提问方式是:“帮我分析这两个扫描报告,给我生成一个解决方案”。清晰的目标、明确的输入、具体的产出要求——这和Spec Coding是一个道理:先定义好契约,再让AI执行。
3.2 AI生成的脚本要审查
AI生成的PowerShell脚本和注册表修改命令,我每一条都过了一遍。发现几个需要注意的点:
- 注册表路径可能因Windows版本不同而略有差异,需要确认目标服务器版本
- 防火墙规则顺序很重要,Allow规则要在Block规则之前
- Oracle的TLS配置不能只改Windows注册表,还需要在Oracle层面配置(AI给的方案偏Windows视角)
⚠️ 关键原则:AI是加速器,不是替代品。 安全配置影响系统稳定性,每一条命令都要理解其含义后再执行。不懂的命令,先问AI解释,再决定是否执行。
3.3 用AI做安全自查
除了修漏洞,我还用AI做了一个自查清单,以后部署新服务时过一遍:
□ 业务端口是否最小化?不需要的关了吗?
□ 数据库端口是否限制了访问来源?
□ RDP是否启用了NLA?3389是否限制了访问来源?
□ HTTPS是否只用TLS 1.2+?密码套件是否支持前向保密?
□ 证书是否由受信任CA签发?证书链是否完整?
□ HTTP响应头是否隐藏了服务器版本信息?
□ 防火墙是否阻止了ICMP Timestamp和Traceroute?
□ SMB(445)/RPC(135)是否限制了访问来源?
把这个清单加到部署流程里,比出了问题再修强一百倍。
四、安全防护的三个层次
经过这次等保整改,我总结了一个开发者视角的安全防护框架:
第一层:意识和习惯(最重要)
- 部署服务时主动想"这个端口需要吗?谁需要连?"
- 不用默认配置,不用自签名证书上线
- 定期做安全扫描,不要等等保来查
第二层:访问控制(最基础)
- 端口最小化:只开必须的
- 网络白名单:限制访问来源
- 身份认证:启用NLA、多因素认证
- 权限最小化:服务不用管理员账号跑
第三层:加密和协议(最专业)
- TLS 1.2+,禁用旧协议
- ECDHE密钥交换,确保前向保密
- CA签发证书,证书链完整
- 禁用弱加密算法和重协商
三层叠加,就是纵深防御。单独任何一层都不够,但每一层都能增加攻击者的成本。
五、写在最后
有个数据很扎心:这次扫出的漏洞,最早的CVE是1999年的——比我的工龄还长。不是不知道怎么修,是从来没想过要修。
作为开发者,我们习惯了"功能先上,安全后补"。但安全从来不是补出来的,是设计出来的。部署一个服务时多花10分钟做安全加固,比出了事故花10天整改强得多。
安全不是成本,是投资。
最后分享一句我特别喜欢的话:
“The only truly secure system is one that is powered off, cast in a block of concrete and sealed in a lead-lined room with armed guards.” — Gene Spafford
翻译:唯一真正安全的系统是断电、浇混凝土、铅封、荷枪实弹守着的那个。
我们做不到那种程度,但至少——别让2005年的CVE还在你的服务器上跑着。
如果这篇文章对你有帮助,欢迎点赞收藏。有安全加固方面的问题也欢迎留言讨论。

1265

被折叠的 条评论
为什么被折叠?



