服务公告

服务公告 > 综合新闻 > IIS:安全配置

IIS:安全配置

发布时间:2026-04-23 17:02

一、前言

搞过的人都知道,最烦的是IIS上线前那一堆安全加固项,什么匿名访问、目录遍历、Server头泄露,不配齐了分分钟被人扫出漏洞。这玩意儿不像Nginx改几行conf就能搞定,IIS安全配置全是图形界面点点点,文档东一块西一块看得脑壳疼。今天把生产环境验证过的IIS安全基线配置流程拉一遍,照着做能少踩不少坑。

二、操作步骤

步骤1:禁用不必要的IIS功能模块

打开"控制面板 → 程序和功能 → 启用或关闭Windows功能",展开"Internet Information Services",取消勾选不需要的模块,特别是WebDAVPublish(文件上传漏洞重灾区)和IIS管理脚本和工具(生产环境禁止远程管理)。

预期输出: ☑ World Wide Web服务 ☑ HTTP功能 ☑ 静态内容 ☑ 默认文档 ☑ 目录浏览 ✗ (生产环境禁用) ☑ HTTP错误 ☑ HTTP重定向 ☑ 应用程序开发功能 ☑ ASP.NET 4.8 (根据实际需求) ☑ .NET Extensibility 4.8 ☑ ISAPI扩展 ☑ ISAPI筛选器 ☐ WebDAV发布 (必须取消勾选) ☑ 安全性 ☑ 基本身份验证 ☑ Windows身份验证 ☑ 请求筛选

步骤2:修改Server头信息隐藏IIS版本

打开IIS管理器,右键站点 → "HTTP响应头" → 添加以下两条:

名称:X-Powered-By 值:ASP.NET (改为通用值迷惑扫描器) 名称:Server 值:Microsoft-IIS/10.0 (修改为通用值或直接删除)

或者用appcmd命令行批量处理:

C:\Windows\System32\inetsrv\appcmd.exe set config -section:system.webServer/serverRuntime /alternateHostName:"Microsoft-IIS" /commit:apphost 预期输出: 已提交配置完成。

完成后用curl测试:

C:\> curl -I https://your-site.com 预期输出: HTTP/1.1 200 OK Content-Type: text/html Server: Microsoft-IIS ← 隐藏了版本号 X-Powered-By: ASP.NET Date: Thu, 01 Jan 2025 08:00:00 GMT

步骤3:配置请求筛选阻止危险路径遍历

在站点根节点双击"请求筛选" → "URL"标签页 → 右键"拒绝序列" → 添加以下危险字符序列:

.. .. ../ ..\.. 预期输出: 操作完成。 已拒绝 URL 序列 ..。 已拒绝 URL 序列 ..\。 已拒绝 URL 序列 ..\..\。

切换到"查询字符串"标签页,禁用危险参数:

拒绝查询字符串序列: ../ ..\ /etc/passwd c:\boot.ini 预期输出: 操作完成。 已拒绝查询字符串序列:../

步骤4:禁用目录浏览防止文件泄露

在IIS管理器中展开目标站点 → 双击"目录浏览" → 点击右侧"禁用"。或者在web.config中配置:

C:\inetpub\wwwroot\your-site\web.config <configuration> <system.webServer> <directoryBrowse enabled="false" showFlags="None" /> </system.webServer> </configuration> 预期输出: 操作完成。目录浏览已禁用。

验证配置生效:

C:\> curl -I http://your-site.com/ 预期输出: HTTP/1.1 403 Forbidden Content-Type: text/html Server: Microsoft-IIS/10.0

步骤5:配置SSL/TLS强制HTTPS

在站点绑定中移除HTTP绑定,只保留HTTPS。然后打开"SSL设置" → 勾选"要求SSL" + "需要128位SSL"。

预期输出: ☑ 需要SSL ☑ 需要128位加密

