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

Я написал сценарий на языке Perl. Это мощный, расширяемый язык сценариев с открытым исходным текстом. Он перенесен на большинство платформ (в частности, Unix, Macintosh, Win32, VMS) и пригоден для подготовки сценариев, работающих на любых системах. Сценарий взаимодействует с реестром Win32, в котором хранится основная информация о конфигурации Win32, и проверяет некоторые настройки, влияющие на безопасность. В сценарии реализована простая функция автоматического обследования, которая обеспечивает проверку всех машин сети.

Сценарии на Perl

Perl появился более 10 лет назад и скоро стал популярен среди администраторов, так как достаточно удобно использовать один язык на разных платформах. Скомпилированные двоичные файлы Perl для платформы Win32 можно загрузить с сайта ActiveState (http://www.activestate.com). Информацию о Perl, в том числе подробные сведения о том, как получить и скомпилировать исходный текст, можно найти на нескольких Web-узлах. На сайте Perl, который поддерживает компания O'Reilly & Associates (http://www.perl.com), опубликованы различные статьи, мнения специалистов и другая информация.

Одно из основных достоинств Perl — его обширная поддержка. Существует множество сетевых хранилищ, из которых можно загрузить готовые сценарии, модули и расширения. Модули представляют собой библиотеки функций; расширения — это DLL, которые обогащают функциональность языка. Два таких компонента, выпущенных для платформы Win32, — модуль Net::Ping, содержащий функцию обнаружения ping протоколов Internet Control Message Protocol (ICMP) и TCP, и расширение Win32::Registry, которое обеспечивает доступ к реестру Win32. И Net::Ping, и Win32::Registry входят в состав комплекта установки ActivePerl, который можно найти на сайте ActiveState.

Объединив эти модуль и расширение, можно составить сценарий для автоматического обследования машин Win32 в сети и обработки их реестров. В Листинге 1 показано, как собрать информацию о сетевых машинах Windows и защитить их с помощью Win32::Registry и Net::Ping.

Обнаружение систем

Существует несколько способов, позволяющих определить, какие машины подключены к сети. Один из них — направить запрос в Active Directory (AD) через интерфейсы Active Directory Service Interfaces (ADSI). В сценариях Perl для взаимодействия с ADSI можно использовать модель COM, поэтому следует загрузить расширение Win32::OLE. Можно еще использовать протокол LDAP (Lightweight Directory Access Protocol), но я предпочитаю процедуры аутентификации и авторизации ADSI. Однако ADSI нельзя применять в сетях, в которых нет AD, например в доменах Windows NT. Еще один способ обнаружить машины домена — воспользоваться функцией GetMachines() расширения Win32::AdminMisc или функцией NetQueryDisplayInformation() расширения Win32::Lanman для опроса контроллера домена (DC).

В результате запроса к AD или DC администратор получает список всех машин данного домена. Они могут быть отключены от сети или вообще изъяты из эксплуатации (например, машины давно удалены из домена, но остались их учетные записи). Кроме того, в список войдут только компьютеры указанного домена, но не других доменов или рабочих групп сети.

Чтобы не было подобных проблем, в сценарии реализована одна из форм автоматического обнаружения. В метке C Листинга 1 сценарий создает объект Net::Ping, который тестирует с помощью ping каждый IP-адрес в данной подсети. По умолчанию, Net::Ping использует для тестирования протокол ICMP, но объект поддерживает и TCP-тестирование. Более подробные сведения приведены в документации по модулю Net::Ping. В программном фрагменте с меткой E проверяется весь диапазон IP-адресов, заданный во фрагменте A. Сценарий направляет запрос по всем IP-адресам и вызывает подпрограмму ProcessHost() для каждой ответившей машины.

Обработка реестра

Для отправки запроса к реестру удаленной машины в подпрограмме ProcessHost() используется расширение Win32::Registry. Подпрограмма пытается установить связь с удаленной машиной. Если машина не принадлежит к платформе Win32, то установить соединение не удастся. Соединение нельзя установить и в том случае, если доступ к реестру удаленной машины невозможен (например, пользователь, запустивший сценарий, не имеет полномочий для доступа к реестру компьютера).

Если связь установлена, подпрограмма пытается получить четыре значения реестра. Если раздел реестра успешно открыт, то подпрограмма получает конкретную величину, выводит ее на экран, закрывает раздел и приступает к обработке следующего значения. Четыре величины — сетевое имя машины, имя последнего зарегистрированного пользователя, приблизительная скорость компьютера в мегагерцах и список нулевых ресурсов сеанса (null session shares).

Нулевые ресурсы сеанса — это каталоги общего доступа, с которыми не связано никаких полномочий. Соответственно, они не требуют аутентификации у клиентов. Нулевые ресурсы сеанса представляют собой угрозу для системы безопасности, поэтому такие каталоги рекомендуется удалить. Более подробная информация о том, когда могут потребоваться нулевые ресурсы сеанса, приведена во врезке «Использование нулевых ресурсов сеанса».

Программный фрагмент с меткой F получает и обрабатывает список нулевых ресурсов сеанса. В строке с меткой G список с разделителями-нулями разбивается на имена разделяемых ресурсов. Затем для каждого имени разделяемого каталога во фрагменте с меткой H производится вызов подпрограммы IsShareAllowed(), которая проверяет принадлежность имени ресурса к массиву @VALID_SHARES (определен в программном фрагменте с меткой B). Для своих целей я сохраняю в массиве имена четырех ресурсов, которые могут быть нулевыми ресурсами сеанса в моей компании. Эти четыре ресурса необходимы для работы служб Microsoft Dfs и Inoculan AntiVirus фирмы Computer Associates (CA). Другим администраторам следует изменить массив, указав в нем имена ресурсов, допустимые в конкретной сети.

В программном фрагменте H есть строка, которую я исключил символом комментария. Она удаляет из списка нулевых ресурсов сеанса в реестре любые имена, не входящие в массив @VALID_SHARES, и сохраняет в реестре обновленный список. Если FixNullShares.pl используется для удаления недопустимых имен нулевых ресурсов сеанса из реестра машин, то достаточно убрать символ комментария (#) в начале строки. Но прежде, чем это сделать, следует убедиться, что массив @VALID_SHARES содержит корректные имена ресурсов сети или определенной машины.

Протоколирование результатов

Иногда имеет смысл отслеживать результаты работы сценария. Во фрагменте с меткой D назначен такой же путь к файлу журнала, как и в сценарии FixNullShares.pl, но журнал имеет расширение .log вместо .pl. Открыв файл журнала, сценарий вызывает функцию select() и выбирает дескриптор файла LOG. Затем отменяется выходная буферизация для дескриптора файла LOG (в данном случае для «выбранного» дескриптора файла), чтобы данные журнала записывались на диск немедленно. Этот метод облегчает диагностику, так как для просмотра файла журнала не требуется ждать очистки буферов. Затем сценарий выбирает дескриптор исходного файла, чтобы направить данные на экран, а не в файл журнала.

Позже, во фрагменте с меткой I, функция printf() пересылает информацию в файл журнала. Следует обратить внимание, что сценарий проверяет результат команды if(fileno LOG) и вызывает функцию printf(), только если дескриптор файла LOG существует. Если создать файл журнала не удалось, то результатом будет нулевое значение, и сценарий не выполняет функций printf() и close(). Если не проверить if(fileno LOG), а файл открыть невозможно, произойдет ошибка на этапе выполнения, и работа сценария будет прекращена.

Настройка сценария

Сценарий FixNullShares.pl — отличный способ обнаружить IP-адрес машины. Он сработает, даже если для назначения IP-адресов из пула в сети используется протокол DHCP. В сценарии предполагается наличие сети класса C, каждая подсеть которой содержит адреса узлов в диапазоне от 0 до 255. Но сценарий можно приспособить для сети любого типа.

Сценарий принимает до трех факультативных параметров. Первый параметр указывает номер подсети; второй и третий параметры представляют минимальный и максимальный адреса узлов, соответственно. Например, команда

perl FixNullShares.pl 192.186.33 65 189

опрашивает все машины между адресами 192.186.33.65 и 192.186.33.189 включительно.

Как отмечалось выше, необходимо заменить список допустимых нулевых ресурсов сеанса FixNullShares.pl списком имен, разрешенных в конкретной сети. Достаточно заменить значения массива @VALID_SHARES на список допустимых ресурсов.

Самые значительные возможные изменения касаются задач, выполняемых сценарием FixNullShares.pl. Например, вместо поиска последних посетителей серверов, сценарий может запросить или обновить параметры DCOM (Distributed COM), параметры DHCP, конфигурацию служб и параметры программного обеспечения. Причем пользователь, запускающий сценарий, должен иметь соответствующие полномочия для доступа к реестру удаленного сервера. Как правило, член группы Domain Admins имеет достаточные права.

Преимущества удаленного доступа к реестру

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

Объединив Perl с реестром Win32, можно получить превосходный многофункциональный инструмент. Из Internet можно загрузить и бесплатно использовать сотни модулей Perl. Сценарий FixNullShares.pl позволяет оценить гибкость этих бесплатных программ.

Дейв Рот — автор нескольких Perl-расширений Win32, в том числе Win32::AdminMisc, Win32::ODBC, Win32::Daemon и Win32::Perms. Адрес его Web-узла: http://www.roth.net.

С ним можно связаться по адресу: droth@winnetmag.com.


Использование нулевых ресурсов сеанса

Администраторам редко приходится обращаться к нулевым ресурсам сеанса. Однако при определенных обстоятельствах они полезны. В качестве примера можно взять такую службу Win32, как Microsoft IIS, которая должна обращаться к информации на удаленных машинах. По умолчанию, IIS создает учетную запись локального пользователя с именем IUSR_machinename. Если анонимный пользователь обращается на Web-узел, IIS регистрируется с этой учетной записью. Поэтому при обращении к файлу или странице Active Server Page (ASP), в том числе к файлам на удаленной машине через путь Universal Naming convention (UNC), IIS использует учетные данные IUSR_machinename. Удаленный компьютер не может идентифицировать пользователя по учетной записи IUSR_machinename, так как учетная запись существует только на машине IIS. Но если UNC указывает на разделяемый каталог с нулевым ресурсом сеанса, то удаленный компьютер не запрашивает учетных данных у IIS-машины, и учетная запись IUSR_machinename получает полный доступ к ресурсу UNC.

Нулевые ресурсы сеанса необходимы и для некоторых служб; в процессе установки службы заносят имена разделяемых ресурсов в список нулевых ресурсов сеанса в реестре. Например, Microsoft Dfs создает нулевой ресурс сеанса DFS$. Удаление этого ресурса может нарушить работу службы Dfs. На большинстве машин Windows создается нулевой ресурс сеанса COMCEG, который, вероятно, используется для коммуникационных служб SNA. Нулевые ресурсы сеанса нужны и таким службам, как утилита Unix Line Print Remote (LPR), и некоторым антивирусным пакетам, в частности VirusScan компании McAfee и Inoculan AntiVirus фирмы Computer Associates (CA).