В прошлом выпуске я рассказал, как строится строка SDDL, так что мы теперь можем что-то прочитать на этом замечательном языке.
Пример 1:
В том самом посте, в котором я обещал написать этот (кстати, есть статья знаний, которая более полна, чем мой пост), я приводил такую строчку:
O:BAG:SYD:(A;;0x1;;;<SID>)
Это один из самых простых примеров, так что с него и начнем.
1. O:BA – владелец, в данном случае BA = Built-in Administrators
2. G:SY первичная группа. SY = Local System
3. D:(A;;0x1;;;<SID>): DACL
a. Тип ACE: A = Allow
b. Флаги ACE: пусто (;;)
c. Разрешения: 0x1 = GR = Generic Read (да-да, разрешения можно представлять и в виде цифровой строки, я об этом говорил в самом начале)
d. Object Type: пусто (;;)
e. Inherited Object Type: пусто (;;)
f. Trustee: наш SID, который мы искали в том посте.
Итого мы имеем объект, владельцем которого является группа администраторов, а разрешения на нее имеет только пользователь, определенный SID’ом, и только на чтение.
Пример 2:
Как здесь прекрасно видно, мы смотрим SDDL строку, назначенную папке c:\temp. Ее текстовое представление:
O:BAG:DUD:PAI(D;CINP;FA;;;LG)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;0x1200a9;;;BU)
Как видите, строка весьма длинная (на самом деле, она весьма короткая, обычно больше, но я специально сделал что покороче =) ), то есть, в отличие от предыдущего примера придется попотеть.
Но приступим:
1. O:BA – владелец, как и в предыдущем случае это группа Built-in Administrators.
2. G:DU – Domain Users.
3. O:BAG:DUD:PAI(D;CINP;FA;;;LG)(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FR;;;BU) – DACL
a. P = SDDL_PROTECTED – наследование от контейнеров выше этого заблокировано
b. AI = SDDL_AUTO_INHERITED – наследование разрешено вниз, но не вверх, так как выставлен флаг P. На самом деле PAI как раз обычно встречается там, где просто заблокировано наследование
c. (D;CINP;FA;;;LG)
i. Тип ACE: D = Deny – без комментариев
ii. Флаги наследования: CINP
1. CI = CONTAINER INHERIT – контейнеры тоже будут наследовать
2. NP = NO PROPAGATE: только непосредственные «дочки объекта» будут получать эту ACE
iii. Разрешения: FA = Full Control
iv. Object Type: пусто (;;)
v. Inherited Object Type: пусто (;;)
vi. Trustee: LG = Local Guest
d. (A;OICI;FA;;;SY)
i. Тип ACE: Allow
ii. Флаги наследования: OICI
1. OI = OBJECT INHERIT – дочерние объекты, которые не являются контейнерами наследуют эту запись
2. CI = CONTAINER INHERIT – контейнеры тоже будут наследовать
iii. Разрешения: FA = SDDL_FILE_ALL – все разрешено
iv. Object Type: пусто (;;)
v. Inherited Object Type: пусто (;;)
vi. Trustee: SY = Local System
e. (A;OICI;FA;;;BA)
i. Тип ACE: Allow
ii. Флаги наследования: OICI
1. OI = OBJECT INHERIT – дочерние объекты, которые не являются контейнерами наследуют эту запись
2. CI = CONTAINER INHERIT – контейнеры тоже будут наследовать
iii. Разрешения: FA = SDDL_FILE_ALL – все разрешено
iv. Object Type: пусто (;;)
v. Inherited Object Type: пусто (;;)
vi. Trustee: BA = Built-in Administrators
f. (A;OICI;FR;;;BU)
i. Тип ACE: Allow
ii. Флаги наследования: OICI
1. OI = OBJECT INHERIT – дочерние объекты, которые не являются контейнерами наследуют эту запись
2. CI = CONTAINER INHERIT – контейнеры тоже будут наследовать
iii. FR = FILE GENERIC READ – эквивалент Read
iv. Object Type: пусто (;;)
v. Inherited Object Type: пусто (;;)
vi. Trustee: BU – Built-in Users
Все просто. На самом деле бывают более запутанные случаи (скорее уж бывают такие, более запутанные сплошь и рядом), но и с ними Вам помогут справиться следующие материалы:
http://msdn.microsoft.com/en-us/library/aa379567.aspx - основа основ - MSDN. Стартовая страница для серьезного разбирательства. Здесь самые подробные материалы.
http://msdn.microsoft.com/en-us/library/aa374928(VS.85).aspx - «Словарик».
И сообщение в блоге, которое я нашел в процессе подготовки этой статьи:
http://blogs.technet.com/askds/archive/2008/04/18/the-security-descriptor-definition-language-of-love-part-1.aspx
http://blogs.technet.com/askds/archive/2008/05/07/the-security-descriptor-definition-language-of-love-part-2.aspx
Здесь все то же самое, но чуть более подробно, местами, чем у меня. Нашел бы раньше – просто перевел бы.
2 комментария:
Я в своё время у себя в блоге поднимал вопрос разбора ACL и решил, что чтение SDDL - удовольствие весьма и весьма сомнительное. Всё же Get-ACL .\ | FL более дружественный внешне удобный для восприятия, чем SDDL. Его есть смысл использовать, когда нужно написать очень компактный скрипт с минимумом кода. Только каждому, кто надумает его прочитать придётся сначала вызубрить его, а потом уже что-то понимать.
И в чём заключается "замечательность этого языка"? В том, что его без шпаргалки не раскуришь? Я лучше напишу в 2 раза больше код, но с использованием понятных классов .NET (не только мне, но и другим), чем возиться с SDDL.
1) Согласен, что для восприятия более удобен вид, выдаваемый Get-ACL, но:
2) мне есть смысл использовать этот язык там, где Вам, Вадимс, нужно кодить. Потому что шпаргалками я пользоваться умею, а кодить - нет.
3) Для разбора скриптом удобнее именно форма SDDL. Мне так кажется. Повторюсь: мне.
4) Зубрить его не надо, шпаргалки на две печатных странички более чем достаточно
5) и наконец - что Вы накодите, чтобы заменить SC sdset? Или подправить тот кусок ACL в той ветке реестра (а она не единственная), о которой я говорил в этом посте. Да, я согласен - начали появляться все более и более удобные способы, но пока вот этот, увы, изжить не удается. И я предпочитаю знать этот язык, чем кодить для каждого случая непонятно что - дело вкуса, согласитесь =)
Отправить комментарий