Максим Костышин
Поводом для появления данной статьи послужила информация, опубликованная в
журнале «Windows & .Net Magazine/RE» №5 за 2003 год под названием «Утилита
LDIF Directory Exchange», подсказавшая решения, которые можно было использовать
для того, чтобы обеспечить необходимый уровень автоматизации при проведении аудита
учетных записей пользователей в Active Dircectory. В статье было приведено
описание основных возможностей двух утилит Ldifde.exe и Csvde.exe,
обеспечивающих добавление, изменение и удаление объектов Active Directory.
Информация, изложенная ниже, ориентирована на
использование Windows-платформ и предназначена в основном для людей, отвечающих
за вопросы компьютерной безопасности аудиторов, специализирующихся в данной
области. Надеемся, что статья будет полезна и людям, профессионально
занимающимся администрированием локальных сетей.
Постановка проблемных вопросов
В определенный момент времени наступает то критическое состояние для списка
пользователей локальной сети предприятия, когда нежелание остановиться и
провести анализ его содержимого может повлечь большие затраты и проблемы,
нежели своевременное проведение работ по аудиту и устранению выявленных
недостатков.
О чем идет речь? В организациях, где число
сотрудников, работающих с компьютерной техникой, превышает 100 человек,
администрированием занимаются, как правило, два-три сотрудника. Не все они, в
силу различных обстоятельств, с достаточным педантизмом относятся к работе по
внесению во вновь создаваемые учетные записи информации о владельцах. Кроме
того, администраторы обычно не включены в список тех сотрудников, которым
обязаны сообщать об увольнениях. Два этих обстоятельства являются основными
причинами, из-за которых и происходит накопление учетных записей «мертвых душ».
Попробуем провести некоторую систематизацию
наиболее значимых и очевидных проблем для списка пользователей Active Directory.
Во-первых, лишние записи в списке
пользователей, которые могут быть:
n учетными записями уволенных сотрудников;
n учетными записями работающих сотрудников,
которыми не пользуются и владельцы которых уже вряд ли помнят имена для входа в
сеть (не говоря уже о паролях);
n учетными записями заблокированных
пользователей, для которых администратор выполнил первый шаг перед удалением,
но так и не закончил процедуру;
n учетными записями, созданными для тестирования,
которые обычно имеют достаточно высокие привилегии, и которые администратор
забыл удалить, после того как процесс тестирования был завершен.
Во-вторых, к недопустимым можно отнести те
учетные записи, которые однозначно не идентифицируют владельца, т.е.
дополнительная информация в которых не позволяет назвать человека, определить
его должность и подразделение, выяснить, как с ним можно связаться (конечно же,
речь здесь не идет о стандартных учетных записях типа «Администратор», «Administrator»,
«Guest», «Гость», и другие).
И в-третьих, выполнение требований политики
безопасности предприятия подразумевает, что усилия и администраторов, и пользователей
должны быть направлены на то, чтобы учетная запись использовалась только ее
владельцем. То есть, если протокол выполнения операций работы с какой-либо из
программ показал, что пользователь вошел под учетной записью Иванова Ивана
Ивановича, то абсолютно нерационально будет тратить время на дополнительные
разборки с ситуациями, когда выясняется, что учетной записью пользуются (из-за
недостаточных знаний компьютера или обычной лени) все сотрудники отдела, в
котором трудятся пять человек.
Обзор возможностей по работе с
учетными записями
Попробуем перечислить те возможности, которые есть под руками у
администратора для работы с учетными записями пользователей в Active Directory,
и то, насколько они могут быть использованы для проведения аудита.
Оснастка Active Directory – пользователи и
компьютеры (которую можно найти в разделе «Администрирование» на сервере).
Замечательная возможность для добавления, редактирования свойств и удаления
пользователей домена, но, к сожалению, достаточно бесполезная в вопросах
проведения ревизии и аудита. К положительным моментам можно отнести возможность
проведения экспорта списка пользователей, в который можно включить такие поля,
как – «имя входа пользователя», «имя», «выводимое имя», «фамилия», «изменен».
Отметим, что поле «изменен» показывает время и дату последних изменений для
учетной записи администратором (производилась коррекция настроек) или
владельцем (смена пароля).
Системная утилита Net.exe. С помощью этой утилиты
вы можете обеспечить работу с данными конкретного пользователя (вариант вызова
– «Net user») – получить дату и время последней регистрации в сети, а также
определить, когда завершается срок действия пароля.
Программы-сканеры, задача которых заключается в
сборе информации о состоянии локальной сети или конкретного компьютера. Среди
наиболее интересных программ в плане получения информации о пользователях
отметим CFI LANguard Network Security Scanner (ver 3.1.5). Она
предоставляет возможность получения достаточно подробной информации об учетных
записях, такой как дата и время последней регистрации; данные о том, когда
пароль будет просрочен; количество регистраций пользователя в сети; значение
индекса попыток входа с некорректным паролем. Кроме того, программа позволяет
на основании данных двух сохраненных протоколов сканирования сформировать отчет
о расхождениях и получить перечень заведенных и удаленных учетных записей.
Справедливости ради отметим, что программа имеет существенные недостатки,
особенно для русскоязычной категории пользователей, так как она некорректно
обрабатывает русские названия (в именах и дополнительных параметрах учетных
записей и пр.). Кроме того, отсутствует возможность сохранить в отдельном файле
информацию о найденных расхождениях в списках учетных записей.
Перейдем теперь к рассмотрению утилит, которые,
на наш взгляд, предоставляют возможность получения наиболее полной информации
по пользователям – Ldifde.exe и Csvde.exe.
Первая утилита позволяет экспортировать данные из
Active Directory в файл формата LDIF. Стандарт файла LDIF определен в
рекомендациях RFC-2849 для импорта и экспорта данных из каталогов LDAP, таких
как Active Directory. После экспорта данных можно использовать LDIF-файл для
импорта тех же объектов в другой каталог LDAP.
Csvde.exe – утилита, аналогичная Ldifde.exe (параметры
вызова идентичны), в которой используется другой формат хранения данных в
текстовом файле – значения разделяются запятыми (CSV-формат). Данный формат
поддерживается программой Microsoft Excel, понимающей файлы в CSV-формате, а
также Microsoft Access.
Использование утилиты Csvde.exe
Для наглядности, вместо полного описания параметров работы с утилитой
приведем пример, на основе которого можно построить запросы для всех
необходимых для аудита случаев.
csvde -f USERS_WORK.CSV -b
GUEST MICROSOFT *
-r "(&(objectClass=user)(!(objectClass=computer))(!(userAccountControl=514))(!(userAccountControl=66050)))"
-l "DN, memberOf,
badPasswordTime, lastLogon, logonCount, sAMAccountName, userAccountControl, whenChanged,
whenCreated"
Использование данной команды позволяет сохранить
в файле наиболее интересную с точки зрения аудита информацию по действующим (не
заблокированным) учетным записям пользователей.
В файл USER_WORK.CSV (параметр -f) будут записаны
данные учетных записей пользователей домена. Программа будет производить
обработку данных, которые должны быть доступны пользователю GUEST домена
MICROSOFT, пароль для которого должен быть введен в процессе выполнения команды
(параметр -b).
Из всех объектов LDAP-каталога будут отобраны
только учетные записи пользователей, для которых в поле параметра userAccountControl
отсутствует информация о блокировке учетной записи (параметр -r). В качестве
логических операций для фильтра используются – «!» – логическое НЕТ, «&» –
логическое И, «|» – логическое ИЛИ.
В результате выполнения команды в CSV-файле будут
сохранены данные полей, перечисленных в параметре -l (список наиболее
интересных полей приведен в таблице 1).
Примечание: команда «Net user» некорректно
обрабатывает данные поля pwdLastSet, а также некоторые значения времени. Для
поля pwdLastSet, в случае если пароль не был задан, выводятся текущие дата и
время. Для данных времени вместо значений вида 00:mm AM и 00:mm PM выводятся
значения 12:mm AM и 12:mm PM соответственно.
Таблица 1. Описание некоторых
полей учетных записей LDAP-каталога
|
Название поля
|
Пояснение
|
Пример хранимых
данных
|
|
DN
|
Информация,
идентифицирующая учетную запись в каталоге LDAP.
|
CN=Bill Gates,CN=Users,DC=Microsoft,DC=com
|
|
memberOf
|
Информация о
группах, к которым принадлежит учетная запись.
|
CN=Domain Guests,CN=Users,DC=Microsoft,
DC=com;CN=Guests,CN=Builtin,DC=Microsoft, DC=com
|
|
lastLogon
|
Дата и время
последнего входа.
|
126340325381029632
|
|
badPasswordTime
|
Дата и время в
последний раз был использован неправильный пароль.
|
126334418756267552
|
|
pwdLastSet
|
Дата и время, когда
был задан последний пароль.
|
126318831197720512
|
|
accountExpires
|
Дата и время,
устанавливающие окончание действия учетной записи.
|
0
|
|
userAccountControl
|
Содержит несколько
параметров учетной записи.
|
66048
(0x10200
= DONT_EXPIRE_PASSWORD+NORMAL_ACCOUNT)
|
|
sAMAccountName
|
Имя, под которым
происходит регистрация.
|
Gates
|
|
whenChanged
|
Дата и время, когда
происходили последние изменения в учетной записи
|
20010511052201.0Z
|
|
whenCreated
|
Дата и время, когда
была создана учетная запись.
|
20010511052201.0Z
|
|
logonCount
|
Количество
регистраций.
|
28
|
|
objectClass
|
Класс объекта
учетной записи.
|
user
|
Форматы представления данных
даты и времени
Если вы были наблюдательны, то заметили, что в таблице 1 имеются два
различных варианта представления значений даты и времени.
Если формат вида ГГГГММДДЧЧММСС.0Z (тип GeneralizedTime
для ASN.1 кодирования), используемый для полей whenChanged, whenCreated по
Гринвичу достаточно понятен, то параметры, такие как lastLogon, pwdLastSet, accountExpires,
представляют информацию о дате и времени в 32-битном UNIX-формате, и содержат
значения секунд, прошедших начиная с 1 января 1970 г., GMT. Для наглядности
приведем некоторые значения, которые могут содержаться в файле выгруженных
значений для параметров даты и времени в UNIX-формате:
126858492000000000 –
соответствует 1.01.2003 00:00
127014876000000000 –
соответствует 1.07.2003 00:00
127014912000000000 –
соответствует 1.07.2003 01:00
Использование функций
преобразований для данных CSV-формата
Информацию по учетным записям, которая выгружена с помощью команды,
аналогичной, указанной в начале раздела «Использование утилиты Csvde.exe»,
можно попытаться загрузить в Microsoft Access, однако, в связи с тем, что
программа некорректно обрабатывает символ-разделитель «,» в структурах типа «CN=Bill Gates,CN=Users,
DC=Microsoft,DC=com», то лучше воспользоваться аналогичными возможностями
программы Microsoft Excel (см. рис. 1). Далее, информацию для удобства
использования можно обработать с помощью имеющихся в Microsoft Excel
возможностей (макросы, функций).

