加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0577zz.com/)- 低代码、办公协同、物联平台、操作系统、5G!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

IIS权限总出错?5个Windows站点安全盲区

发布时间:2026-11-03 11:26:23 所属栏目:Windows 来源:DaWei
导读:  接口超时告警那一刻,我正蹲在茶水间扒拉微波炉里那盒冷透的咖喱饭——叮一声响,手机震得我手一抖,饭盒盖弹开,米粒飞到咖啡机滤网里去了。监控大盘上那条绿色的线一直在抖,不是掉红,就是抖,跟心律不齐似的。小杨在工位上

  接口超时告警那一刻,我正蹲在茶水间扒拉微波炉里那盒冷透的咖喱饭——叮一声响,手机震得我手一抖,饭盒盖弹开,米粒飞到咖啡机滤网里去了。监控大盘上那条绿色的线一直在抖,不是掉红,就是抖,跟心律不齐似的。小杨在工位上打电话谈房租,声儿不大但“押金能不能退一半”这句我听清了三次。我原以为是负载高,结果看日志刷得太快看不清,grep完一屏全是Access is denied——全是IIS进程池里的w3wp.exe在喊妈。


  去年高考期间那会儿,出问题的站点是我们那个改了八百遍的报名辅助系统。不是主链路,就一个导出Excel的接口,压测过,灰度过,连教育局的阿姨都试过——结果考前一天晚上十一点半,导出全卡住,503。我们仨蹲在会议室看堆栈,李工盯着Process Monitor抓句柄,手指头敲桌沿的节奏越来越快;王姐把热咖啡泼在自己笔记本键盘上,还顺手用纸巾擦了两下屏幕——那屏幕早该换了,右下角有道划痕,每次切窗口它就反光,像一道疤。


  第一个盲区:ApplicationPoolIdentity这个账号,谁真信过它?文档说“自动管理权限”,我信了三年。结果发现它根本没被加进IIS_IUSRS组里——还是运维老赵凌晨两点登服务器查的,他一边输命令一边嘟囔:“上次加是去年九月,还是你写的邮件批的。”我哪记得?我只记得我回了个“+1”。可它没加进去啊。没人跑过icacls确认过,没人去C:\\inetpub\\wwwroot下面ls -la看Owner是谁。优胜劣汰?对。活下来的不是最懂Windows的,是那个上周刚重装过自己电脑、顺手把IIS配置备份成.ps1脚本的人。


  第二个盲区:web.config里那行,你敢留吗?我们留了,留了整整四年。因为前端要读用户AD属性,必须模拟。结果那天一导出,w3wp.exe突然变成“SYSTEM”身份去读临时文件夹——而那个文件夹权限,只给了IIS APPPOOL\\DefaultAppPool。好家伙,身份切换后,权限继承断了。李工截图发群里时手抖,发了两张,第二张没关DevTools,能看到Network面板里那个POST请求的Response里写着“HRESULT: 0x80070005”。我没点开看——我认得那个码,就是拒绝访问,连查都不用查。


  外卖筷子掉在地上,我捡起来涮了涮又用。第三个盲区:临时目录权限。我们一直往C:\\Windows\\Temp里写Excel模板缓存。没人说过不行,直到某天磁盘爆满,清理时发现那底下几百个.tmp文件,Owner全是“S-1-5-21-xxx-xxx-xxx-500”——administrator的SID,可管理员根本没登录过这台机器。是哪个定时任务干的?谁写的bat脚本用sysinternals工具静默提权?我不知道。王姐查到一半去接孩子电话了,说“等我挂了再看”,结果再也没回来接着看。


  第四个盲区:证书私钥权限。HTTPS站点换证时,运维传了个.pfx过来,双击安装——默认只给当前用户加了私钥读取权限。而w3wp.exe是跑在ApplicationPoolIdentity下的。我原以为IIS Manager里点“绑定”就完事了,结果上线半小时后所有HTTPS接口全503,错误日志只写“SSL handshake failed”。查Event Viewer,Security日志里一行字:“The certificate private key could not be accessed by the IIS user.” 我念出来时,李工正在啃第三块曲奇饼干,碎渣掉在键盘缝里。他抬头看了我一眼:“你没跑winhttpcertcfg吧?”我没跑。我连这命令是干啥的都不知道。后来是老赵用PowerShell一句句手动Set-Acl补的,补完他说:“这玩意儿十年前就deprecated了。”


文章配图,仅供参考

  第五个……其实第四个就已经够了。但那天凌晨三点,我们发现还有一个地方:app_offline.htm。只要它躺在站点根目录,IIS就会停掉所有请求,返回503——但它本身不需要任何权限,连匿名访问都不要。问题是,它如果被某个自动发布脚本生成、却没删干净,就会卡死整站。我们翻Git历史,看到它出现在一次CI流水线的artifact上传步骤里,路径写错了,多拷了一份。而这个路径错误,是在一个叫“publish-fix-v2”的分支里提交的。谁起的名字?我。但我记不清当时为什么叫v2——可能因为v1已经merge进master了?也可能只是随手打的。无所谓。


  工位隔断上贴的便签卷了边,上面写着“周五前确认GPO策略”,墨迹晕开了。我说优胜劣汰,不是说谁技术强谁活下来。是那个某次误操作后,养成习惯每改一处权限就手写三行PowerShell验证脚本的人活下来了;是那个总把IIS Express调试开关开着、怕自己忘了正式环境缺什么DLL的人活下来了;是那个在部署文档里画了张手绘图、标着“此处不许跳过”的人活下来了。其他人?都在查日志,查完还是Access is denied。


  我现在写了个小工具,扔进Jenkins pipeline最后一步:自动检查指定路径的ACL、检查web.config里impersonation开关、扫出所有.pfx引用位置、比对ApplicationPoolIdentity和IIS_IUSRS组成员。但它跑不过所有case。比如它不查registry里HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters\\MaxBandwidth——上次雪崩就是因为这玩意儿设成了1024(字节),但没人知道是谁什么时候改的。我也没打算查。我自己不敢动的那块,就是整个Windows服务层的安全策略配置,尤其是和域控联动那部分。太祖传了,动一下,指不定下周谁家打印机连不上AD认证了。


  所以现在,每次改完字段上线前,我都先去茶水间看一眼咖啡机——要是它还嗡嗡响,我就再跑一遍ACL校验。要是不响了,我就先修机器。反正告警铃响起来之前,它总会先停那么三秒。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!