面向公网的 Windows Server 加固清单
一份为必须可从公网访问的 Windows 服务器准备的有序清单:先做什么、大多数清单错在哪里,以及什么可以安心押后。
如何使用这份清单
加固清单通常因为同一个原因而失效:它们按字母顺序排列,而不是按风险排列。人们从上往下做,时间在屏幕保护策略附近耗尽,却从未碰到远程访问。
这一份是有序的。前面几节消除服务器真正被拿下的途径;最后一节值得做,但它本身救不了您。如果您只有一个下午,做第 2 和第 3 节,然后停下。
清单假设服务器必须保持可从公网访问。如果您的不必,第 3 节会收缩成一行,而这是好消息。
1. 账户与身份验证
面向公网的 Windows 服务器几乎每一次失守,都始于有效的凭据——被猜中的、被喷洒出来的、从别处泄露后复用的,或者被钓来的。力气应该花在这里。
- 禁用或重命名内置 Administrator 账户。它是所有攻击清单上的第一个名字,而它众所周知的 SID 意味着仅仅改名并不构成防御——更好的做法是禁用它,另建一个具名管理员账户。
- 对所有能远程登录的账户强制多因素认证。这是本清单中价值最高的一项:没有第二因素,猜中的密码一文不值。
- 强制长密码——15 个字符的下限抵抗离线破解的效果,远好于在更短密码上施加复杂度规则——如果工具支持,还应禁用已知泄露过的密码。
- 审计究竟谁真的拥有远程访问权。删除离职人员、已结束工作的外包方,以及不再存在的服务所对应的账户。每一个休眠账户都是无人看管的攻击面。
- 给服务账户各自独立的身份,不授予交互式登录权限,密码也不与任何其他地方共用。
- 谨慎对待账户锁定。在面向公网的主机上,它让任何人都能随意禁用您的账户;若要使用,请把阈值设得温和,并且永远不要把它当作抵御猜解的防线。
2. 网络暴露面
在「谁能登录」之后,第二个问题是「从哪里登录」。每一个可从公网访问的端口,都是此刻正被人测试的服务。
- 从外部清点真正在监听的东西。在主机上执行 Get-NetTCPConnection -State Listen,然后从另一个网络验证其中哪些会应答。
- 在边界上关闭 SMB(445)。它基本上永远不该面向公网,而在本打算只暴露 RDP 的服务器上,它是常见的第二个发现。
- 对 WinRM(5985/5986)、MS SQL(1433)以及任何管理接口同样处理。如果某个服务不需要从公网访问,那这本身就是全部的修复。
- 对 RDP 本身,能限制来源地址就限制。如果不能,继续往下读——第 3 节就是补偿措施。
- 开启网络级身份验证,让未认证的客户端永远得不到为其创建的会话。
- 不仅要检查 Windows 防火墙,也要检查云安全组。两层意味着两处可能出错,而一个放行一切的安全组挡在一个精心配置的主机防火墙前面,是常见的错配。
3. 自动封禁登录失败
这一节是大多数清单会漏掉的,也正是它改变运营一台暴露服务器的日常体验。
Windows 把每一次认证失败记为事件 4625,也自带一套完全够用的防火墙,却没有提供任何把两者连起来的东西。放任不管,一台服务器每天要吸收数千次猜解:消耗的 CPU、被搅乱的审计日志,以及攻击者可以持续尝试多久这件事没有任何上限。
您需要的是 fail2ban 的等价物:盯住失败流,当某个来源越过阈值时在防火墙把它丢弃。有三个属性区分了扛得住的实现与会漏的实现——封禁子网而非单个地址;让封禁永久且能挺过重启;在启用任何东西之前先把自己的访问加入白名单。
您可以把它做成 PowerShell 计划任务,对于一台您每天都会查看的服务器,这是合理的选择。请预留一天,并且明白它的失效方式是沉默:计划任务会在重启和改密码之后停止运行,且不通知任何人。RDP Protector 是同样的逻辑做成的托管代理,白名单、子网处理、端口识别和存活视图都已内置。
4. 补丁与攻击面
凭据是常见的入口;未打补丁的服务是让人印象深刻的那一种。
- 启用自动更新,或者执行一个您真的会遵守的补丁周期。RDP 出现过认证前的远程代码执行漏洞,将来还会有。
- 移除不用的角色和功能。一个没人记得启用过的 IIS,是别人会替您找到的服务。
- 卸载随镜像而来、并不需要的软件。每一个代理、工具栏和厂商更新程序,都是在您主机上以特权运行的代码。
- 让您确实在运行的代理软件保持最新,包括监控和备份。
- 关闭遗留协议——SMBv1、TLS 1.0 与 1.1、NTLMv1——除非确有东西需要它们;如果确实需要,写下来是什么,并在日后重新评估。
5. 日志与检测
您无法调查没有记录下来的东西,而默认配置记录的比您以为的少,保留的时间也比您预期的短。
- 确认登录审核记录的是失败而不只是成功:auditpol /get /subcategory:"Logon" 必须两者都显示。
- 调大安全日志的最大容量。默认值在暴露主机上几小时就会写满,您需要的事件在您去看之前就已过期。
- 把事件转发到主机之外。被入侵机器的本地日志是攻击者可以编辑的证据;别处的副本则不是。
- 针对有意义的事情告警,而不是针对数量:来自新国家的成功登录、新增的本地管理员、被安装的服务、审计日志被清空(事件 1102)。
- 偶尔而有意识地回顾谁成功登录过。登录失败是噪音;一次您无法解释的成功登录,才是全部要害。
6. 真正做过恢复演练的备份
这一节排在最后,不是因为它最不重要,而是因为它是一项假设其他所有措施都已失效的手段——而在那一天,您的备份只有一个属性真正重要。
至少保留一份服务器自身既够不着也删不掉的副本。勒索软件运营者会在加密任何东西之前先寻找备份目标,而一个被入侵主机可以写入的共享目录不是备份,它是等着被销毁的第二份副本。
然后,恢复其中一份。从未被恢复过的备份只是一个假设。按计划测试它,记下花了多长时间,并确保不止一个人知道流程。
FAQ
- Windows Server 加固中最重要的一步是什么?
- 对所有具备远程访问权限的账户启用多因素认证。面向公网的 Windows 服务器失守,始于有效凭据的情况远多于始于未打补丁的漏洞,而 MFA 让被猜中、被喷洒或被泄露的密码本身变得毫无价值。如果这周只能做一件事,就做这件。
- 该禁用内置的 Administrator 账户吗?
- 在面向公网的服务器上,该禁用。它是所有攻击清单尝试的第一个账户名,而其众所周知的 SID 意味着改名并不能让它躲开有决心的攻击者。请另建一个具名管理员账户,确认可以正常使用,然后禁用内置账户。
- Windows 自带阻止重复登录失败的功能吗?
- 没有。Windows 把失败记为事件 4625,也包含一套够用的防火墙,但没有任何东西把两者连起来——不存在内置的 fail2ban 等价物。账户锁定并不是这个机制:它禁用的是账户而不是来源,在暴露主机上这反而让任何人都能随意锁死您的账户。
- 暴露服务器的 Windows 安全日志应该设多大?
- 大到能容纳数天而不是数小时。默认的 20 MB 在每天数千条事件的情况下很快就满了,请显著调大——几百兆并不过分——同时把事件转发到主机之外,这样被入侵机器的本地日志就不是您唯一的副本。
