IIS权限总出错?5大Windows站点安全盲区
|
文章配图,仅供参考 跟产品吵。去年十月份,灰度开关没推完,IIS就报“HTTP Error 500.19 - Configuration error”,配置文件明明在,权限也加了,ApplicationPoolIdentity对C:\\inetpub\\wwwroot有读取+执行,连IIS_IUSRS都手动加了两次——结果前端甩来截图:页面白底黑字写着“Access is denied”,而我正盯着监控大屏上那条绿色的HTTP状态码曲线,它刚在凌晨三点十七分抖了一下,像被人用指甲掐了半秒。第一盲区:web.config里那块儿,你真信IIS会老老实实走它?不会。它只认物理路径ACL里的SDDL,哪怕你config里写,只要IIS_IUSRS对D:\\Sites\\App2\\bin有Write权限,它就能绕过所有XML限制直接写shell——这个我敢打包票,因为去年十月份那个凌晨四点零三分,我亲眼看着测试往上传了个.asmx.cs,然后AppPool自动回收三次后,iisreset干了六遍,还是不行。 PM过来倒了杯水,咖啡杯上印着公司logo,右下角还沾了点奶泡。他问“能不能加个白名单”,我说“加啊,加在web.config里?行。但你得先保证C:\\Windows\\System32\\inetsrv\\config\\applicationHost.config本身不被inherit,否则子站点的allowUnlisted=false就是句空话。”他点头走了,我没说出口的是——那天下午我们其实漏查了applicationHost.config最顶上那段的overrideModeDefault="Deny",而它底下某一行早被前年DBA改成了"Allow"……这事儿我说不准,毕竟他们交接文档里写的“已同步权限策略”,但没写同步到哪台机子。 第二盲区:Application Pool Identity的token缓存。不是用户登录缓存,是IIS内核级的SID映射缓存。你改完NTFS权限、iisreset、甚至reboot,它照样从cache里拿旧token去校验。我原以为清空%WinDir%\\System32\\inetsrv\\config\\schema就够了,结果不行;又试了net stop w3svc && net start w3svc,还是不行;最后靠的是:停WAS服务→删掉C:\\inetpub\\temp\\appPools\\下所有子目录→重启WAS→等三十秒→再启W3SVC。那一夜我发了三百七十二次调用,全卡在CreateProcessAsUser返回ERROR_ACCESS_DENIED。咖啡凉了,测试发了七条企业微信:“李工,生产环境能动了吗?” 第三盲区:web.config里和匿名身份认证撞车。你设了impersonate,又开了IUSR,IIS默认优先用IUSR,但某些模块(比如ASP.NET编译器)会偷偷切回ApplicationPoolIdentity——于是你在文件系统上看是IUSR有权限,实际跑代码时却是AppPoolIdentity在摸磁盘,它没有对App_Data的Write权限。这个坑是前端踩的,他改了global.asax里一个路径拼接,结果日志里反复刷“The process cannot access the file because it is being used by another process”,而oncall手机震了一下,是我自己设置的Page Alert,震动模式,很轻,但足够让我把正在输的PowerShell命令敲错了两次。 第四盲区:GAC。真没人记得GAC里的DLL也得看权限?去年十月份上线那个报表导出功能,本地跑通,服务器挂掉,查了俩小时才发现ReportViewer.dll在GAC里,但它的依赖项Microsoft.ReportViewer.Common.dll在C:\\Program Files\\...下,而ApplicationPoolIdentity根本没读C:\\Program Files的权限——NTFS继承关了,UAC没关,路径硬编码,三重错位。我提了个PR把路径改成GAC引用,前端看了两分钟,说“这个我们之前没配GAC部署流程”。我说行,那你现在配。他说“我们配不了,要找运维。”我回:“我就是运维。”他哦了一声,去会议室倒了第三杯水。 第五盲区:IIS的“允许”和“拒绝”在ACL里不是布尔逻辑,是Win32 API层面的ACE顺序判定。你给人家加了一百二十个“允许读取”,只要最上面有一条“拒绝修改”,整个文件夹就拒绝。去年十月份那个周五下午,我就栽在这儿——给某站点加了IIS_IUSRS“完全控制”,但忘了删十年前某个安全加固脚本残留的DENY ACE,结果权限检查直接跳过所有ALLOW行。这个优胜劣汰是真的,活下来的站点,都是被各种误操作反复毒打后,手动把ACL列表从头捋到尾、按ACE顺序排序过三遍的。 说到KPI,今年Q3的安全扫描通过率压到99.7%,差那0.3%全是IIS权限告警。我让测试改了一百零七次URL命名规则,没用;最后是运维组老大手写了个PowerShell脚本,循环检查每个站点的physicalPath对应的父目录ACL,逐层输出ACE order,才揪出来三个站点的DENY ACE埋在第七层。他没提交Git,直接传我邮箱附件,邮件主题写“别问,问就是历史包袱”。 所以现在我上线前必做三件事:一、确认C:\\inetpub\\wwwroot及其子目录ACL里没有任何DENY entry;二、把ApplicationHost.config里所有section的overrideModeDefault抄下来手写比对;三、对着进程管理器里w3wp.exe的用户名,去Event Viewer里翻Security日志——找4670事件ID,就看它到底在用哪个SID去open file。别的我都懒得管了。要不要搞个自动化?等我把下周灰度开关收尾再说吧。刚才又震了一下,这次是手机来电,号码显示“未知”,我摁掉了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


