Сценарии для аудита разрешений доступа

Многие сетевые администраторы строят для файловых систем NTFS структуру разрешений на базе групп пользователей с очень сложной организацией. С течением времени возможность эффективного управления разрешениями на доступ к общим файлам и папкам теряется, особенно если пользователи часто просят предоставить временный доступ к различным папкам в общей структуре. В конечном итоге администраторы часто назначают таким пользователям индивидуальные разрешения для непосредственного доступа к папкам, так как ни одна из существующих групп не соответствует полномочиям этих пользователей.

Такие назначения не вызывают проблем, если администратор аккуратно применяет разрешения и не нарушает целостности папок. Однако трудности могут возникнуть спустя месяцы и годы, когда в процессе реорганизации предприятия администратору потребуется провести аудит и очистку групп и разрешений доступа к общим папкам.

С чего начать, если в ходе аудита настроек безопасности требуется составить отчет обо всех файлах и папках, к которым имеет доступ каждый пользователь или группа? К сожалению, нельзя получить данную информацию, один раз щелкнув мышью, но можно подготовить сценарий для аудита разрешений. Для этого понадобятся программы showacls.exe и net.exe.

Showacls.exe

Showacls.exe — полезная утилита командной строки, имеющаяся в наборах Microsoft Windows 2000 Server Resource Kit и Microsoft Windows NT Server 4.0 Resource Kit. С ее помощью можно отобразить разрешения на доступ к файлам и папкам на разделах NTFS, в том числе разрешения доступа пользователей. Синтаксис команды:

showacls.exe path [/s]

где path — полный путь к папке или файлу, для которого нужно показать разрешения доступа (например, F:mysharedata). Если указать факультативный ключ /s, то утилита отображает разрешения доступа к данному каталогу и всем его подкаталогам.

На первый взгляд может показаться, что для аудита достаточно одной лишь этой команды. Однако отсутствуют сведения о группах, в которые входит каждый пользователь, так как showacls.exe не располагает сведениями о членстве учетной записи в группах и не может определить файлы и папки, к которым имеет доступ та или иная группа. Поэтому администратору придется индивидуально рассматривать каждый файл или папку, чтобы выяснить, может ли данный пользователь или группа, в которую входит пользователь, обратиться к этому объекту. Showacls — удобная утилита, но аудит по-прежнему в основном выполняется вручную. Тем не менее можно использовать данную команду для сбора полезной информации программным путем, как показано ниже.

Net.exe

Net.exe поставляется вместе с Windows 2000, NT и другими операционными системами Windows. В этой утилите реализовано множество подкоманд для управления различными сетевыми компонентами, такими, как разделы, сессии, службы и учетные записи пользователей. Большинство сетевых администраторов используют ее для назначения и отмены символов для сетевых накопителей. Однако с помощью команды Net User можно получить информацию о группах, к которым принадлежит пользователь. Синтаксис команды:

Net User user [/domain]

где user — учетная запись пользователя, а /domain — ключ, объявляющий указанную учетную запись доменной, а не локальной. Команда Net User выдает основную часть информации об учетной записи пользователя, в том числе все группы, в которые он входит. Но прежде чем воспользоваться информацией о группах, необходимо выполнить синтаксический анализ собранных данных и получить имена групп. Именно эту задачу выполняет сценарий в Листинге 1. Звездочка (*) разделяет группы в выходных данных Net User, поэтому она используется в сценарии в качестве разграничителя. Затем сценарий удаляет завершающие пробелы и записывает группы, по одной в строку, во временном файле (например, %Temp%getaccess.$$$).

GetAccess.cmd

Showacls.exe и net.exe составляют фундамент сценария GetAccess.cmd. Сценарий генерирует текстовый файл, в котором перечислены все файлы и папки, к которым указанный пользователь или группа имеет доступ в заданном каталоге и всех его подкаталогах. При запуске сценария необходимо ввести три параметра: имя пользователя или группы, для которых проводится аудит (username_or_groupname), путь к исследуемому каталогу (path_to_scan) и имя выходного файла (outputfile). Можно указать факультативный параметр /d, если нужно выполнить аудит только папок, пропуская файлы. Другой факультативный параметр, /verbose, выводит на консоль информацию о действиях сценария в процессе его выполнения. Таким образом, синтаксис для запуска сценария имеет следующий вид:

