写在前面:鉴于文章较为冗长,急于直接了解NTFS权限相关问题的读者可以直接跳到章节六。然而我仍建议有时间的读者将前面的一些基础章节也阅读一番。
[table=100%,#ffffff,#dddddd,1,0]
[tr][td]
<p align=\"left\">
“NTFS
权限”,鉴于NTFS
已经与我们亲密接触了如此长的时间,这个话题可以算是老生常谈了。然而在NT6.x
大幅度改进了系统安全性后,作为安全重要环节的NTFS
权限就不再是远离用户应用的技术。在实践中,部分用户由于特殊的应用需求可能需要对个别受保护的系统文件进行更改,不少用户可能会遇到NTFS
权限设置错误导致的异常,而NTFS
权限与UAC
的结合也为我们的应用带来了更多可能性。要在不损害系统安全性的前提下实现我们的应用目标,就需要对NTFS
权限的内容与配置方法有个初步的了解。是而为此文。</p><p align=\"left\">
严格的说,NTFS
权限的正式称谓是ACL
(访问控制列表),因而在下文的陈述中也会逐步的引入ACL
的概念。同时由于ACL
广泛应用于系统权限控制中,因而本文所陈述的内容虽以NTFS
权限为主,但可以类推于其他具备ACL
特性的情景中,如注册表。</p>
<p align=\"left\">
</p><p align=\"left\">
一、谈论ACL时不得不说的话题——用户与组</p><p align=\"left\">
权限设置,必然是为授予某一群体对对象的访问权而设立,而用户与组正是这被授权的群体。用户是授予权限的最小单位,而组可以视作是用户的集合。用户与组都使用SID
作为其唯一标识符。比起活动目录域中域本地组、全局组、通用组及其嵌套、转换所带来的多彩缤纷的应用相比,单机环境下的用户与组要简单得多。这里主要介绍一些具备特殊功能定位的用户与组。</p>
[indent]
<p align=\"left\">
l Administrator
:用户。所谓“超级管理员”,默认禁用。在系统默认的安全策略下,其不受UAC
约束且将以管理员身份运行任何程序。鉴于这一特性将严重降低系统安全性,不建议将其启用。</p><p align=\"left\">
l Guest
:用户。来宾帐户,默认禁用。相较于普通用户帐户,来宾帐户受到更多限制。在于“控制面板\
用户帐户和家庭安全\
用户帐户\
管理帐户”中启用来宾帐户后,此帐户也将被启用。</p><p align=\"left\">
l HomeGroupUser$
:用户。家庭组用户帐户。用于实现家庭组简化的、安全的共享功能。在创建家庭组后,此帐户将被创建及启用。</p><p align=\"left\">
l TrustedInstaller
:特殊用户。可信任的安装程序,实质上其指代的是一种特殊的服务,与Windows Modules Installer
服务关系很大。可通过直接输入名称NTSERVICE\TrustedInstaller
将其添加到ACL
中。</p><p align=\"left\">
l Administrators
:组。所有管理员帐户都是Administrators
组的成员。在ACL
中,针对管理员的权限设置,通常使用Administrators
组进行分配。注意在UAC
启用的情况下,非经提权,仅有Administrators
组的拒绝权限会应用到普通管理员。</p><p align=\"left\">
l Users
:组。所有用户帐户都是Users
组的成员。在ACL
中,针对用户的权限设置,通常使用Users
组进行分配。</p><p align=\"left\">
l HomeUsers
:组。在ACL
中,针对家庭组的权限设置,通常使用HomeUsers
组进行分配。</p><p align=\"left\">
l Authenticated Users
:特殊组。是所有在本系统或域内有合法账户的用户的集合。</p><p align=\"left\">
l Everyone
:特殊组。顾名思义,所有用户的集合,无论其是否拥有有合法账户。</p><p align=\"left\">
l Creator Owner
:特殊组。创建对象或目前是对象所有者的用户的集合。实质上此组的作用是:当它存在于ACL
中时,将同时将所有者用户帐户以设定的权限添加进ACL
。</p><p align=\"left\">
l Owner Rights
:特殊组。此组的作用主要在于限制对象所有者隐性的查看、更改ACL
的权限。</p><p align=\"left\">
l SYSTEM
:特殊组。本地系统。相当多的服务使用此身份运行,如Windows Search
。</p>[/indent]
<p align=\"left\">
</p><p align=\"left\">
二、可以做什么?——可以分配的权限</p><p align=\"left\">
事实上当ACL
被应用于不同的场景时,其有不同的权限可供分配。这里仅介绍基于NTFS
的ACL
权限分配可选项。</p><p align=\"left\">
从类型上看,权限包括标准权限与特定权限。标准权限是由指定的特定权限与指定的作用域组成的。</p><p align=\"left\">
基于NTFS
的ACL
中,标准权限有:</p>
[indent]
<p align=\"left\">
l完全控制(完全控制+
遍历文件夹/
执行文件+
列出文件夹/
读取数据+
读取属性+
读取扩展属性+
创建文件/
写入数据+
创建文件夹/
附加数据+
写入属性+
写入扩展属性+
删除子文件夹及文件+
删除+
读取权限+
更改权限+
取得所有权)</p><p align=\"left\">
l修改(遍历文件夹/
执行文件+
列出文件夹/
读取数据+
读取属性+
读取扩展属性+
创建文件/
写入数据+
创建文件夹/
附加数据+
写入属性+
写入扩展属性+
删除+
读取权限,作用域:此文件夹、子文件夹和文件)</p><p align=\"left\">
l读取和执行(遍历文件夹/
执行文件+
列出文件夹/
读取数据+
读取属性+
读取扩展属性+
读取权限,作用域:此文件夹、子文件夹和文件)</p><p align=\"left\">
l列出文件夹内容(遍历文件夹/
执行文件+
列出文件夹/
读取数据+
读取属性+
读取扩展属性+
读取权限,作用域:此文件夹和子文件夹)</p><p align=\"left\">
l读取(列出文件夹/
读取数据+
读取属性+
读取扩展属性+
读取权限,作用域:此文件夹、子文件夹和文件)</p><p align=\"left\">
l写入(创建文件/
写入数据+
创建文件夹/
附加数据+
写入属性+
写入扩展属性,作用域:此文件夹、子文件夹和文件)</p><p align=\"left\">
l特殊权限(其他特定权限与作用域的结合)</p>[/indent]
<p align=\"left\">
</p><p align=\"left\">
基于NTFS
的ACL
中,特定权限有:</p>
[indent]
<p align=\"left\">
l完全控制</p><p align=\"left\">
l遍历文件夹/
执行文件</p><p align=\"left\">
l列出文件夹/
读取数据</p><p align=\"left\">
l读取属性l读取扩展属性</p><p align=\"left\">
l创建文件/
写入数据</p><p align=\"left\">
l创建文件夹/
附加数据</p><p align=\"left\">
l写入属性</p><p align=\"left\">
l写入扩展属性</p><p align=\"left\">
l删除子文件夹及文件</p><p align=\"left\">
l删除</p><p align=\"left\">
l读取权限</p><p align=\"left\">
l更改权限</p><p align=\"left\">
l取得所有权</p>[/indent]
<p align=\"left\">
</p><p align=\"left\">
基于NTFS
的ACL
中,作用域有:</p>
[indent]
<p align=\"left\">
l只有该文件夹</p><p align=\"left\">
l此文件夹、子文件夹及文件</p><p align=\"left\">
l此文件夹和子文件夹</p><p align=\"left\">
l此文件夹和文件</p><p align=\"left\">
l仅子文件夹和文件</p><p align=\"left\">
l只有子文件夹</p><p align=\"left\">
l只有文件</p>[/indent]
<p align=\"left\">
但是在实际对权限的配置中,由于继承、权限选项与特殊组的存在,作用域并不是绝对的。</p><p align=\"left\">
</p><p align=\"left\">
此外,“所有者”也可视为一种特殊的权限设置。所有者始终具备查看、更改对象的隐性权限(除非以Owner Rights
进行限制)。任何管理员帐户或其他具备“取得所有权”权限的帐户都可以强行更改对象所有权。取得所有权是接管对象的重要步骤,具体的接管对象的方法则会在下面的文章中提到。</p>
<p align=\"left\">
三、如何简化ACL配置?——权限选项</p><p align=\"left\">
在高级权限设置(属性\
安全\
高级)中,我们可以遇到一些权限选项。权限选项对于简化对ACL
的配置作用很大。这些权限选项包括:</p>[indent]
<p align=\"left\">
l包括可从该对象的父项继承的权限:以当前对象为子对象,在子对象及其父对象之间建立继承关系,并用父对象权限设置替换子对象权限设置。去除该选项的勾选可以阻断继承关系。</p><p align=\"left\">
l使用可从此对象继承的权限替换所有子对象权限:以当前对象为父对象,在父对象及其子对象之间建立继承关系,并用父对象权限设置替换子对象权限设置。</p><p align=\"left\">
l仅将这些权限应用到此容器中的对象和/
或容器:作用域仅及于对象下的第一层文件/
文件夹而不涉及更深层次的文件/
文件夹。</p><p align=\"left\">
l替换子容器和对象的所有者:将对象中的所有文件/
文件夹的所有者变更为当前对象的所有者。</p>[/indent]
<p align=\"left\">
四、有效权限是如何计算的?——权限规则</p><p align=\"left\">
权限规则很简单,仅仅两条:</p><p align=\"left\">1
、“指定”优先于“继承”</p><p align=\"left\">
即一个对象上对某用户/
组的明确权限设置优先于继承而来的对该用户/
组的权限设置。例如:</p><p align=\"left\">
现有文件夹folderA
,folderA
中有子文件夹folderB
,folderB
与folderA
存在权限继承关系。对于用户User
,folderA
拒绝其拥有写入权限,而folderB
在继承而来的权限设置之外,还单独赋予User
写入权限。此时,User
对folderB
拥有写入权限。</p><p align=\"left\">2
、“拒绝”优先于“允许”</p><p align=\"left\">
即当除规则1
的情形外,对某用户/
组同时赋予允许和拒绝权限时,拒绝权限优先。例如:</p><p align=\"left\">
现有文件夹folderA
及用户User
,User
同时隶属于GroupA
和GroupB
两个组。对于GroupA
,folderA
赋予其完全控制权限,对于GroupB
,folderA
拒绝其拥有写入权限。此时User
不具备对folderA
的写入权限。</p><p align=\"left\">
当然,我们不必自己手动计算权限结果,而可以使用“有效权限”选项卡来自动计算某一用户/
组的有效权限。但需要注意的是它并不会考虑UAC对权限分配的影响。</p>[/td][/tr]
[/table]
<p align=\"left\">
五、系统是如何配置ACL的?——默认ACL分析</p><p align=\"left\">
出于对安全性和易用性平衡的追求,系统分区默认即具备一整套严密的ACL
配置。对部分典型默认ACL
的分析,既可为我们解决权限相关问题打下基础,又可为我们实现基于权限控制的特殊应用需求提供范例。</p>
[table=100%,#ffffff,#dddddd,1,0]
[tr][td] <p align=\"left\">C
盘根目录</p> [/td][td] <p align=\"left\">
所有者:TrustedInstaller</p> [/td][/tr]
[tr][td] <p align=\"left\">
权限分配</p> [/td][/tr]
[tr][td] <p align=\"left\">Administrators
组</p> [/td][td] <p align=\"left\">
完全控制</p> [/td][/tr]
[tr][td] <p align=\"left\">SYSTEM
组</p> [/td][td] <p align=\"left\">
完全控制</p> [/td][/tr]
[tr][td] <p align=\"left\">Users
组</p> [/td][td] <p align=\"left\">
读取和执行</p> [/td][/tr]
[tr][td] <p align=\"left\">Authenticated Users
组</p> [/td][td] <p align=\"left\">
特殊(应用于“仅子文件夹和文件”的遍历文件夹/
执行文件+
列出文件夹/
读取数据+
读取属性+
读取扩展属性+
创建文件/
写入数据+
创建文件夹/
附加数据+
写入属性+
写入扩展属性+
删除+
更改权限 AND
应用于“只有该文件夹”的创建文件夹/
附加数据)</p> [/td][/tr]
[tr][td][/td][td][/td][td][/td][/tr]
[/table]<p align=\"left\">C
盘根目录的权限设置典型特征是,未提权的情况下,普通管理员仅可以创建文件夹或删除这些之后被创建的文件夹。提权后,普通管理员可以向C
盘根目录写入、更改、删除文件。</p><p align=\"left\">
在之前的文章中我们已经提到,启用UAC
的情景下,非经提权,仅有Administrators
组的拒绝权限会应用到普通管理员。这意味着C
盘根目录中Administrators
的完全控制权限对未经提权的普通管理员的权限分配没有作用。此时一个普通管理员的所拥有的权限实际上是Authenticated Users
组与Users
组权限的集合。当然,普通管理员可以通过提权而获得Administrators
组的完全控制权限。但非经提权的程序将被拒绝向C
盘根目录写入文件。</p>
[table=100%,#ffffff,#dddddd,1,0]
[tr][td] <p align=\"left\">Program Files</p> [/td][td] <p align=\"left\">
所有者:TrustedInstaller</p> [/td][/tr]
[tr][td] <p align=\"left\">
权限分配</p> [/td][/tr]
[tr][td] <p align=\"left\">SYSTEM
组</p> [/td][td] <p align=\"left\">
特殊(应用于“只有该文件夹”的遍历文件夹/
执行文件+
列出文件夹/
读取数据+
读取属性+
读取扩展属性+
创建文件/
写入数据+
创建文件夹/
附加数据+
写入属性+
写入扩展属性+
删除+
读取权限 AND
应用于“仅子文件夹和文件”的完全控制)</p> [/td][/tr]
[tr][td] <p align=\"left\">Administrators
组</p> [/td][td] <p align=\"left\">
特殊(同SYSTEM
)</p> [/td][/tr]
[tr][td] <p align=\"left\">Users
组</p> [/td][td] <p align=\"left\">
读取和执行</p> [/td][/tr]
[tr][td] <p align=\"left\">Creator Owner
组</p> [/td][td] <p align=\"left\">
特殊(应用于“仅子文件夹和文件”的完全控制)</p> [/td][/tr]
[tr][td] <p align=\"left\">TrustedInstaller
用户</p> [/td][td] <p align=\"left\">
特殊(同Creator Owner
)</p> [/td][/tr]
[tr][td][/td][td][/td][td][/td][/tr]
[/table]<p align=\"left\">Program Files
是系统默认的程序安装文件夹,它单独设置了ACL
而没有继承来自C
盘根目录的权限。Program Files
的权限设置典型特征与C
盘根目录较为相似,但普通管理员除“读取和执行”外的操作都需要提权。</p>
[table=100%,#ffffff,#dddddd,1,0]
[tr][td] <p align=\"left\">Windows\WinSxS</p> [/td][td] <p align=\"left\">
所有者:TrustedInstaller</p> [/td][/tr]
[tr][td] <p align=\"left\">
权限分配</p> [/td][/tr]
[tr][td] <p align=\"left\">SYSTEM
组</p> [/td][td] <p align=\"left\">
读取和执行</p> [/td][/tr]
[tr][td] <p align=\"left\">Administrators
组</p> [/td][td] <p align=\"left\">
读取和执行</p> [/td][/tr]
[tr][td] <p align=\"left\">Users
组</p> [/td][td] <p align=\"left\">
读取和执行</p> [/td][/tr]
[tr][td] <p align=\"left\">TrustedInstaller
用户</p> [/td][td] <p align=\"left\">
完全控制</p> [/td][/tr]
[tr][td][/td][td][/td][td][/td][/tr]
[/table]<p align=\"left\">Windows
目录作为系统文件夹,重要性不言而喻,其ACL
配置也更为复杂,大量使用非继承的权限配置设定对象权限。其中,WinSxS
目录是一种典型的高强度权限设置状态。普通管理员不能对当中的文件、文件夹作任何添加、更改、删除,即便提权后也是如此(因为Administrators
组也仅拥有“读取和执行”的权限)。</p>
[table=100%,#ffffff,#dddddd,1,0]
[tr][td] <p align=\"left\">
用户\Contoso</p> [/td][td] <p align=\"left\">
所有者:SYSTEM</p> [/td][/tr]
[tr][td] <p align=\"left\">
权限分配</p> [/td][/tr]
[tr][td] <p align=\"left\">SYSTEM
组</p> [/td][td] <p align=\"left\">
完全控制</p> [/td][/tr]
[tr][td] <p align=\"left\">Administrators
组</p> [/td][td] <p align=\"left\">
完全控制</p> [/td][/tr]
[tr][td] <p align=\"left\">Contoso
用户</p> [/td][td] <p align=\"left\">
完全控制</p> [/td][/tr]
[tr][td][/td][td][/td][td][/td][/tr]
[/table]<p align=\"left\">
相对而言,用户文件夹的权限设置要宽松很多。比如在我们这里举例的名为Contoso
的用户文件夹中,SYSTEM
组、Administrators
组与Contoso
用户本身都享有对文件夹的完全控制权限。仅有其他用户试图访问此用户文件夹时才会收到权限不足的警告,不过对身为管理员的他们来说,为自己的帐户分配权限并不是什么难事。</p>
<p align=\"left\">
从对默认ACL
的分析不难看出,我们可以利用启用UAC
时非经提权仅有Administrators
组的拒绝权限会应用到普通管理员的特性来构建特殊的受保护文件夹。这类文件夹的特征是未经管理员批准(即提权),任何用户、程序不能对该文件夹的内容进行更改。具体的权限配置方法上,即是在用户所普遍隶属的Users
组上设置普通权限(如读取和访问),而在Administrators
组上设置高权限(如完全控制)。</p>
<p align=\"left\">
六、自己动手,解决权限问题</p><p align=\"left\">
针对NTFS
权限相关问题,网络上往往流传着一些“一键取得管理员权限”的基于注册表的简易解决方案。诚然,这类解决方案在一定程度上简化了对NTFS
权限相关问题的解决,但其副作用也很明显,如用户无法恢复原文件夹的ACL
设置。当用户将这种解决方案应用到系统受保护的区域时,将可能引发安全性问题。事实上手动解决权限问题并不复杂,在解决的过程中,用户也可以更好的理解与应用NTFS
权限。</p>
<p align=\"left\">
例一:如何暂时性的获取对对象的相应操作权限?</p><p align=\"left\">
一些时候(如美化),用户可能因为特殊需求而需要更改受保护的系统文件;另一些时候,用户可能需要移除卸载应用程序后的残留文件(如卸载Adobe Reader
后其程序目录中所剩下的一些文件)。但当用户遇到权限不足的警告时,应当如何去临时性的获取对对象的相应操作权限呢?</p><p align=\"left\">
首先,如果并非是要删除对象,那么请记录好原对象的ACL
设置情况,如所有者、权限、继承等;</p><p align=\"left\">
第二,将对象的所有者更改为当前用户,可以根据具体情况考虑是否替换子容器和对象的所有者;</p><p align=\"left\">
第三,将当前用户添加到ACL
中,为其分配适当的权限,可以根据具体情况考虑是否使用可从此对象继承的权限替换所有子对象权限;</p><p align=\"left\">
第四,进行需要的操作;</p><p align=\"left\">
第五,如果并非是要删除对象,那么请比照原对象的ACL
设置情况恢复对象权限设置,如删除之后添加到ACL
中的用户帐户、重新更改对象所有者等。</p><p align=\"left\">
概而言之,强行设置所有者+
为当前用户分配权限后,当前用户即可享有对对象的相应操作权限。</p>
<p align=\"left\">
例二:如何去除对象上的小锁?</p><p align=\"left\">
严格的说这并不是什么大问题,但鉴于经常有朋友提出需要修正这一问题,故而顺带谈一谈。对象上带有小锁图标,代表该对象设定了指定(而非继承)的权限,该权限表明对象在非提权的情况下专属于一个用户帐户。如在简单的通过快捷菜单将对象设置为“不共享”后,系统将为对象分配这样指定的权限。解决方案也很简单,既可以将对象设置为继承父对象权限(包括可从该对象的父项继承的权限),也可以比照同级对象配置对象权限。当然,并非所有具备小锁的对象都需要去修正,如用户文件夹的权限设置就具有指定的用户专属权限,这是由对象的定位决定的。</p>
<p align=\"left\">
七、结语</p><p align=\"left\">
这篇文章,算是我迄今为止构思最久、撰写最久也最为冗长的文章了。想将灵活多变的NTFS
权限正确而有意义的表达并不是很容易的事,而我几乎可以肯定文章中存在着某些我暂时无法发现的谬误。我亦不能确定是否每位读者都会将冗长的全文通读(毕竟对用户最有意义的部分仅仅是章节六)。然而写作的过程也是一个自我提高的过程,我亦乐意与读者分享这提高的乐趣。</p>
[ 此帖被在2014-10-11 19:16重新编辑 ]