windows服务器目录权限安全配置怎么做?NTFS 权限、共享权限和 icacls 的叠加规则
Windows 上配目录权限最让人困惑的不是命令难而是同样的给某人读写权限有两套互不隶属的地方可以配。在共享上配了完全控制、在 NTFS 上只给读最后这个人只能读反过来也一样。很多人卡在这里反复改两边越改越乱。这篇按先看清现状 → 再理解规则 → 最后动手的顺序讲命令为主。一、两套权限不是一套共享权限ShareNTFS 权限Security在哪配文件夹属性的共享→高级共享→权限文件夹属性的安全选项卡粒度只有三种读取、更改、完全控制可细化到写入属性、删除子文件夹等十几项影响范围只影响通过网络访问的用户本地登录、远程桌面、网络访问都受影响依赖文件系统任意FAT 也能用必须是 NTFS微软文档里那句最关键的话是共享权限不影响本地登录或通过远程桌面登录的用户要限制这类人只能在安全选项卡上用 NTFS 权限。也就是说在云主机上用远程桌面进去操作文件的人共享权限对他完全无效。这一条能解释大半我明明配了权限怎么还是能改的困惑。另一条是两套都配了怎么办取更严格的那个微软原文if both share permissions and file system permissions are set, the more restrictive permissions apply。微软给的推荐做法也因此是反直觉的——把共享权限设成Everyone完全控制然后全部用 NTFS 权限收紧。这样只需要维护一套规则。另外提一句模型差异Windows 的 ACL 是 DACL 继承和 Linux 的ugorwx是两套完全不同的东西在 Linux 上配权限的思路搬过来不管用尤其是所有者/所属组/其他这个三分法在这里不存在。二、先把现状看清楚动手之前先看清楚现在是什么样用icacls微软文档明确写了它取代了已废弃的caclsC:\ icacls C:\inetpub\wwwroot C:\inetpub\wwwroot BUILTIN\Administrators:(I)(OI)(CI)(F) NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F) BUILTIN\Users:(I)(OI)(CI)(RX) CREATOR OWNER:(I)(OI)(CI)(IO)(F) IIS_IUSRS:(OI)(CI)(RX) Successfully processed 1 files; Failed processing 0 files每一行的结构都一样主体 : (继承标记)(权限)。主体BUILTIN\Administrators、NT AUTHORITY\SYSTEM、IIS_IUSRS这类内置组或具体的用户/SID。I这条 ACE 是从父目录继承下来的不是你自己加的。OI/CIobject inherit子文件继承/ container inherit子目录继承。没有这两个标记权限就只作用于当前这一层。IOinherit only只对子项生效不影响当前对象本身。权限F完全控制、M修改、RX读取和执行、R只读、W只写、D删除、N无。看懂I很关键带I的条目改不动只能改父目录或者在当前层用/inheritancelevel断开继承。判断某人最终有什么权限之前还有个前置问题要先回答他在哪些组里。whoami :: 当前身份 whoami /groups :: 我属于哪些组以及这些组是否处于启用状态 whoami /priv :: 我持有哪些特权 net user svc-app :: 查看某个账号的组成员关系whoami /groups的输出里只有标记为启用的组才会计入有效权限。另外whoami /priv值得单独看一眼持有SeBackupPrivilege之类特权的账号在读文件时不走 ACL 检查这就解释了明明没给授权他还是能打开的一部分情况——不是权限配错了是特权绕过了 ACL。三、四条判定规则权限最终生效的结果靠这四条推出来1. 显式优先于继承。直接加到这个目录上的 ACE压过从父目录继承来的 ACE。2. 拒绝优先于允许。微软文档给出的 ACE 规范顺序是显式拒绝 → 显式允许 → 继承拒绝 → 继承允许icacls会维持这个顺序。所以给某个人加一条拒绝能把他从组里得到的允许权限直接压掉——这也是拒绝要慎用的原因一旦加了靠调组权限是救不回来的。3. 用户权限与组权限累加。一个人既被直接授予读、又属于一个拥有更改权限的组那他的有效权限是更改取并集后最宽的那个而不是被更严格的覆盖。4. 两套权限取交集里最严的。共享权限和 NTFS 权限互相独立、互不影响最终按更严格的执行。把这四条摆在一起看就明白为什么排查时不能只盯一个选项卡你得同时确认他属于哪些组“有没有显式拒绝”“共享侧给了多少”“NTFS 侧给了多少”。四、icacls 实操以下都是 cmd 里的写法PowerShell 里同样能跑。:: 授予不带 :r 是追加到已有的显式授权带 :r 是替换已有显式授权 icacls C:\data /grant IIS_IUSRS:(OI)(CI)RX icacls C:\data /grant:r appuser:(OI)(CI)M :: 显式拒绝会加一条拒绝 ACE并移除显式授予中的相同权限 icacls C:\data /deny Guest:(OI)(CI)F :: 移除某主体的所有授权:g 移除授予:d 移除拒绝 icacls C:\data /remove:g Everyone icacls C:\data /remove:d Guest :: 继承开关 icacls C:\data /inheritancelevel:r :: r 禁用继承并删除继承来的 ACE icacls C:\data /inheritancelevel:d :: d 禁用继承但把继承来的 ACE 复制成本地的 icacls C:\data /inheritancelevel:e :: e 重新启用继承 :: 备份与还原改权限前的保命操作 icacls C:\data\* /save acl-backup.txt /t icacls C:\data\ /restore acl-backup.txt :: 改所有者 icacls C:\data /setowner BUILTIN\Administrators /t /c :: 查某个 SID 出现在哪些文件上清残留账号很有用 icacls C:\data /findsid *S-1-1-0 /t :: 检查 ACL 是否规范非规范顺序或长度不一致会被找出来 icacls C:\data /verify /t :: 全部恢复为继承来的默认 ACL icacls C:\data /reset /t /c几个容易用错的点/grant与/grant:r差别很大。不带:r时权限是叠加的反复执行会把同一主体的权限越加越多要设成正好这么多必须带:r。/deny是加一条拒绝 ACE。能用组权限解决的别用拒绝——拒绝一旦加上后面所有给更大权限的操作都会被它压住排查起来非常费劲。高级权限要用括号写例如只给遍历/执行 读取icacls C:\data /grant user:(OI)(CI)(X,RD)。常用代号RD读数据、WD写数据、AD追加/建子目录、X执行或遍历、DE删除、WDAC改权限、WO改所有者。目录树很大时加/t递归和/c出错继续/q抑制成功提示。数值形式写 SID 时前面要加*例如*S-1-1-0。五、共享权限怎么配按微软的推荐做法共享权限放宽NTFS 收紧。# 建共享共享权限Everyone 完全控制New-SmbShare-Namedata-PathC:\data-FullAccessEveryone# 之后用 NTFS 权限真正控制谁能干什么icacls C:\data/inheritancelevel:r icacls C:\data/grant:rBUILTIN\Administrators:(OI)(CI)(F)icacls C:\data/grant:rappgroup:(OI)(CI)(M)# 查看 / 调整共享权限Get-SmbShareAccess-NamedataGrant-SmbShareAccess-Namedata-AccountNameEveryone-AccessRight Full-Force这里有个版本差异值得记不同 windows服务器版本、不同 windows服务器系统 代次上 SMB 的默认版本和可用加密强度不一样老客户端连不上新服务器时通常不是权限问题而是 SMB 版本协商失败——先确认协议能通再回头查 ACL。顺便澄清一个常见误操作Everyone在 Windows 里包含匿名和来宾给Everyone写权限等于把目录对外敞开。要所有人可访问时更稳妥的写法是给Authenticated Users或具体的业务组。一个完整的例子假设要把D:\app给应用账号svc-app读写、给运维组只读、其他人一律不许访问并且不继承上层的宽权限——做 windows服务器目录权限安全配置 时最稳妥的顺序是先备份、再断开、后授权:: 1. 备份现有 ACL icacls D:\app\* /save D:\acl-app.txt /t :: 2. 断开继承但把继承来的 ACE 留成本地副本 icacls D:\app /inheritancelevel:d :: 3. 精确删掉不需要的主体 icacls D:\app /remove:g BUILTIN\Users icacls D:\app /remove:g Everyone :: 4. 按正好这些权限授权 icacls D:\app /grant:r BUILTIN\Administrators:(OI)(CI)(F) icacls D:\app /grant:r svc-app:(OI)(CI)(M) icacls D:\app /grant:r ops-ro:(OI)(CI)(RX) :: 5. 复核 icacls D:\app第 2 步用d保留副本而不是r删除继承项是刻意的选择r会把继承来的 ACE 全部丢掉目录上只剩你后面显式加的那几条一旦漏了SYSTEM或 Administrators服务可能直接起不来用d保留副本再逐条删可控得多。这类批量、可复现的操作用 windows运维工具 里的图形界面点几台机器还行几十台就必须落到脚本——icacls的输出是纯文本天然适合做基线比对和批量下发。六、云上 Windows 实例的三处不同在云主机上做 windows服务器目录权限安全配置有三条和自建机房不一样1. 默认登录名是 AdministratorRDP 走 3389。各家文档一致Windows 实例默认用户名是Administrator——阿里云《使用Workbench登录Windows实例》与华为云《Windows ECS登录方式概述》都写明了这一点远程桌面则需要在安全组里放通 3389。所以 Windows server服务器分配用户权限 的第一步其实不在目录上而是先决定谁能远程桌面进来远程桌面用户组 安全组来源 IP再谈目录 ACL权限配得再细安全组放开 0.0.0.0/0 也是白搭。2. 445 / 139 在公网基本连不通。腾讯云《端口与安全组相关》里明确列了一批存在安全隐患、出于安全因素运营商将其拦截的端口其中就包括TCP 135、137、138、139、445并建议不要使用这些端口监听。这意味着在安全组里放通了 445公网的 SMB 共享大概率还是连不上。要跨公网传文件改用远程桌面的磁盘/剪贴板映射、走 VPN 或专线进内网、或者干脆换成 SFTP / 对象存储——别在 445 上耗时间。3. 改权限把自己关在外面时有退路。云主机最大的好处是不用进机房阿里云可以用 Workbench浏览器直连走私网华为云和腾讯云都有控制台 VNC。把 Administrators 的权限改没、或者目录所有者改错导致打不开走控制台进去改回来即可比本地物理机从容得多。顺序上建议打快照 → 备份 ACLicacls /save→ 改 → 用目标账号验证 → 再收工。备份 ACL 这一步在 Windows 上比快照还快恢复也精准。七、改完怎么验证打开对象访问审计权限配完之后到底有没有人访问、有没有被拒绝这件事光看 ACL 是看不出来的。Windows 侧对应的机制是 SACL系统访问控制列表 审计策略两层都要开:: 系统层面启用文件系统审计子类别 auditpol /set /subcategory:File System /success:enable /failure:enable :: 确认是否生效 auditpol /get /subcategory:File System然后在目标目录上配置 SACL属性 → 安全 → 高级 → 审计或者用 PowerShell$aclGet-AclD:\app-Audit$ruleNew-ObjectSystem.Security.AccessControl.FileSystemAuditRule(Everyone,WriteData,Delete,ContainerInherit,ObjectInherit,None,Success,Failure)$acl.AddAuditRule($rule)Set-AclD:\app$acl之后安全日志里会出现三类事件微软的高级审核策略文档里对它们的定义分别是4656请求了对象的句柄记录请求的是哪些访问权限、4663尝试访问了对象记录真正做了什么读、写、删除、4658句柄被关闭。文档同时明确只有配置了 SACL 的对象才会产生这些事件而且只有当访问类型和发起账户与 SACL 匹配时才会生成。所以看日志要 4656 和 4663 对着看前者是想要什么权限后者是真正做了什么。两者不一致时往往就是权限配得不对的信号——比如应用只被授予读却不断请求写。Get-WinEvent-FilterHashtable {LogNameSecurity;Id4663}-MaxEvents 50|Select-ObjectTimeCreated,{n对象;e{$_.Properties[6].Value}}两条提醒只对真正要盯的目录开审计全盘开会把安全日志撑爆也会拖慢 IO排查完记得关掉auditpol /set /subcategory:File System /success:disable /failure:disable。审计是 windows服务器目录权限安全配置 里唯一能回答到底谁动过、什么时候动的的环节前面六节讲的都是谁可以动。八、六个常见坑坑一只改了一边。共享给了完全控制、NTFS 还是只读结果就是只读。排查时两边都看取最严的那个。坑二改了带I的条目发现改不动。那是从父目录继承的。要么改父目录要么在当前层/inheritancelevel:r断开继承再配。坑三/grant不带:r权限越加越多。想设定成正好这些权限一定要带:r。坑四用/deny解决单个人的问题。拒绝优先级最高后面所有授权都会被它压住。能用从组里移除解决的就不要加拒绝。坑五忘了OI/CI子目录没继承到。只在当前层加权限新建的子文件不会有——表现为老文件能访问新建的就不行。坑六用 Administrator 自己验证权限。管理员组成员受 UAC 和令牌影响看到的结果和普通用户不一样。验证要用目标账号真的去访问一次或者开一个非管理员会话。九、速查表想干什么命令看当前权限icacls C:\data授予替换icacls C:\data /grant:r user:(OI)(CI)M授予追加icacls C:\data /grant user:(OI)(CI)RX显式拒绝icacls C:\data /deny user:(OI)(CI)F移除主体授权icacls C:\data /remove:g user断开继承icacls C:\data /inheritancelevel:r备份 ACLicacls C:\data\* /save acl.txt /t还原 ACLicacls C:\data\ /restore acl.txt改所有者icacls C:\data /setowner BUILTIN\Administrators /t全部恢复默认icacls C:\data /reset /t /c查残留 SIDicacls C:\data /findsid *SID /t建共享New-SmbShare -Name data -Path C:\data -FullAccess Everyone看共享权限Get-SmbShareAccess -Name data落地顺序固定成六步备份 ACL → 看现状icacls→ 断开不需要的继承 → 按组授权/grant:r→ 共享侧放宽、NTFS 侧收紧 → 用目标账号验证。回到最开始那句话windows服务器目录权限安全配置 之所以容易乱是因为它有两层共享、NTFS、两个方向显式、继承、两种动作允许、拒绝。把这六个概念摆清楚剩下的就是照着速查表敲命令——比反复点对话框试错快得多。