GetAccess.cmd
username_or_groupname
path_to_scan outputfile
[/d] [/verbose]

Логика сценария проста, он работает следующим образом.

  • Удаляет выходной файл, если таковой уже существует. Для этого в сценарии используется команда
    If Exist %outputfile% Del
    %outputfile% /q
  • Готовит ключи для команды Dir. Как показано в Листинге 2, переменная dirflag определяет ключи в соответствии с параметрами, указанными при запуске сценария. Ключ /s указывает команде Dir, что нужно показать все объекты, в том числе подкаталоги, а ключ /b заставляет команду Dir выводить информацию в минимальном формате (без заголовка или итоговой информации). Если при запуске сценария указан параметр /d, то сценарий вставляет ключ /ad, чтобы показывать только подкаталоги.

Переменная filefolder используется для корректного вывода на экран информации о статусе. Эта информация заставляет сценарий обрабатывать файлы и папки или только папки.

  • Хранит введенное имя пользователя или имя группы и два встроенных имени группы (Everyone и Authenticated User) во временном файле (%temp%getaccess.$$$). Затем сценарий использует имена из этого файла и команду showacls.exe, чтобы определить, имеет ли указанный пользователь или группа доступ к файлу или папке.

Как показано в Листинге 3, команда Net User выясняет, принадлежит ли данная учетная запись группе или пользователю. Если команда Net User не сообщает об ошибке, значит, это учетная запись пользователя; в противном случае считается, что учетная запись принадлежит группе. Обнаружив учетную запись пользователя, сценарий переходит к этапу 4. Если данная учетная запись принадлежит группе, он переходит к этапу 5.

  • Если учетная запись принадлежит пользователю, то сценарий добавляет во временный файл группы, в которые входит пользователь. Эту операцию выполняет код в Листинге 1, рассмотренном выше.
  • Получает имена папок и файлов (или только папок, если применяется ключ /d) в указанном каталоге. Для этого используется переменная dirflag, определенная ранее для команд For и Dir:
    For /f «tokens=*» %%i in (?Dir
    %dirflag% %path_to_scan%?)
    Do Call :checkaccess «%%i»

По команде For каждая строка, выдаваемая командой Dir, сохраняется в переменной %i и обрабатывается в блоке программы под меткой :checkaccess.

  • Модули :checkaccess и :hasaccess составляют самую важную часть сценария, так как они идентифицируют файлы и папки, к которым имеет доступ пользователь или группа. Тем не менее программный код этих модулей достаточно прост (см. Листинг 4).

После того как сценарий передает имя файла или папки в модуль :checkaccess, это имя сохраняется в переменной target. Затем модуль :checkaccess проходит поочередно по всем учетным записям во временном файле и обрабатывает их с помощью модуля :hasaccess. Модуль :hasaccess сравнивает выходные данные команды Showacls для текущего файла или папки с текущей учетной записью во временном файле, фильтруя выходные данные с использованием двух команд Find.

Если одна из команд Find возвращает код выхода 0, значит, обнаружено совпадение. В случае совпадения сценарий посылает имя файла или папки в выходной файл и на экран консоли.

Известные ограничения