用testssl.sh验证TLS版本(先从https://testssl.sh/下载):

C:\> testssl.sh -E https://your-site.com 预期输出: Testing protocols via Sockets except SSLv2 (done) ... SSLv2 not offered (OK) SSLv3 not offered (OK) TLS 1.0 not offered (OK) TLS 1.1 not offered (OK) TLS 1.2 offered (OK) TLS 1.3 offered (OK)

如果看到TLS 1.0/1.1还在开,需要在注册表强制禁用:

C:\Windows\System32\reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 0 /f WARNING: 修改SCHANNEL注册表可能导致远程桌面等服务中断,生产环境务必在维护窗口操作! 预期输出: 操作成功。

步骤6:限制IP访问只允许白名单

双击"IPv4地址和域限制" → "编辑功能设置" → 选择"允许" → 添加允许的IP段:

允许 10.0.0.0/8 (内网) 允许 192.168.1.0/24 (办公网) 拒绝 0.0.0.0/0 (默认拒绝未知来源) 预期输出: 已添加 IP 地址 10.0.0.0,掩码 255.0.0.0 已添加 IP 地址 192.168.1.0,掩码 255.255.255.0 已更新限制配置。

用命令行查看当前配置:

C:\Windows\System32\inetsrv\appcmd.exe list config "Default Web Site" -section:system.webServer/security/ipSecurity 预期输出: <system.webServer> <security> <ipSecurity allowUnlisted="false"> <add ipAddress="10.0.0.0" subnetMask="255.0.0.0" allowed="true" /> <add ipAddress="192.168.1.0" subnetMask="255.255.255.0" allowed="true" /> </ipSecurity> </security> </system.webServer>

步骤7:配置请求超时和上传大小限制

编辑web.config限制上传文件和请求超时:

<system.web> <httpRuntime maxRequestLength="10240" executionTimeout="120" /> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="10485760" /> </requestFiltering> </security> </system.webServer> 预期输出: maxRequestLength: 10MB maxAllowedContentLength: 10MB executionTimeout: 120秒

参数说明:maxRequestLength是ASP.NET层限制,maxAllowedContentLength是IIS层限制,单位分别是KB和字节。

步骤8:启用日志记录并配置审计策略

在IIS管理器点击服务器节点 → "日志" → 选择W3C格式,勾选以下字段:

时间、客户端IP地址、用户名、方法、URI查询、协议状态、子协议状态、客户端User-Agent、服务器IP、服务器端口 预期输出: 日志格式:W3C 日志目录:C:\inetpub\logs\LogFiles\W3SVC1 日志计划:每日

开启失败请求跟踪用于排查攻击:

C:\Windows\System32\inetsrv\appcmd.exe set config "Default Web Site" -traceEnabled:"true" /commit:apphost 预期输出: 已提交配置完成。

三、常见问题FAQ

Q:配完IP限制后发现所有用户都访问不了,但IP明明在白名单里,怎么回事?

这种情况99%是代理或负载均衡把你的真实IP盖掉了。检查一下X-Forwarded-For头,如果前端有Nginx/Apache代理,需要在IIS装ARR模块并开启"使用代理转发"选项。另外确认服务器本机访问不受IP限制影响,别把127.0.0.1给禁了,不然localhost都打不开。有个土办法:先加一条允许::1(IPv6环回)的规则排除问题。

Q:禁止了目录浏览后仍然能通过路径猜测访问到敏感文件,怎么堵?

目录浏览只是不让列出文件列表,但没加密的配置文件、备份文件照样能被直接请求到。除了步骤3的请求筛选,还需要在服务器层面做:给敏感目录单独配置web.config强制禁止访问,或者直接把备份文件、.git、.svn这些放到网站根目录外面。命令行批量扫描更靠谱:

C:\> Get-ChildItem -Path "C:\inetpub\wwwroot" -Recurse -Include "*.bak","*.old","*.sql","*.git" | Select-Object FullName 预期输出: C:\inetpub\wwwroot\old_backup.zip C:\inetpub\wwwroot\config.php.bak C:\inetpub\wwwroot\.git\config

找到这些直接rm -rf删掉(生产环境先备份到隔离区)。

Q:IIS的请求筛选规则配置了不生效,日志里还是能看到被拦截的请求继续跑,什么鬼?

IIS请求筛选模块有优先级,global规则会覆盖站点规则。先查一下根级别的配置:

C:\Windows\System32\inetsrv\appcmd.exe list config -section:system.webServer/security/requestFiltering 预期输出: <requestFiltering> <fileExtensions allowUnlisted="true" /> <verbs allowUnlisted="true" /> <urlLimits> <!-- 站点级别无法覆盖这里的全局限制 --> </urlLimits> </requestFiltering>

有些企业环境用AD组策略锁死了全局筛选规则,这时候只能用MIME类型白名单或者ISAPI筛选器来实现。还有个坑:请求筛选是区分大小写的,Windows文件系统不区分但IIS会区分,所以禁止..\和禁止../要分别配置。

Q:配置完SSL后某些老客户端连不上,但不想开TLS 1.0/1.1,有没有折中方案?

折中方案就是给特定IP段单独开兼容协议。在注册表建一个区分站点的策略:

C:\Windows\System32\reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\SslBindingInfo\0.0.0.0:443" /v DefaultFlags /t REG_DWORD /d 1 /f WARNING: 保持TLS 1.0/1.1开启超过3个月等于给攻击者留后门,PCI-DSS合规要求2020年就禁了,企业内网请推动升级客户端! 如果是特殊遗留系统需要临时兼容,建议用独立IP单独部署,协议单独配置,且必须加iptables规则限制来源IP不允许对外网开放。

长期方案还是推动业务侧升级,现代浏览器TLS 1.2早就标配了,别让老系统绑架整体安全水位。

四、总结

IIS安全配置核心就三点:关掉不需要的功能模块堵住攻击面、配好访问控制黑白名单、日志记录留着事后追溯。上面这套组合拳做完,至少能挡住80%的自动化扫描和脚本小子。剩下的就是定期更新系统补丁、监控日志异常、别在服务器上装乱七八糟的软件。

核心要点:

  • WebDAV、目录浏览、远程管理接口生产环境必须关
  • Server头和X-Powered-By必须改掉,不给扫描器识别机会
  • 请求筛选规则要同时覆盖URL、查询字符串、请求头
  • SSL/TLS只开1.2及以上,TLS 1.0/1.1是合规红线
  • IP限制记得处理代理场景,别把本机环回地址ban了
  • 日志要开启并定期巡检,光配不看不比不配强多少

延伸阅读:

  • Microsoft官方IIS安全指南:https://docs.microsoft.com/en-us/iis/manage/configuring-security
  • CIS Microsoft IIS 10 Benchmark:加固基线的行业标准参考
  • OWASP Cheat Sheet Series - IIS:https://cheatsheetseries.owasp.org/
  • IIS Crypto工具(禁用弱加密套件图形化操作):https://www.nartac.com/Products/IISCrypto

上一篇: HAProxy:常见问题

已经是最后一篇啦!