четверг, 5 марта 2009 г.

Чему равен дескриптор безопасности по-умолчанию?

Это перевод What is the default security descriptor? Автор: Реймонд Чен.

Большинство функций ядра имеют параметр, в который вы должны передать указатель на TSecurityAttributes, и в который все всегда передают nil. Документация говорит, что в этом случае объект получает дескриптор безопасности по-умолчанию. Но что такое дескриптор безопасности по-умолчанию?

Мы начнём искать, конечно же, с MSDN - в разделе, озаглавленном Security Descriptors for New Objects.

Там сказано, что DACL по-умолчанию формируется из наследованных ACE (если объект принадлежит какой-либо иерархии, типа файловой системы или реестра) или же из первичного (primary) или имперсонированного (impersonation) токена создателя.

Но что такое первичный токен по-умолчанию?

А, чёрт, я тоже этого не знаю. Так что давайте напишем программку, чтобы узнать это.
uses
JwaWindows;

procedure TForm1.FormCreate(Sender: TObject);
var
Token: THandle;
RequiredSize: DWord;
DefaultDacl: PTokenDefaultDacl;
SD: TSecurityDescriptor;
StringSD: PChar;
begin
if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token) then
try
RequiredSize := 0;
GetTokenInformation(Token, TokenDefaultDacl, nil, 0, RequiredSize);

GetMem(DefaultDacl, RequiredSize);
try
if GetTokenInformation(Token, TokenDefaultDacl, DefaultDacl, RequiredSize, RequiredSize) and
InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) and
SetSecurityDescriptorDacl(@SD, True, DefaultDacl.DefaultDacl, False) and
ConvertSecurityDescriptorToStringSecurityDescriptor(@SD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION, StringSD, nil) then
try
MessageBox(Handle, StringSD, 'Result', MB_OK);
finally
LocalFree(Cardinal(StringSD));
end;
finally
FreeMem(DefaultDacl);
end;
finally
CloseHandle(Token);
end;
end;
Ладно, я признаю это: единственное назначение всего этого кода только в том, чтобы я вызывал функцию ConvertSecurityDescriptorToStringSecurityDescriptor - наверное, это самое длинное имя функции в Win32 API. А чтобы было ещё веселее, я использовал стиль именования переменных NT вместо венгерской нотации.

Если вы запустите эту программу, то увидите сообщение типа:
D:(A;;GA;;;S-1-5-21-1935655697-839522115-854245398-1003)(A;;GA;;;SY)
Для расшифровки этой строки мы достаём наш полезнейший справочник по формату строкового представления дескриптора безопасности - Security Descriptor String Format:
  • "D:" - указывает, что это DACL.
  • "(A;;GA;;;S-...)" - Разрешить ("Allow") полный доступ ("Generic All") для "S-..." - что, кажется, является моим SID. Т.е. каждый пользователь по-умолчанию имеет полные права для своих процессов.
  • "(A;;GA;;;SY)" - Разрешить ("Allow") полный доступ ("Generic All") для "Local System".

1 комментарий:

  1. Смотрел недавно Jedi Security Library и недоумевал, что за секурити дескрипторы, и нужны ли они мне. Пока решил, что не нужны, и не стал разбираться.
    А на самом деле, когда их стоит использовать?

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.