通过访问控制列表(ACL)保护注册表键,以移除非管理员的所有访问权限。

3

我正在尝试锁定一个包含重要信息的注册表键,这些信息必须在客户端机器上被访问,我不希望非管理员能够访问此键。如果你是管理员,你已经可以造成比我存储在键中更多的损坏。

我目前想做的是:

//Allow access only to administrators and deny all rights to everyone else.
System.Security.AccessControl.RegistrySecurity acl = 
new System.Security.AccessControl.RegistrySecurity();
acl.AddAccessRule(
    new System.Security.AccessControl.RegistryAccessRule(
        "Administrators", 
        System.Security.AccessControl.RegistryRights.FullControl, 
        System.Security.AccessControl.AccessControlType.Allow));

acl.AddAccessRule(
    new System.Security.AccessControl.RegistryAccessRule(
        "Everyone",
        System.Security.AccessControl.RegistryRights.FullControl,
        System.Security.AccessControl.AccessControlType.Deny));

//Prevent inherited read access from the software or company key allowing access.
acl.SetAccessRuleProtection(true, false);

MyKey.SetAccessControl(acl);

如果我理解正确,这将拒绝所有人的访问,明确允许管理员组中的任何人访问,并防止所有继承的权限应用于我的密钥?在我搞砸密钥ACL以至于我无法删除它之前,我更想知道它是否有效。我是否应该将密钥的所有者也设置为管理员组?
PS:非管理员甚至不能读取密钥,而不仅仅是更改。
1个回答

4
非常小心拒绝规则 - 它们只在极少数情况下是必要的。
如果ACL中唯一的ACE是为管理员授予他们所需的访问权限,则由于没有授予其他人访问权限的ACE,其他人将无法访问该密钥。
AddAccessRule()的文档中我不清楚它是否保证新规则(或ACE)将添加到ACL的末尾。这很可能是正确的,但如果它不起作用并且你的拒绝ACE出现在授予管理员访问权限的ACE之前,那么拒绝ACE将“覆盖”授予权限的ACE(一旦系统遇到第一个授予或拒绝权限的ACE,它就停止查看ACL)。这就是使用拒绝ACE会很棘手的原因。由于未明确授予权限的ACL会导致访问检查失败,因此通常只需要指定谁被允许访问。
您可能希望确保所有者设置为管理员组 - 所有者可以没有对密钥(或任何对象)的访问权限,但所有者始终具有更改ACL的权利(如果您考虑一下就会明白)。

所以拒绝规则更多是处理传播的权限。我的意图是创建新的ACL,添加我想要的一个规则,然后直接设置ACL(而不是获取ACL,进行更改,应用)。你知道是否有任何特殊的系统帐户需要访问该密钥吗? - Spence
是否需要特殊系统帐户访问密钥取决于密钥的类型和用途。例如,如果任何服务需要访问密钥,则运行该服务的帐户(或该帐户所在的组)将需要访问权限。 - Michael Burr
你应该测试一下 - 我认为除非需要通过运行在SYSTEM帐户下的服务访问该密钥,否则删除LocalSystem不会有问题。如果这是您为自己创建的密钥(而不是Microsoft用于某个配置项或其他内容的东西),那么就不应该有问题。如果没有Windows系统进程查找该密钥,它们将不关心无法访问它。但是请测试一下 - 不要仅凭我的话。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接