揭开AdminSDHolder的神秘面纱

绝大多数活动目录管理员通过以下类似的场景认识了AdminSDHolder:

您在一个OU上委派了某些权限。但是,后来您发现在这个OU下不是所有的账户都受到该权限的影响。而且,您会发现,那些没有受到影响的账户的访问控制列表(ACL)跟那些受到影响的账户的ACL不一样,并且没有受到影响的账户的继承选项也没有被选中。您可能通过勾选继承选项临时解决了这个问题。但是一段时间之后,相同的问题再次出现。这到底怎么回事呢?

原因就是,那些没有受到影响的账户属于某些Protected groups,所以这些账户的ACL会与AdminSDHolder对象上的ACL保持一致,同时其继承选项不会被选中。当在这些账户上手动选中继承选项之后,委托的权限会影响这些账户的ACL。但是,一旦特定的后台程序运行,该后台程序就会重置这些账户的ACL以便与AdminSDHolder对象上的ACL匹配,同时其继承选项不会被选中。这个后台程序会在PDC操作主机上运行,默认运行间隔为一个小时。

明白了上面的场景发生的原因,那您可能又会问了,为什么搞得这么复杂呢?其实设置AdminSDHolder的目的是为了防止特权用户和重要的组被无意的修改。引入这样的机制之后,那些Protected groups和它们的成员都得到了更进一步的安全保护。

每个活动目录域中都有一个AdminSDHolder对象,在域的System容器中。其distinguished name(标识名)为:"CN=AdminSDHolder, CN=System, DC=domain, DC=com,"其中DC=domain, DC=com是您域的标识名。如图一AdminSDHolder所示。

图一、AdminSDHolder

AdminSDHolder在Windows 2000 Server活动目录中引入。到现在的Windows 2008 R2,其Protected groups的成员扩展了很多,下表显示了相关信息。所有这些组的成员都会受AdminSDHolder的影响。

操作系统

Protected groups

Windows 2000 Server RTM

Windows 2000 Server SP1

Windows 2000 Server SP2

Windows 2000 Server SP3

Administrators; Domain Admins

Enterprise Admins; Schema Admins

Windows 2000 Server SP4

Windows Server 2003 RTM

Account Operators; Administrators

Backup Operators; Cert Publishers

Domain Admins; Domain Controllers

Enterprise Admins; Print Operators

Replicator; Schema Admins; Server Operators

Windows Server 2003 SP1

Windows Server 2003 SP2

Account Operators; Administrators

Backup Operators; Domain Admins

Domain Controllers; Enterprise Admins

Print Operators; Replicator

Schema Admins; Server Operators

Windows Server 2008 RTM

Windows Server 2008 R2

Account Operators; Administrators

Backup Operators; Domain Admins

Domain Controllers; Enterprise Admins

Print Operators; Replicator

Read-only Domain Controllers

Schema Admins; Server Operators

从Windows 2000 Server SP4开始,除了上表中的安全组被AdminSDHolder保护之外,Krbtgt这个用户也被保护,因为这个用户对Kerberos至关重要。

看到这里,您肯定想在自己的系统中亲眼看看这些被保护的对象了吧?可是一个一个的去找未免也太麻烦了。好吧,这就介绍一种方法来查看这些对象。被AdminSDHolder保护的对象有一个共同特征,那就是对象属性admincount的值为1,我们可以利用这个特征查询。在这里推荐一个强大的工具ADFind.exe,该工具集合了ldapsearch,dsquery,dsget等工具的功能,并且可以在几乎所有的server操作系统中运行。在命令行中输入以下两条命令就可以分别查看受保护的用户和组的信息。

Adfind.exe -b DC=domain,DC=com -f "&(objectcategory=person)(samaccountname=*)(admincount=1)" –dn

Adfind.exe -b DC=domain,DC=com -f "&(objectcategory=group)(admincount=1)" -dn

在笔者的Windows 2008 server环境中,实际运行情况如图二受保护的用户以及图三受保护的组所示。

图二、受保护的用户

图三、受保护的组

那么多组都处于被保护中,聪明的读者肯定又有疑问了:假如想对某些组进行定制,比如想让Print Operators组管理打印服务而不是管理活动目录,但因为没有办法改变它的ACL,所以无法做到,怎么办呢?

把想要进行定制的组从Protected groups列表中删除就可以达到这个目的了。操作系统版本在Windows 2003 Server SP2以前的可以通过安装一个Hotfix达到这种目的,而从Windows 2003 Server SP2就不需要安装任何Hotfix了。关于Hotfix参见https://support.microsoft.com/?id=817433

不过,能从中删除的组只有四个,它们分别是Account Operators;Server Operators;Print Operators和Backup Operators。接下来我们来一起看看怎么删除这四个组吧。

我们是通过编辑dsHeuristic标志位来达到我们的目的。dsHeuristic是一个Unicode String,它的第十六位被解释为十六进制,用该位表示需要删除的组。以上四个组各自用一个四位二进制中的某一位表示。如下表所示。

Protected group

Binary

Hexadecimal

Account Operators

0001

1

Server Operators

0010

2

Print Operators

0100

4

Backup Operators

1000

8

当需要删除几个组的时候,只需要简单的将其相加即可。所以当需要删除所有四个组时,对应的二进制为1111,对应的十六进制为F。接下来我们举例说明如何修改dsHeuristic标志位。

    1. 打开ADSIEdit.msc控制台,点击Action,点击Connect to,在Connection Settings中,选择Select a well know Naming Context,在下拉框中选择Configuration。
    2. 展开Configuration,展开Service,展开Windows NT,右击Directory Service,选择属性,找到dsHeuristic,打开编辑该属性的编辑框。输入000000000100000f,其中f就代表删除四个组,可以根据实际情况进行调整。如图四编辑dSHeuristic所示。

图四、编辑dSHeuristics

当删除组之后,首先需要在AdsiEdit.msc控制台中,将属于这些组的用户的AdminCount属性置为0。然后在Dsa.msc控制台中将用户的高级Security属性置为默认(点击Default按钮),这时候会发现继承选项被选中。

还有一种情况也是需要将AdminCount属性置为0的。那就是,当用户从受保护组中删除的时候,因为删除之后,其AdminCount不会自动变为0,所以需要手动修改AdminCount。目前已经有一个脚本,专门修复这个问题,请参见https://support.microsoft.com/?id=817433

最后再来介绍一下怎么控制AdminSDHolder那个后台程序的运行间隔吧。我们通过新建或者修改键值AdminSDProtectFrequency达到目的。这个键值在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters下。假如不存在,则后台程序采用默认运行间隔(一小时)。该键值的设置范围为1分钟到120分钟。

现在,我相信读者肯定跟我一样对AdminSDHolder不陌生了吧?今天就写到这里吧,期待下次再见。

 

 

谢谢,

冯绿音 | 企业平台支持部AD技术工程师 | 微软亚太区全球技术支持中心

 

本博文仅供参考,微软公司对其内容不作任何责任担保或权利赋予。