четверг, 25 сентября 2008 г.

SDDL: Учимся описывать безопасность. Часть 2.

SecurityВ прошлом выпуске я рассказал, как строится строка 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:

 image
Как здесь прекрасно видно, мы смотрим 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.

Alexander Trofimov комментирует...

1) Согласен, что для восприятия более удобен вид, выдаваемый Get-ACL, но:
2) мне есть смысл использовать этот язык там, где Вам, Вадимс, нужно кодить. Потому что шпаргалками я пользоваться умею, а кодить - нет.
3) Для разбора скриптом удобнее именно форма SDDL. Мне так кажется. Повторюсь: мне.
4) Зубрить его не надо, шпаргалки на две печатных странички более чем достаточно
5) и наконец - что Вы накодите, чтобы заменить SC sdset? Или подправить тот кусок ACL в той ветке реестра (а она не единственная), о которой я говорил в этом посте. Да, я согласен - начали появляться все более и более удобные способы, но пока вот этот, увы, изжить не удается. И я предпочитаю знать этот язык, чем кодить для каждого случая непонятно что - дело вкуса, согласитесь =)