Сценарий GetAccess.cmd успешно работает в средах Windows 2000 и NT. Show-acls.exe необходимо разместить в той же папке, из которой запускается сценарий, или в папке, на которую указывает путь path. GetAccess.cmd имеет ряд ограничений.

  • Сценарий не определяет, существует ли указанная учетная запись в данном домене. Он определяет лишь принадлежность учетной записи пользователю. Если учетная запись пользователю не принадлежит, то сценарий предполагает, что она принадлежит группе. Таким образом, если имя учетной записи введено с ошибкой, сценарий полагает, что имеет дело с учетной записью группы. Поэтому следует убедиться, что все имена учетных записей в командной строке введены правильно.
  • Сценарий работает лишь с учетными записями в данном домене. Это ограничение накладывается командой Net.exe.
  • В зависимости от соглашения об именовании в данной организации, сценарий может ошибочно обнаружить совпадение, если имя одной учетной записи представляет собой сокращенный вариант имени другой учетной записи. Например, если MyGroup21 имеет доступ к файлу, а сценарий ищет имя MyGroup2, то имя MyGroup21 будет обнаружено как совпадение. Этой ситуации можно избежать, заменив команду Find командой Findstr с ключом /x. Однако если команда Find в сценарии заменена на команду Findstr, то при вводе имени учетной записи группы в качестве параметра следует убедиться, что имя точно соответствует (с учетом регистра символов) имени группы в оснастке Active Directory Users and Computers консоли Microsoft Management Console (MMC) (Windows 2000) или в User Manager for Domains (NT).
  • Сценарий может работать чрезвычайно медленно, особенно при поиске учетных записей, принадлежащих многим группам в больших файловых структурах. Скорость выполнения сценария мала, так как для каждой учетной записи во временном файле необходимо исполнить команду showacls.exe в каждой папке, обнаруженной командой Dir. Например, если в папке находится 1000 подкаталогов и временный файл содержит пять учетных записей (Everyone, Authenticated User, указанного пользователя и двух дополнительных групп, к которым принадлежит пользователь), то модуль :hasaccess должен быть выполнен 5000 раз (1000 подпапок * пять учетных записей).

Таким образом, GetAccess.cmd представляет собой не требующее значительных затрат решение проблемы аудита, которая встает перед многими администраторами. Несмотря на некоторые ограничения сценария, пользоваться им гораздо удобнее, чем вручную проверять полномочия каждого файла и папки.

Стив Сегьюс — консультант компании RCG Information Technology в Нью-Йорке. Имеет сертификаты MCP, MCSE и является сертифицированным программистом по Java2. С ним можно связаться по адресу: scriptmaster@scripthorizon.com.


Листинг 1. Грамматический разбор выходных данных команды Net User.
Set account = myuser1
For /f «tokens=2,3 delims=*» %%i in
    (?Net User %account% /domain ^| Find «*»?)
    Do Call :splitgroups «%%i» «%%j»
Goto :EOF
:splitgroups
Set group1=%1
Set group2=%2
BEGIN COMMENT
:: Clear the trailing spaces.
END COMMENT
Set group1=%group1: =%
Set group1=%group1: «=»%
Set group1=%group1:»=%
Set group2=%group2: =%
Set group2=%group2: «=»%
Set group2=%group2:»=%
BEGIN COMMENT
:: Запись во временный файл.
END COMMENT
If Not «%group1%»==»» echo
 %group1% >> %temp%getaccess.$$$
If Not «%group2%»==»» echo
 %group2% >> %temp%getaccess.$$$
Goto :EOF
Листинг 2. Подготовка ключей команды Dir.
Set dirflag=/s /b & Set filefolder=files
 and folders
If /i #%4#==#/d# Set dirflag=/s /b /ad
 & Set filefolder=folders
If /i #%5#==#/d# Set dirflag=/s /b /ad
 & Set filefolder=folders
Листинг 3. Определение типа учетной записи.
Echo %account% > %temp%getaccess.$$$
Echo Everyone >> %temp%getaccess.$$$
Echo Authenticated >> %temp%getaccess.$$$
Net User «%account%» /domain > Nul 2> Nul
If Not %errorlevel% EQU 0 Goto :EOF
Листинг 4. Идентификация доступных папок.
:checkaccess
Set target=%1
For /f «tokens=*» %%j in (%temp%getaccess.$$$)
	Do Call :hasaccess «%%j»
Goto :EOF
:hasaccess
Set group=%1
Echo Checking for %group% in %target%...
showacls.exe %target% | Find /v /i 
«denied» | Find /i %group% > Nul
If %errorlevel% EQU 0 Echo Match %target%
	& Echo %target% >> %outputfile%
Goto :EOF