Рисунок 1. Пример данных
CSV-файла после экспорта в Microsoft Excel
На рисунках приведена информация CVS-файла сразу
после проведения его загрузки в Microsoft Excel (рис. 1) и после проведенных
преобразований (рис. 2). Примеры таких преобразований приведены ниже.
Предлагаемые варианты преобразований не претендуют на логическую законченность,
но могут являться той основой, с помощью которой за короткий срок может быть
разработан необходимый механизм обработки под каждый конкретный случай.

Рисунок 2. Вид информации
CSV-файла после преобразований с использованием возможностей Microsoft Excel
Получение данных из структуры
поля DN
Для получения имени пользователя из структуры вида «…CN=Имя_пользователя,…»
в ячейке A2, может быть использована следующая формула преобразования:
=ПСТР(A2;
НАЙТИ("CN=";A2)+3;
НАЙТИ(",";
A2;
НАЙТИ( "CN=";
A2 )+3
) -
НАЙТИ("CN=";A2) -3
)
Для получения информации из структуры вида «…OU=Данные,…»
в ячейке A2 может быть использована следующая формула преобразования:
=ЕСЛИ(ЕПУСТО('0'!A2);"";
ЕСЛИ(ЕОШИБКА(НАЙТИ("OU=";'0'!A2));
"USERS";
ПСТР( '0'!A2;
НАЙТИ("OU=";'0'!A2)+3;
НАЙТИ(",";
'0'!A2;
НАЙТИ("OU=";'0'!A2)+3)
–
НАЙТИ("OU=";'0'!A2)
-3
)
)
)
Обработка данных даты и времени
Unix-формата
Получение даты в формате ДД.ММ.ГГГГ на основании данных в Unix-формате
предлагаем производить в два этапа. На первом этапе вычисляется количество
дней, прошедших с 1 января 2003 г. На втором формируется строка даты в
стандартном формате.
Для получения количества дней, прошедших с 1
января 2003 г., на основании данных в ячейке F2, заданных в Unix-формате даты и
времени, может быть использована следующая формула преобразования:
= ЕСЛИ(
ЗНАЧЕН(ЛЕВСИМВ(F2;11))=0;
-1;
ОКРУГЛВНИЗ((ЗНАЧЕН(ЛЕВСИМВ(F2;11))-
12685849200)/24/3600; 0)
)
Полученное на первом этапе значение сдвига дней
относительно 1 января 2003 г. (в ячейке E2) используется для формирования даты
в стандартном формате.
=ЕСЛИ( E2=-1;
"Отсутствует";
СЦЕПИТЬ(
ДЕНЬ(ДАТАЗНАЧ("1/1/2003")+E2);
".";
МЕСЯЦ(ДАТАЗНАЧ("1/1/2003")+E2);
".";
ГОД(ДАТАЗНАЧ("1/1/2003")+E2)
)
Обработка данных даты и времени
формата GeneralizedTime для ASN.1 кодирования
Преобразование числа в формате ГГГГММДДММСС.0Z в формат ДД.ММ.ГГГГ ЧЧ:ММ
=СЦЕПИТЬ(
ПСТР(N2;7;2);
"."; ПСТР(N2;5;2); "."; ПСТР(N2;1;4); " ";
ПСТР(N2;9;2);
":"; ПСТР(N2;11;2)
)
Обработка значения поля userAccountControl
о блокированности записи
Получение данных о состоянии учетной записи по значению поля userAccontControl,
содержащемуся в ячейке G2:
=ЕСЛИ(ЕПУСТО(G2);"";
ЕСЛИ(ИЛИG2=514;
G2=66050);"Заблокированная";"Действующая")
)
Подробные пояснения и описание формата хранения
данных в поле userAccountControl можно найти в статье Microsoft «How to Use the
UserAccountControl Flags to Manipulate User Account Properties» (http://support.
microsoft.com/?kbid=305144). Отметим только, что если параметры учетной
записи не заданы, то десятичное значение userAccountControl равно 512; десятичное
значение для блокированной учетной записи при отсутствии других параметров –
514.
Заключение
В статье предложен достаточно простой метод получения данных для аудита
учетных записей пользователей в Active Directory, не требующий специальных
навыков и знаний языков программирования.
Отметим, что кроме изложенного метода может быть
использован вариант, рекомендуемый Microsoft, предполагающий использование
интерфейсов службы Active Directory (ADSI), которые предоставляют простой,
мощный, объектно-ориентированный доступ к ресурсам Active Directory. Интерфейсы
ADSI позволяют программистам и администраторам создавать программы каталога с
использованием инструментальных средств высокого уровня, например, Microsoft Visual
Basic, Java, C или Visual C++, не заботясь о различиях в пространствах
имен. Интерфейсы ADSI полностью поддерживают сценарии, что облегчает их
использование администраторами.
И напоследок, в качестве
рекомендаций перечислим те нюансы, на которые следует обратить внимание при
проведении анализа данных списка пользователей, которые могут указывать на
существующие проблемы при использовании учетных записей:
n заблокированные учетные записи (после анализа
последней даты регистрации могут быть удалены в случае, если необходимость в
них отсутствует);
n данные учетной записи о том, что последняя
регистрация в сети происходила три и более месяца назад, могут указывать на то,
что сотрудник, которому принадлежала учетная запись, уже уволен;
n если количество регистраций в сети для учетной
записи равно нулю, а со времени ее создание прошло свыше одного месяца, то это
может говорить о том, что созданная учетная запись оказалась невостребованной;
n большое количество регистраций в сети может
указывать на то, что учетная запись используется для входа в сеть не только
владельцем.