Назад | Перейти на главную страницу

Разные ACL на двух OU с одинаковой настройкой «защитить объект от удаления»

Задний план

После того, как я настроил нашу Active Directory так, чтобы возможность перемещать компьютеры была делегирована персоналу службы поддержки, я начал слышать сообщения о том, что компьютеры «застревают» в определенных OU. Они могут переместить компьютер, но при попытке переместить компьютер получают сообщение «доступ запрещен». Проблема на 100% воспроизводима и присутствует только в небольшом количестве OU в нашем домене.

Оба OU имеют Protect object from accidental deletion включен.

Что я уже знаю

Проверка ACL с помощью ldp.exe действительно обнаруживает одно крошечное, но важное отличие. По какой-то причине только ОДНО из подразделений имеет атрибут ACTRL_DS_DELETE_CHILD, запрещенный для Everyone.

Переключение Protect object включение и выключение флажка на любом из подразделений не решает проблему. Он действительно изменяет ACL, как и ожидалось, но ACTRL_DS_DELETE_CHILD flag в любом случае полностью не изменяется.

Я могу использовать это решение, чтобы «исправить» конкретное подразделение:

  1. Выключить Protect object флаг
  2. Удалите запрещающий ACE, связанный со всеми.
  3. Перемена Protect object назад на
  4. Теперь соответствие ACL.

Может быть, разные версии Active Directory или инструментов удаленного администрирования сервера могут вести себя по-разному с тем, как Protect object flag действительно представлен в OU?

Вопрос

Что могло вызвать эту разницу, и что я могу сделать, чтобы убедиться, что она исправлена ​​во всех подразделениях в домене Active Directory?

подробности

Унифицированный diff выглядит так:

18c18
<       Ace Mask:  0x00010042
---
>       Ace Mask:  0x00010040
20d19
<           ACTRL_DS_DELETE_CHILD

Как определить затронутые организационные подразделения

РЕДАКТИРОВАТЬ: Я написал сценарий PowerShell для поиска организационных единиц, на которых установлен этот флаг.

$Base = "OU=MyOU,DC=your,DC=domain,DC=com"
Import-Module ActiveDirectory
Set-Location AD:
Get-ADOrganizationalUnit -SearchBase $Base -filter * |
    ForEach-Object {
        $matches = @(
            (Get-ACL $_.DistinguishedName).access |
            Where-Object {
                $_.IdentityReference -eq "Everyone"
            } |
            Where-Object {
                $_.ActiveDirectoryRights -like "*DeleteChild*"
            }
        )
        if ($matches.length -gt 0) {
            Write-Output $_
        }
    } |
    Format-Table DistinguishedName

Объяснение

Когда вы включаете Protect object from accidental deletion флаг организационной единицы, он влияет на ACL этого объекта и его родитель.

  1. Защищенное подразделение получает {Deny, Everyone, Delete + DeleteSubtree}.
  2. Родительское подразделение получает {Deny, Everyone, DeleteChildObjects}

Запись управления доступом в родительском элементе необходима для обеспечения защиты, но дает неожиданные результаты, подобные тем, что здесь наблюдаются. И независимо от того, сколько раз вы переключаете protect флаг, Отрицать запись управления доступом для родительского объекта никогда не будет автоматически удалена.

Таким образом, в Active Directory, с которой я работал, любое подразделение, которое когда-либо содержало защищенное подразделение (в основном, любое нелистовое подразделение), имело Отрицать DeleteChild ACE на нем, таким образом "захватывая" компьютерные объекты в этом OU с точки зрения пользователей с делегированными разрешениями.

Через: Защитить объект от случайного удаления на форумах Technet

Решение

Эту проблему легко решить, убедившись, что базовое подразделение, используемое для делегирования разрешений, имеет эти две записи управления доступом в ACL.

  1. {Разрешить, Группировать, Создать / удалить компьютерные объекты, этот объект и всех потомков} *
  2. {Allow, GROUP, Delete + DeleteSubtree, дочерние компьютерные объекты}

Я уже настроил первую запись управления доступом для соответствующего подразделения в моем каталоге, но теперь я знаю, что этого было недостаточно. Первое правило отменяется автоматическим Отрицать ACE настраивается всякий раз, когда создается защищенное OU. Второе правило позволяет удалить объект напрямую, минуя Отрицать запись устанавливается, когда дочерняя OU защищена.

* (Возможно, первое правило теперь избыточно. Кто-нибудь может подтвердить?)