
做Windows系统基础安全如果只盯着杀毒软件和补丁大概率会在真实环境里翻车。我给不少企业做过这一类“不值钱却救命”的加固项目核心永远绕不开几件事账号口令、端口服务、共享权限、日志审计、补丁管理。今天把我在“网安--window系统基础安全”这个方向上沉淀的东西整理出来不讲虚的直接说怎么查、怎么改、踩过哪些坑。这套内容适合谁刚入门的安全工程师、需要兼任安全的运维同学以及想把自己电脑或公司Windows设备底子打牢的人。你不需要会写复杂代码只要愿意打开PowerShell、按住WinR就能跟着往下走。1. 为什么Windows基础安全决定后续防线好不好打1.1 攻击者的第一步通常落在哪里我做攻防演练和应急响应时观察到一个非常现实的现象大多数成功入侵都不是靠某个0day而是靠Windows基础配置上的几个洞。攻击者进入内网后第一步是做信息收集。他们会先探测哪些机器开了3389、445、135这些常见端口然后尝试弱口令、爆破管理员账号、翻共享文件夹。为什么这些能成功因为很多Windows服务器的本地管理员密码还是Admin123Guest账户没禁用共享目录直接开了Everyone写权限审计日志也没打开。攻击者登录进来做了什么都留不下痕迹。所以基础安全的核心不是“装没装杀软”而是先解决“最容易被打进去的门”和“打进来之后能不能被看见”这两件事。杀毒软件解决的是已知文件的识别账号口令、端口暴露面、日志留存解决的是整个系统的暴露边界和事后追溯能力。1.2 基础安全不是单点配置而是闭环有人以为把密码改复杂就完事了其实不是。Windows基础安全必须形成闭环。我习惯把整个思路分成五段资产梳理、攻击面收敛、身份口令加固、行为日志可见、持续核查。前一个环节没做到位后面做得再多也会被绕过。比如你确实把防火墙规则收紧得很漂亮但忘记关掉远程桌面在公网直接暴露等于前门锁好了侧门还开着。又比如你开了详细审计策略但安全日志只有20MB一天就被覆盖真出了事什么都查不到。生活化类比Windows系统像一栋办公楼。账号是大门门禁共享文件是公共储物柜监听端口是敞开的功能区域日志是监控探头。基础安全就是把门禁权限梳理清楚、把废弃通道封掉、把监控录像做全、定期检查访客名单。你不需要一上来就上多贵的安保系统但必须先把这些底层的规则立起来。2. 账号与口令加固先把最容易攻破的口子堵死2.1 从账号梳理开始这一节是整个Windows基础安全里性价比最高的部分因为改起来快、效果直接。但前提是你得知道自己机器上到底有哪些账号。打开PowerShell先拉出所有本地用户Get-LocalUser | Format-Table Name, Enabled, PasswordRequired, PasswordLastSet -AutoSize再检查管理员组成员Get-LocalGroupMember -Group Administrators | Format-Table ObjectClass, Name我看到过太多次企业服务器上一堆几年前创建的服务账号没人记得用途某个普通业务账户莫名其妙被加进了Administrators组Guest账户还开着。这些都属于“不该存在的高权限入口”。遇到这种情况我的建议是分四步处理系统内置的Administrator账户能禁用就禁用。日常管理用新建的管理员账号这样拿到系统的人不会轻易猜中默认用户名。业务上确实要用Administrator至少要重命名别用默认名字然后设置高强度口令。Guest账户直接禁用。Windows中Guest一般默认关闭但有些环境释放镜像后会被打开必须检查。所有管理员组成员都要有明确归属。服务账号不要加入管理员组宁可给到具体所需权限也别直接给全域管理员权限。账号梳理做完之后要形成一份账号台账记录用户名、用途、创建时间、负责人、最后登录时间。不然两个月后你还得重新排查一遍。2.2 密码策略和账户锁定策略密码策略看起来基础却是最容易配置出错的地方。打开secpol.msc在“账户策略-密码策略”下方可以看到密码长度最小值密码复杂性要求密码最长使用期限密码最短使用期限强制密码历史我个人至少建议密码长度14位以上、启用复杂性、最长使用期限不超过90天、强制密码历史5个以上。不要觉得复杂现代系统完全支持长口令。真实环境里短口令配合爆破工具通常撑不过几分钟。账户锁定策略同样关键。在“账户策略-账户锁定策略”里设置账户锁定阈值建议5次到10次账户锁定时间建议15分钟重置账户锁定计数器建议15分钟这个策略专门防RDP暴力破解。如果一个人连续尝试几次都失败直接锁定账号让爆破工具空转。企业中如果机器多不建议一台台手动改尽量用组策略批量下发。域环境里直接在GPO上设置非域环境可以用脚本或安全基线工具统一配置。手动改机器你最需要解决的问题不是“不知道在哪里”而是改完之后没人记得复核。2.3 SMB共享、空会话和默认共享共享目录是Windows内网里的重灾区。很多业务部门喜欢共享一个文件夹给全公司用权限设置却是Everyone完全控制密码不设审计不查。先看当前系统开了哪些共享Get-SmbShare -IncludeHidden | Format-Table Name, Description, Path -AutoSize不需要的共享直接删掉。如果共享确实必要权限原则只有一个最小化。删掉Everyone只添加实际需要的用户或组并且只给“读取”不给“更改”。另外两个隐藏的高危项是空会话枚举和默认共享。所谓空会话枚举就是攻击者用匿名身份连接IPC$从而枚举出系统用户、组、共享信息。在本地安全策略中搜索“网络访问不允许SAM账户和共享的匿名枚举”设置成“已启用”。这条对实际正常访问影响很小但能明显减少信息泄露。默认共享即C$、ADMIN$这些由系统自动创建的共享。日常运维偶尔会用到但你确认用不到的话可以在注册表层面关闭New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters -Name AutoShareServer -Value 0 -PropertyType DWord -Force New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters -Name AutoShareWks -Value 0 -PropertyType DWord -Force重启后生效。IPC$无法完全关闭但通过限制匿名枚举可以很大程度上降低风险。最后必提SMB1。这个老协议承载过多个影响巨大的蠕虫漏洞如果业务没有特殊依赖直接通过“启用或关闭Windows功能”取消SMB 1.0/CIFS支持或者用DISM命令行dism /online /disable-feature /featurename:SMB1Protocol /norestart做完这步很多针对老共享协议的攻击面会被一次性封住。3. 系统服务、端口和防火墙把暴露面收小3.1 先搞清楚机器上到底开了什么攻击者进入内网后第一步通常是端口扫描看目标上有哪些服务在监听。你不必等攻击者来扫自己先扫一遍就知道暴露面在哪。PowerShell查监听端口非常方便Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess | Format-Table -AutoSize看到PID后再查对应进程Get-Process -Id PID | Select-Object ProcessName, Path这条组合命令能快速定位到底是哪个进程在监听端口。常见的高危端口包括135、137、138、139、445、3389等。如果一台服务器上出现了不认识的端口或进程先查是谁开的为什么开谁允许的。还需要检查自启动服务Get-Service | Where-Object { $_.Status -eq Running -and $_.StartType -eq Automatic } | Select-Object Name, DisplayName, StartType重点关注这些常见“雷点”Remote Registry远程注册表服务。默认虽然不一定是自动但一旦开启攻击者可以在远程修改注册表风险极高。Print Spooler打印服务除非这台机器确实是打印服务器否则建议禁用。Telnet Client / Telnet Server老古董协议传输不加密现在基本没有启用理由。TFTP Client在应急排查场景可能用到但日常如果不是必要最好关掉。禁用服务时注意某些服务有依赖关系。例如禁用LanmanServer会引发共享和SMB失效。所以改之前先用以下命令看清楚启动类型和依赖Get-Service LanmanServer sc.exe qc LanmanServer3.2 Windows防火墙规则怎么写才不误伤防火墙不是越严越好而是在“可用”和“安全”之间找到平衡。Windows自带防火墙默认会阻断入站连接问题在于有人会为了省事整机关闭防火墙这就非常不建议。遇到远程访问不通应该在防火墙规则里找原因而不是一刀切关掉。先看当前防火墙状态Get-NetFirewallProfile | Select-Object Name, Enabled三个配置都要是Enabled。如果某个配置是Disabled停止所有入站访问后续排查会非常痛苦。开放端口时尽量指定作用域和远端IP。例如需要给一台办公网里的Windows机器开远程桌面端口就不要写成允许所有人New-NetFirewallRule -DisplayName Allow RDP from OAM subnet -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3389 -RemoteAddress 192.168.10.0/24这个规则把来源限制到了某办公网段。如果不知道谁能访问至少不要直接面向外网。高危端口445、135、139等即便不得不开放也必须限制来源并且要走单独白名单。还要检查已存在的放行规则Get-NetFirewallRule -Direction Inbound -Action Allow | Where-Object { $_.Enabled -eq $true } | Select-Object DisplayName, Profile, Enabled一句话总结宁可漏放一条也不要为了省事把防火墙关掉。3.3 远程管理通道怎么收口Windows管理员最常用的是远程桌面也就是RDP默认端口3389。这个通道如果直接暴露在公网几乎等于把控制台送给全世界的扫描器。我的经验是绝不让3389直接暴露公网。所有远程操作通过内部的远程接入网关和堡垒机转跳用户先登录堡垒机再通过堡垒机访问后端Windows主机。源头限制。防火墙规则只放行堡垒机或运维网段的IP。启用网络级别身份验证NLA。这个选项在“系统属性-远程”里可以勾选开启后远程连接必须先在身份验证阶段通过否则不会加载远程桌面会话能挡住很多早期利用攻击。远程桌面用户权限要收敛。不是所有用户都能远程登录默认只有Administrators组可以。不要把普通用户批量加入“Remote Desktop Users”组。远程管理通道本身不是问题问题在于“谁都能从任何地方访问”和“没有登录限制”。把访问来源、登录身份、会话认证这三层锁住这个通道就会安全很多。4. 日志审计、基线核查和补丁管理4.1 审计策略开启的正确姿势攻击者进入系统后会想方设法清理日志。如果你一开始就没开日志他们连清理的功夫都可以省了。所以审计策略必须前置。打开secpol.msc在“本地策略-审核策略”中我建议至少把以下几项设为“成功失败”审核登录事件审核账户登录事件审核账户管理审核策略更改审核进程创建审核特权使用也可以使用高级审核策略覆盖更细粒度。命令行临时开启某些类别auditpol /set /category:Logon/Logoff /success:enable /failure:enable auditpol /set /category:Account Management /success:enable /failure:enable auditpol /set /subcategory:Process Creation /success:enable /failure:enable日志有了还得保证它别因为空间不足被覆盖太快。Windows事件日志默认上限通常不高。把安全日志至少调到256MB以上wevtutil sl Security /ms:268435456如果机器访问量大可以再调高。日志目录如果满系统默认会丢弃新日志这等于审计又失效了。所以要么调大空间要么设置为“按时间覆盖旧的”但覆盖策略必须结合日志集中归档来设计。4.2 日志的保护与集中收集单机日志最大的问题是“攻击者进去后可以直接清掉安全日志”。所以基础安全做到一定阶段一定要考虑日志集中收集。中小环境可以用Windows自带的事件转发机制把多台服务器的安全日志转发到一台独立的日志收集服务器。日志收集服务器再单独做加固权限分离只有负责日志审计的账号能读。集中日志的好处是即使本机日志被清远端仍有副本。处理应急事件时可以从日志平台回溯攻击者登录时间、执行的进程、访问过的共享目录。还有一点容易被忽略日志文件本身的访问权限。检查事件日志目录权限确保不是Everyone能读。默认情况下普通用户无法读取安全日志但如果你手动改过权限或装了某些组件一定要复查。4.3 基线核查清单我每次做Windows基础安全都会固化成一张核查表。下面是可以直接拿去用的版本检查项期望值核查方式本地用户Guest禁用内置Administrator禁用或改名Get-LocalUser管理员组成员仅必要的人员/账号Get-LocalGroupMember密码策略长度≥14复杂度启用90天内过期secpol.msc / 组策略账户锁定策略阈值≤10次secpol.msc / 组策略审核策略登录/进程/账户管理均开成功失败auditpol /get /category:*防火墙状态所有配置文件均为启用Get-NetFirewallProfile高危端口无对外暴露的135/139/445/3389Get-NetTCPConnectionSMB共享无Everyone权限无多余隐藏共享Get-SmbShare日志容量安全日志≥256MBwevtutil gl Security补丁情况最近3-6个月安全补丁已安装Get-HotFix这张表可以拿去做日常巡检脚本每次出一份结果不达标的项直接标红。5. 排查实录与实操心得5.1 我踩过的几个典型坑第一类改完密码策略以为“所有密码都会强制改”。实际Windows的密码策略只会在用户下次修改密码时校验新密码是否符合策略已经存在的弱密码不会因为策略变更而自动失效。所以在企业里推行强密码策略要么通过登录脚本触发强制重设要么设置“用户下次登录时须更改密码”。第二类开着远程桌面调试防火墙把自己锁在外面。某次我在服务器上新增RDP防火墙规则时只把来源IP写成了当前办公网的一个临时出口IP结果网络切换后瞬间失联最后只能靠跳板机从另一条线路进去。从那之后我改防火墙规则前会先确认至少有两个可用访问通道。第三类禁用某个服务结果业务直接挂掉。比如禁用Print Spooler之前没注意到公司有一个扫描软件依赖打印服务。现在我在生产环境禁用服务之前都会先看服务的依存关系并且先手动停止服务跑一段时间看业务是否受影响再决定要不要把启动类型改为Disabled。5.2 常见问题速查表症状可能原因处理方法远程桌面连不上防火墙未放行、NLA未开、用户无权限检查3389入站规则、勾选NLA、确认用户属于远程桌面组登录失败多次后没锁定未配置账户锁定阈值secpol.msc中设置锁定阈值和时间修改密码策略后旧密码仍能用策略只影响新设置的密码强制用户下次登录改密共享目录突然不可访问SMB服务被禁用或SMB1被关闭确认LanmanServer服务状态确认业务是否依赖SMB1安全日志很快被覆盖日志容量过小或保留策略不当wevtutil增大日志容量并集中归档补丁安装失败磁盘空间不足、Windows Update服务异常清理系统盘重置Windows Update服务后重试防火墙规则明明放行还是不通过远端IP作用域设置不对或默认规则冲突检查规则的RemoteAddress和Action是否匹配5.3 做基础安全最容易忽略的几件事最后分享几个我的个人体会。基础安全做完不等于永远安全。环境会变人员会走账号会越来越多。所以最重要的不是“今天配置都对”而是“明天还能检查出哪些配置变了”。我做项目时一定会留下一份可执行的安全基线检查脚本让运维同学按周或按月跑一次把不达标项自动汇总出来。另一点是要把“最小权限原则”落到人头。很多企业把所有运维账号都加进本机Administrators组理由是方便。方便和安全从来是矛盾的我在实际处理中会把日常巡检权限和紧急管理权限分开日常只用只读权限巡检真要动配置再通过独立的通道提权。还有一点是针对替换旧设备。有些人离职后账号留在共享服务器的管理员组里半年后还有登录记录这种事听起来离谱但很常见。基础安全并不需要高深技术它考验的是有没有一套持续执行的机制。配置能改完机制需要长期运转。我在实际做Windows基础安全时最深的感受是这些操作看起来都太基础但恰恰是基础的部分决定了一个系统在被攻击时的下限。下限越高后续的安全设备才有机会发挥作用。希望这份实录能让你在加固自己的Windows环境时少走几步弯路。