加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.jiakaowang.com/)- 应用程序、AI行业应用、CDN、低代码、区块链!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

IIS权限总出错?5个Windows安全盲区实习生血泪总结

发布时间:2026-10-28 08:11:33 所属栏目:Windows 来源:DaWei
导读:  去年一月份,我提的选题被毙了三次。第三次是在下午三点十七分,总编把打印稿往桌上一推,纸边压住了我那根没动过的中性笔——蓝帽、0.5mm、壳上有个小磕痕,到现在还在那儿躺着。  他说:“IIS权限?实习生写这个像在写遗

  去年一月份,我提的选题被毙了三次。第三次是在下午三点十七分,总编把打印稿往桌上一推,纸边压住了我那根没动过的中性笔——蓝帽、0.5mm、壳上有个小磕痕,到现在还在那儿躺着。


  他说:“IIS权限?实习生写这个像在写遗书。”


  我没吭声。但心里翻着白眼——他上周刚让小编改完三版“Docker Compose.yml 配置陷阱”,连healthcheck字段缩进多两个空格都要标红批注,转头就说IIS不值得写?


  我原以为是路径问题,结果扫了一眼web.config,又扫了下applicationHost.config,顺手点了下IIS管理器右下角那个小叹号——弹窗写着“无法读取配置节”,底下一行灰色小字:“Config error: Cannot read configuration file due to insufficient permissions.” 我点了三次“详细信息”,每次点都得等两秒,中间隔壁桌咖啡洒了,湿了一整张A4纸,她抽了两张纸巾摁上去,没说话,也没抬头。


  第一个盲区:ApplicationPoolIdentity账户不是“看起来像管理员”就真能干——它默认连C:\\Windows\\Temp都进不去。我敢打包票。上周五下午四点二十一分,我把log目录从D:\\logs挪到C:\\inetpub\\logs,然后部署完就403。不是没加IIS_IUSRS组,是加了;不是没继承,是继承了;就是死活读不了——后来才发现,C:\\Windows\\Temp底下有个临时XML缓存,AppPool要用它生成config schema,而那个目录ACL里根本没写ApplicationPoolIdentity。删掉缓存?不行,删完IIS就拒绝启动。改ACL?得用icacls /grant “IIS APPPOOL\\DefaultAppPool”:F ——不是(IIS_IUSRS),不是(Users),是带空格、带斜杠、带反斜杠转义的全名。少一个字符,它就跪着吐错,还不告诉你跪哪儿了。


  第二个盲区:web.config里的不是帮你偷权限,是帮你精准制造身份混淆。我试过把用户名密码硬编码进去,也试过用Windows身份验证+AD域账户。结果呢?部署后本地能跑,上线就500.21。我查Event Viewer,日志里写的错误代码是0x80070005,Access is denied —— 但 denied 的到底是哪一行?它不告诉你。最后发现,是impersonation后,进程上下文切换成域用户,可该用户对%SystemRoot%\\Microsoft.NET\\Framework64\\v4.0.30319\\Config\\web.config没有读权限……等等,你没听错,它要读.NET框架自己的web.config。不是你的,是它爹的。


  外卖凉了没人吃。盒盖掀开时候凝了一层油膜,米饭堆在角落结块。我拿筷子拨了三下,没动。


  第三个盲区:静态文件服务启用状态下,IIS会绕过托管管道模式,直接走内核态缓存——这时候authorization模块根本没加载。所以你web.config里写一百遍,.js文件照样裸奔下载。我那天反复确认了web.config语法、modules注册、handler映射……最后发现是MIME类型映射里漏配了text/javascript,IIS把它当binary stream处理了。于是权限检查跳过,防盗链失效,前端源码被爬站脚本抓了个精光。我说不准这事算不算P0,反正当天凌晨一点零七分,运维在群里发截图问“你们站点怎么能把jquery.min.js直接GET下来”,我回了个“稍等”,没敢说“我刚改完web.config”,只说“排查中”,然后删掉了刚发的测试请求curl命令——那条命令还在我PowerShell历史里第17行,删得有点抖。


  第四个盲区:Windows安全策略组策略对象(GPO)和本地安全策略能互相打架,而且不报错。我们测试环境好好的,上线前QA测出登录态突然丢失。我以为是sessionState timeout,结果抓包发现cookie domain写成了.local,改成.intranet,还是丢。折腾十八分钟之后,我突然想起来:服务器加域了。跑去gpedit.msc,看“网络安全:LAN Manager 身份验证级别”设的是“发送NTLMv2响应”,但我们的单点登录SDK要求明文凭证(别笑,客户老系统)。改完立刻恢复——不是重启IIS,是重启机器。这事儿我没敢在周报里写,只写了“环境适配延迟”,因为写实了怕被追问“为啥不提前测”。


  第五个盲区:NTFS权限继承一旦断,就真断。断点在哪儿?不一定在你改的那层。比如你给D:\\site\\bin加了IIS_IUSRS读取权,却忘了D:\\site本身ACL里“替换所有子对象权限项”前面那个勾是灰的——它压根没生效。而这个勾,在Windows Server 2019图形界面里,默认不亮。得手动点开属性→安全→高级→启用继承,再点“用在此容器中的对象上应用这些权限”,再点确定——中间还要等三秒进度条。我点过两次,第一次忘点“应用到”,第二次点了,但弹窗卡住,鼠标悬停在“确定”按钮上十秒,最后强制关了。结果是bin目录有权限,config目录没权限,DLL加载失败,日志只写“Could not load file or assembly”,不写哪个assembly,也不写为什么。


  总编手机响了一声。微信语音来电,他没接,划掉,屏幕暗下去的时候反光里照出我后脑勺,头发乱,有点油。


  优胜劣汰?对。我见过两个同届的,一个靠写IIS权限文档撑过转正答辩,另一个写了篇《如何让IIS在Azure VM上拒绝访问自己的证书存储》,直接被架构组捞去搞中间件加固。我没他们狠。我就记得某天凌晨三点,我把web.config里那段全部注释掉,只留一行,页面终于亮了。不是修复,是投降。但我得承认:那一刻我比任何时候都清楚——不是IIS太蠢,是我们太信它会按文档来。


文章配图,仅供参考

  现在选题会我不主动提IIS了。上周我说“聊聊Kestrel在Windows服务宿主下的shutdown信号丢失”,总编点了点头,说“这个可以,下周排”。我没告诉他,Kestrel其实也踩过同样五个坑,只是换了个报错姿势——它不说“access denied”,它说“ObjectDisposedException at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets…”,更难查。但没关系,我反正不打算说。


  这篇可能活不过三小时。

(编辑:站长网)

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