Эта небольшая статья посвящена одному из важнейших компонентов системы,
обеспечивающего идентификацию учетных записей - серверу учетных записей
(
Security Accout Manager,
SAM).
Многие факты, изложенные в этой статье были скрыты программистами ОС от
глаз пользователей и сторонних разработчиков ПО. Для выяснения особенностей
работы и устройства сервера SAM приходилось дизассемблировать код сервера
(
samsrv.dll) и прикладной библиотеки с программным интерфейсом
доступа к серверу (
samlib.dll).
Сервер учетных записей служит для:
- Идентификации субъектов (трансляции имен в идентификаторы,
SIDы, и обратно);
- Проверки пароля, авторизации (участвует в процессе входа пользователей в систему);
- Хранения статистики (время последнего входа, количество входов, количество некорректных вводов пароля);
- Хранения настроек политики учетных записей и приведение их в действие (политика паролей и политика блокировки учетной записи);
- Хранения логической структуры группировки учетных записей (по группам), заданной администратором;
- Контроля доступа при изменении настроек учетных записей.
SAM-сервер реализован как многопоточный RPC-сервер, запускающийся при загрузке
библиотеки samsrv.dll, в которой и реализованы его функции. Сервер выполняется
в системе в единственном экземпляре в процессе
lsass.exe (этот процесс
на самом деле является чуть ли не самым главным участником всей подсистемы безопасности
Windows).
Для взаимодействия с сервером (сервером локального компьютера, либо же удаленного),
следует использовать функции библиотеки samlib.dll, осуществляющей проверку параметров
и передачу их по RPC-транспорту серверу. Документированные API-функции по управлению
учетными записями (такие как, например,
NetUserEnum,
NetUserAdd и др.)
реализованы в библиотеке
netapi32.dll и используют функции из samlib.dll.
Прикладные программы, использующие документированные функции, взаимодействуют с
сервером по схеме, приведенной на рисунке:
Сервер SAM используется подсистемой
Local Security Authority (
LSA),
также выполняемой в процессе lsass.exe. Если компьютер с Windows XP, 2000, 2003 или
Vista является членом домена, то LSA работает не только с локальным сервером SAM,
но и с удалённым, расположенным на контроллере домена
Объекты сервера SAM
Сервер SAM оперирует с несколькими типами объектов, или сущностей, каждая из которых
защищается списком контроля доступа и содержит ряд свойств, которые могут быть
изменены. Сервер SAM хранит следующие типы объектов:
- Сервер - хранит список объектов-доменов и позволяет получить доступ к
объектам-доменам;
- Домен - хранит учетные записи пользователей, групп, алиасов, позволяет ими
управлять, хранит политику учетных записей и позволяет ее изменять;
- Пользователь - учетная запись пользователя компьютера или учетная запись компьютера,
хранит идентификатор, свойства, пароль, статистику, комментарии;
- Алиас - учетная запись, позволяющая группировать пользователей, другие алисы и
группы. Содержит имя, комментарий и список членов. Алисы в стандартных оснастках
управления учетными записями Windows называются группами;
- Группа - учетная запись, позволяющая в отличие от алиса группировать только
пользователей. Каждый пользователь должен состоять как минимум в одной группе. В
оснастках управления учетными записями эти объекты называются глобальными группами
Логическое устройство сервера SAM представлено на рисунке
Каждый из объектов является защищаемым, т.е. над ним определены операции,
которые могут осуществлять авторизованные пользователи. Доступ к объектам
осуществляется по описателям (
HANDLE), подобно другим защищаемым
типам объектов в системе (файлам, ключам реестра и т.д.)
Каждый из типов объектов SAM-сервера предлагается рассмотреть отдельно.
Объект-сервер
Объект-сервер служит для подключения к нему и доступа к содержащимся внутри него
объектам. Существуют следующие права доступа объекту-серверу:
Право Описание
SAM_SERVER_SHUTDOWN Позволяет отключить сервер
SAM_SERVER_ENUMERATE_DOMAINS Позволяет перечислить объекты-домены сервера
SAM_SERVER_OPEN_DOMAIN Позволяет получить SID объекта-домена и
открыть объект-домен
READ_CONTROL Позволяет получить описатель безопасности
объекта-сервера
WRITE_DAC Позволяет изменить список контроля доступа к
к объекту-серверу
WRITE_OWNER Позволяет изменить владельца объекта-сервера
Над объектом-сервером SAM можно выполнять следующие действия:
Функция samlib.dll Описание
SamConnect Подключение к серверу
SamConnectWithCreds
SamShutdownSamServer Отключение сервера. Сервер включится вновь
только после перезагрузки системы
SamEnumerateDomainsInSamServer Перечисление объектов-доменов сервера SAM
SamLookupDomainInSamServer Получение идентификатора (SID) домена по
его имени
SamOpenDomain Открытие домена
Следующие функции позволяют обслуживать любые объекты сервера SAM:
Функция samlib.dll Описание
SamCloseHandle Закрытие объекта
SamFreeMemory Освобождение памяти, выделенной функцией
samlib.dll, указатели на которую возвращаются
в выходных параметрах
SamQuerySecurityObject Позволяет получить описатель безопасности объекта
SamSetSecurityObject Позволяет установить другой описатель безопасности
объекта
По умолчанию описатель безопасности сервера SAM содержит следующую информацию:
Владелец: S-1-5-32-544 (Администраторы)
Список контроля доступа:
Право S-1-5-32-544 S-1-1-0
(Администраторы) (Все)
SAM_SERVER_SHUTDOWN + -
SAM_SERVER_ENUMERATE_DOMAINS + +
SAM_SERVER_OPEN_DOMAIN + +
READ_CONTROL + +
WRITE_DAC + -
WRITE_OWNER + -
Объект-домен
Объект-домен является контейнером для пользователей, алиасов и групп.
Домен хранит настройки политики учетных записей: политику блокировки и паролей,
а также еще некоторую служебную информацию.
В сервере SAM операционных систем Windows 2000 / XP / 2003 / Vista существуют
два объекта такого типа. Первый домен носит имя "Builtin", второй - в зависимости
от типа компьютера (локальной станции, члена домена или контроллера домена)
содержит домен, имя которого:
- совпадает с именем домена в случае, если компьютер - контроллер домена;
- совпадает с именем компьютера в случае, если компьютер - член домена или просто
локальная станция.
У домена, кроме имени, идентифицирующего его в пределах сервера SAM, существует
уникальный идентификатор (SID). Для домена Builin этот идентификатор всегда
одинаков: "S-1-5-32". Для домена, имя которого совпадает с именем компьютера,
SID генерируется как последовательность случайных чисел при установке системы и
может быть например равен: "S-1-5-21-789336058-484763869-725345543"
Учетные записи (пользователи, группы, алиасы), хранящиеся в домене, имеют
уникальный 32-битный идентификатор
RID (
Relative ID). SID
учетной записи вычисляется как "SID ДОМЕНА"-"RID Учетной записи". Например,
алиас "Администраторы" имеет RID=544. Алиас расположен в домене Builtin =>
его SID: "S-1-5-32-544".
Существуют следующие права доступа к объекту-домену:
Право Описание
SAM_DOMAIN_ENUMERATE_ACCOUNTS Позволяет перечислять имена учетных записей,
хранящихся в домене
SAM_DOMAIN_LOOKUP_ACCOUNTS Позволяет получить уникальные идентификаторы
учетных записей, хранящихся в домене по их
имени
SAM_DOMAIN_CREATE_USER Позволяет создать в домене объекта-пользователя
SAM_DOMAIN_CREATE_GROUP Позволяет создать в домене объект-группу
SAM_DOMAIN_CREATE_ALIAS Позволяет создать в домене объект-алиас
SAM_DOMAIN_QUERY_SETTINGS Позволяет получить настройки политики учетных
записей, которые хранит домен
SAM_DOMAIN_QUERY_INFORMATION Позволяет получить информацию о домене
SAM_DOMAIN_SET_SETTINGS Позволяет изменять настройки политики учетных
записей, которые хранит домен
SAM_DOMAIN_SET_INFORMATION Позволяет изменять информацию о домене
SAM_DOMAIN_ENUMERATE Позволяет домену быть перечисляемым сервером.
Субекты, для которых это право запрещено, не
смогут перечислить домен с помощью
SamEnumerateDomainsInSamServer
READ_CONTROL Позволяет получить описатель безопасности
объекта-домена
WRITE_DAC Позволяет изменить список контроля доступа к
к объекту-домену
WRITE_OWNER Позволяет изменить владельца объекта-домена
Над доменом можно выполнять следующие операции:
Функция samlib.dll Описание
SamCreateAliasInDomain Создание алиаса в домене
SamCreateGroupInDomain Создание группы в домене
SamCreateUserInDomain Создание пользователя в домене
SamCreateUser2InDomain
SamEnumerateAliasesInDomain Перечисление алиасов в домене
SamEnumerateGroupsInDomain Перечисление групп в домене
SamEnumerateUsersInDomain Перечисление пользователей в домене
SamGetDisplayEnumerationIndex Перечисление информации, выводимой
SamQueryDisplayInformation оснастками Windows при редактировании
описателей безопасности объектов
SamLookupIdsInDomain Получение имен учетных записей по RIDам
SamLookupNamesInDomain Получение RIDов учетных записей по именам
SamOpenAlias Открытие алиаса
SamOpenGroup Открытие группы
SamOpenUser Открытие пользователя
SamQueryInformationDomain Получение настроек и информации о домене
SamSetInformationDomain Изменение настроек и информации о домене
SamRidToSid Получение SID учетной записи по RID
Помимо учетных записей, домен хранит следующую информацию, которая может
быть получена (и изменена) с помощью функций SamQueryInformationDomain и
SamSetInformationDomain:
1. Настройки политики паролей:
- Минимальная длина пароля
- Требовать неповторяемость паролей (сколько хранится старых паролей)
- Максимальный срок действия пароля
- Минимальный срок действия пароля
- Пароль должен отвечать требованиям сложности
- Хранить пароли всех пользователей в домене, используя обратимое шифрование
2. Настройки политики блокировки учетных записей:
- Блокировка учетной записи на указанный интервал времени
- Сброс счетчика блокировки через указанный интервал времени
- Поровое значение блокировки (неверных входов в систему)
3. Имя домена
4. Состояние домена
5. Роль домена (основной или резервный, выполняющий репликацию
с основного)
6. Сервер репликации (для доменов, выполняющих резервную роль)
7. Версия модификации базы данных домена (счетчик операций, проведенных
над доменом со времени установки системы)
8. Количество учетных записей, хранимых доменом
Примечательным является тот факт, что оснастка
Панель управления / Администрирование
/ Локальные параметры безопасности / Политики учетных записей отражают
только настройки домена, имя которого совпадает с именем компьютера, хотя домен
Builtin также содержит такие настойки политики и их можно изменять. Но в домене
Builtin по умолчанию не существует пользователей, а следовательно и политику паролей,
и блокировки применять не к кому, поэтому наличие таких настроек домена
фактически не влияет на безопасность системы.
По умолчанию домены имеют следующие описатели безопасности:
Домен Builtin:
Владелец: S-1-5-32-544 (Администраторы)
Список контроля доступа:
Право S-1-5-32-544 S-1-1-0
(Администраторы) (Все)
SAM_DOMAIN_ENUMERATE_ACCOUNTS + +
SAM_DOMAIN_LOOKUP_ACCOUNTS + +
SAM_DOMAIN_CREATE_USER - -
SAM_DOMAIN_CREATE_GROUP - -
SAM_DOMAIN_CREATE_ALIAS + -
SAM_DOMAIN_QUERY_SETTINGS + +
SAM_DOMAIN_QUERY_INFORMATION + +
SAM_DOMAIN_SET_SETTINGS + -
SAM_DOMAIN_SET_INFORMATION + -
SAM_DOMAIN_ENUMERATE + +
READ_CONTROL + +
WRITE_DAC - -
WRITE_OWNER - -
Домен Имя совпадает с именем компьютера:
Примечание: таблица приводится для локального компьютера (не для контроллера домена!)
Владелец: S-1-5-32-544 (Администраторы)
Список контроля доступа:
Право S-1-5-32-544 S-1-1-0 S-1-5-32-545 S-1-5-32-547 S-1-5-32-548
(Администраторы) (Все) (Пользователи) (Опытные польз.) (Операторы учетных
записей)
SAM_DOMAIN_ENUMERATE_ACCOUNTS + + + + +
SAM_DOMAIN_LOOKUP_ACCOUNTS + + + + +
SAM_DOMAIN_CREATE_USER + - - + +
SAM_DOMAIN_CREATE_GROUP - - - - -
SAM_DOMAIN_CREATE_ALIAS + - - + +
SAM_DOMAIN_QUERY_SETTINGS + + + + +
SAM_DOMAIN_QUERY_INFORMATION + + + + +
SAM_DOMAIN_SET_SETTINGS + - - - -
SAM_DOMAIN_SET_INFORMATION + - - - -
SAM_DOMAIN_ENUMERATE + + + + +
READ_CONTROL + + + + +
WRITE_DAC + - - - -
WRITE_OWNER + - - - -
Объект-группа
Объектами-группами в сервере SAM являются объединения пользователей
в пределах одного домена. Стандартная оснастка управления учетными
записями (в Windows Server 2003) называет группы "Глобальными группами"
(или "Global Groups"). В сети с доменами группы служат для эффективного
управления учетными записями в пределах доменного леса. Сервер SAM
на основном и резервных контроллерах домена после установки системы
содержит следующие группы (домен Builtin не содержит групп):
Name(RID) Description
Domain Admins (RID=512) Designated administrators of the domain
Domain Users (RID=513) All domain users
Domain Guests (RID=514) All domain guests
Domain Computers (RID=515) All workstations and servers joined
to the domain
Domain Controllers (RID=516) All domain controllers in the domain
Schema Admins (RID=518) Designated administrators of the schema
Enterprise Admins (RID=519) Designated administrators of the enterprise
Group Policy Creator Members in this group can modify group
Owners (RID=520) policy for the domain
DnsUpdateProxy (RID=1106) DNS clients who are permitted to perform
dynamic updates on behalf of some other
clients (such as DHCP servers).
Группа DnsUpdateProxy появляется при установке сервера DNS, требуемого
для функционирования Active Directory.
Локальные станции, не входящие в домен, функционирующие под управлением
Windows 2000 / XP / 2003 / Vista, содержат всего одну группу со странным
именем "Отсутствует" (RID=513) и описанием "Обычные пользователи". Группа
располагается в домене, имя которого совпадает с именем компьютера. В эту
группу включены абсолютно все пользователи.
Членом группы не может быть пользователь другого домена, алиас, домен или другая
группа. Каждый пользователь обязательно должен быть членом хотя бы одной группы.
Первая группа, членом которой является пользователь, называется PRIMARY GROUP.
На автономных компьютерах вне домена все пользователи являются членами группы
"Отсутствует".
Список контроля доступа домена, имя которого совпадает с именем компьютера,
не содержит разрешающего права доступа для создания групп, даже для Администраторов.
Но Администраторы могут изменить права в списке контроля и создать
новую группу в любом домене.
Членство в группе определяется набором из нескольких флагов, назначение
которых указано в Platform SDK:
Флаг Установлен
по умолчанию
SE_GROUP_MANDATORY +
SE_GROUP_ENABLED_BY_DEFAULT +
SE_GROUP_ENABLED +
SE_GROUP_OWNER -
SE_GROUP_USE_FOR_DENY_ONLY -
SE_GROUP_LOGON_ID -
Существуют следующие права доступа к объекту-группе:
Право Описание
SAM_GROUP_READ_INFORMATION Позволяет получить информацию о группе
SAM_GROUP_WRITE_INFORMATION Позволяет установить информацию о группе
SAM_GROUP_WRITE_MEMBERS Позволяет устанавливать членов группы
SAM_GROUP_REMOVE_MEMBERS Позволяет удалять членов из группы
SAM_GROUP_LIST_MEMBERS Позволяет получать список членов группы
DELETE Позволяет удалить группу
READ_CONTROL Позволяет получить описатель безопасности
объекта-группы
WRITE_DAC Позволяет изменить список контроля доступа к
к объекту-группе
WRITE_OWNER Позволяет изменить владельца объекта-группы
Над группой можно выполнять следующие операции:
Функция samlib.dll Описание
SamAddMemberToGroup Добавляет члена в группу
SamDeleteGroup Удаляет группу. Группу не удалить,
пока она содержит членов
SamGetMembersInGroup Перечисляет членов группы
SamQueryInformationGroup Возвращает информацию о группе
SamSetInformationGroup Устанавливает информацию о группе
SamRemoveMemberFromGroup Удаляет члена из группы
SamSetMemberAttributesOfGroup Устанавливает флаги членства в группе для
всех ее членов
По умолчанию описатель безопасности содержит список контроля доступа,
разрешающий следующие виды доступа следующим пользователям:
Для групп "Domain Admins" и "Enterprise Admins":
Право S-1-5-32-544 S-1-1-0
(Администраторы) (Все)
SAM_GROUP_READ_INFORMATION + +
SAM_GROUP_WRITE_INFORMATION + -
SAM_GROUP_WRITE_MEMBERS + -
SAM_GROUP_REMOVE_MEMBERS + -
SAM_GROUP_LIST_MEMBERS + +
DELETE + -
READ_CONTROL + +
WRITE_DAC + -
WRITE_OWNER + -
Для всех других групп (в том числе "Отсутствует"):
Право S-1-5-32-544 S-1-1-0
(Администраторы) (Все)
S-1-5-32-548
(Операторы уч. записей)
SAM_GROUP_READ_INFORMATION + +
SAM_GROUP_WRITE_INFORMATION + -
SAM_GROUP_WRITE_MEMBERS + -
SAM_GROUP_REMOVE_MEMBERS + -
SAM_GROUP_LIST_MEMBERS + +
DELETE + -
READ_CONTROL + +
WRITE_DAC + -
WRITE_OWNER + -
Группы хранят следующую информацию:
1. Имя группы
2. Комментарий администратора (описание группы)
3. Атрибуты членства в этой группе
Объект-алиас
Объектами-алиасами в сервере SAM являются объединения любых учетных
записей (в отличие от групп, которые объединяют только пользователей).
Членами алиаса могут быть другие алиасы, пользователи, группы и даже домены.
Алиасы предназначены для эффективного управления учетными записями как на
локальном компьютере, так и в домене. Оснастки Windows управления
учетными записями называют алиасы "Группами"
Домен Builtin содержит следующие алиасы (Windows XP):
Имя (RID) Описание
Администраторы (RID=544) Администраторы имеют полные, ничем
неограниченные права доступа к компьютеру
или домену
Гости (RID=546) Гости по умолчанию имеют те же права, что
и пользователи, за исключением учетной записи
"Гость", еще более ограниченной в правах.
Операторы архива (RID=551) Операторы архива могут перекрывать ограничения
доступа только в целях копирования и восстановления
файлов.
Операторы настройки сети Члены этой группы могут иметь некоторые
(RID=556) административные права для управления настройкой
сетевых параметров
Опытные пользователи (RID=547) Опытные пользователи обладают большинством прав,
но с некоторыми ограничениями. Они могут запускать
любые, а не только сертифицированные приложения.
Пользователи (RID=545) Пользователи не имеют прав на изменение параметров
системы. Они не могут запускать многие
несертифицированные приложения.
Пользователи удаленного Члены этой группы имеют право на выполнение
рабочего стола (RID=555) удаленного входа
Репликатор (RID=552) Поддержка репликации файлов в домене
Домен Builtin содержит следующие алиасы (Windows 2003, контроллер домена):
Имя (RID) Описание
Account Operators (RID=548) Members can administer domain user and group
accounts
Administrators (RID=544) Administrators have complete and unrestricted
access to the computer/domain
Backup Operators (RID=551) Backup Operators can override security
restrictions for the sole purpose of backing
up or restoring files
Distributed COM Users (RID=562) Members are allowed to launch, activate and
use Distributed COM objects on this machine.
Guests (RID=546) Guests have the same access as members of the
Users group by default, except for the Guest
account which is further restricted
Incoming Forest Trust Members of this group can create incoming,
Builders (RID=557) one-way trusts to this forest
Network Configuration Members in this group can have some
Operators (RID=556) administrative privileges to manage
configuration of networking features
Performance Log Users (RID=559) Members of this group have remote access
to schedule logging of performance counters
on this computer
Performance Monitor Users Members of this group have remote access
(RID=558) to monitor this computer
Pre-Windows 2000 Compatible A backward compatibility group which allows
Access (RID=554) read access on all users and groups in the
domain
Print Operators (RID=550) Members can administer domain printers
Remote Desktop Users (RID=555) Members in this group are granted the right
to logon remotely
Replicator (RID=552) Supports file replication in a domain
Server Operators (RID=549) Members can administer domain servers
Terminal Server License Terminal Server License Servers
Servers (RID=561)
Users (RID=545) Users are prevented from making accidental
or intentional system-wide changes. Thus,
Users can run certified applications, but not
most legacy applications
Windows Authorization Members of this group have access to the
Access Group (RID=560) computed tokenGroupsGlobalAndUniversal
attribute on User objects
В домене Builtin можно создавать другие алиасы, используя функции samlib.dll.
Оснастка Windows позволяет добавлять алиасы только в отличный от Builtin домен
Члены алиасов идентифицируются по SID, а не RID, поэтому членами алиасов могут
быть любые учетные записи (в том числе и не существующие).
Над алиасами определены следующие права доступа:
Право Описание
SAM_ALIAS_READ_INFORMATION Позволяет получить информацию об алиасе
SAM_ALIAS_WRITE_INFORMATION Позволяет установить информацию об алиасе
SAM_ALIAS_WRITE_MEMBERS Позволяет устанавливать членов алиаса
SAM_ALIAS_REMOVE_MEMBERS Позволяет удалять членов из алиаса
SAM_ALIAS_LIST_MEMBERS Позволяет получать список членов алиаса
DELETE Позволяет удалить алиас
READ_CONTROL Позволяет получить описатель безопасности
объекта-алиаса
WRITE_DAC Позволяет изменить список контроля доступа к
к объекту-алиасу
WRITE_OWNER Позволяет изменить владельца объекта-алиаса
По умолчанию к алиасам установлены следующие права доступа:
Право S-1-5-32-544 S-1-1-0
(Администраторы) (Все)
S-1-5-32-548
(Операторы уч. записей)
SAM_ALIAS_READ_INFORMATION + +
SAM_ALIAS_WRITE_INFORMATION + -
SAM_ALIAS_WRITE_MEMBERS + -
SAM_ALIAS_REMOVE_MEMBERS + -
SAM_ALIAS_LIST_MEMBERS + +
DELETE + -
READ_CONTROL + +
WRITE_DAC + -
WRITE_OWNER + -
Над алиасами определены следующие операции:
Функция samlib.dll Описание
SamAddMemberToAlias Добавляет членов в алиас
SamAddMultipleMembersToAlias
SamDeleteAlias Удаляет алиас
SamGetAliasMembership По указанным идентификаторам SID учетных
записей вычисляет список алиасов в домене,
в которых состоят указанные по SID учетные
записи
SamGetMembersInAlias Перечисляет членов алиаса
SamQueryInformationAlias Возвращает информацию об алиасе
SamSetInformationAlias Устанавливает информацию об алиасе
SamRemoveMemberFromAlias Удаляет членов из алиаса
SamRemoveMultipleMembersFromAlias
Помимо членов, алиасы хранят следующую информацию:
1. Имя алиаса
2. Комментарий администратора (описание)
Продолжение следует...
Ссылки:
Утилита WALKSAM: позволяет получать некоторую информацию с сервера SAM, используя
прямые RPC-вызовы (не использует функции samlib.dll)
Утилита SAMACL: позволяет редактировать описатели безопасности объектов сервера
SAM
Утилиты доступны в пакетах RPCTools и ACLTools по адресу:
http://www.bindview.com/Services/RAZOR/Utilities/Windows/
Утилиты:
Выводит полученную с помощью недокументированных функций
информацию с сервера SAM:
SAMVIEW