Защитите раздел реестра через ACL, чтобы удалить все права доступа не администраторов - PullRequest
2 голосов
/ 25 января 2010

Я пытаюсь заблокировать раздел реестра с некоторой важной информацией, которая должна быть доступна на клиентском компьютере, я не хочу, чтобы не администраторы имели доступ к этому ключу. Если вы являетесь администратором, вы уже сможете нанести больше урона, чем то, что я храню в ключе.

То, что я сейчас хочу сделать, это:

//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 Ответ

3 голосов
/ 25 января 2010

Будьте очень осторожны с запрещающими правилами - они нужны редко.

Если единственный ACE в ACL предназначен для администраторов, предоставляющих им доступ, который вы хотите им предоставить, то никто другой не будет иметь доступа к ключу, поскольку ACE не предоставляет им доступ.

Из документации для AddAccessRule() мне неясно, будет ли это гарантировать, что новое правило (или ACE) будет добавлено в конец ACL или нет. Скорее всего, это так, но если случится так, что ваш отказавший ACE завершится до того, как ACE предоставит доступ администраторам, то отказавший ACE «переопределит» тот, кто предоставляет доступ (первая система перестает смотреть на ACL, как только он попадает в первый ACE, который предоставляет или запрещает разрешение). Вот почему использование deny ACE может быть сложным. А поскольку ACL, который явно не предоставляет разрешения, приводит к сбою проверки доступа, вам обычно нужно только указать, кому разрешен доступ.

Вы, вероятно, захотите убедиться, что владелец настроен на группу администраторов - владелец может не иметь доступа к ключу (или какому-либо другому объекту), но владелец всегда имеет право изменить ACL (имеет смысл, если вы подумайте об этом на мгновение).

...