Как обезопасить свои сценарии

Дабы не изобретать велосипед всякий раз при подготовке нового сценария, авторы часто используют старые исходные тексты. Однако во многих случаях сценарий требуется приспособить для работы в конкретном контексте безопасности. Например, предположим, что нам нужен сценарий для локального и дистанционного мониторинга служб Windows и в нашем распоряжении есть готовый сценарий ServiceMonitor.wsf. Данный сценарий выполняет задачи, которые требуется автоматизировать. Он использует Windows Management Instrumentation (WMI) для мониторинга служб, перезапускает отслеживаемую службу, если она останавливается, и передает предупреждение по электронной почте, если служба не перезапускается. Однако, для того чтобы запустить сценарий ServiceMonitor.wsf на удаленной машине, необходимо ввести имя и пароль. Данная процедура небезопасна, так как информация вводится открытым текстом в командной строке. Кроме того, сценарий выдает предупреждения, посылая сообщения по электронной почте через защищенный ретранслятор SMTP, поэтому учетные данные для организации соединения SMTP жестко заданы в сценарии — еще одно небезопасное решение. Ретранслятор SMTP можно настроить на прием анонимных соединений, но делать это во избежание лишнего риска не рекомендуется.

К счастью, существует несколько способов обойтись без рискованных приемов. Три типовых решения для сценариев Windows Script Host (WSH) — запросить пароли у пользователей, закодировать сценарий или запустить сценарий как службу Windows. Прежде чем перейти к обсуждению практической реализации этих решений, необходимо поближе познакомиться со сценарием ServiceMonitor.wsf, который предстоит адаптировать.

ServiceMonitor.wsf

В листинге 1 показан фрагмент ServiceMonitor.wsf. Весь сценарий можно загрузить c http://www.windowsitpro.ruc ID 44580 из раздела Downloads, файл 44580.zip.

Для запуска сценария можно использовать команду

ServiceMonitor.wsf ServiceName

[ServiceName] [/Machine:value]

[/User:value] [/Password:value]

Команда напечатана на нескольких строках, но вводить ее необходимо одной строкой. То же самое относится и к другим многострочным командам, приведенным в статье. В данной команде каждый параметр ServiceName указывает имя проверяемой службы Windows. Можно указать одну или несколько служб. Параметры /Machine, /User и /Password — необязательные. Если пропустить их, сценарий установит соединение с системой WMI на локальной хост-машине с применением учетных данных пользователя, запустившего сценарий. Чтобы установить соединение с системой WMI на удаленной машине, имя удаленного компьютера задается параметром /Machine, имя пользователя для дистанционного соединения — параметром /User, а пароль удаленного соединения — параметром /Password.

Запрос паролей

Один из способов защиты — запрашивать у пользователя пароль при запуске сценария. В Windows Server 2003 и Windows XP появился новый COM-объект ScriptP

W.Password. Этот объект считывает любой вводимый текст из стандартного входного потока. Данный объект не отображает вводимый текст на экране, что очень удобно для ввода пароля.

Чтобы запросить пароли из ServiceMonitor.wsf, сценарий необходимо изменить следующим образом.

  1. Удалить фрагмент A из листинга 1. Этот участок исходного текста не нужен, так как сценарий запрашивает пароли у пользователя.
  2. Добавить тэг


    id=»objPasswordPrompt» />

    после фрагмента B в листинге 1. Этот тэг определяет объект ScriptPW.Password, чтобы его можно было использовать в сценарии.

  3. Заменить исходный текст с меткой D в листинге 1 исходным текстом, показанным в листинге 2. Новый код просит пользователя ввести пароль для удаленного соединения WMI, а затем пароль для соединения SMTP. Пароль для соединения WMI запрашивается, только если указан параметр /User. Если параметр /User не задан, то сценарий использует для WMI-соединения контекст безопасности пользователя, запустившего сценарий.
  4. В файл 44580.zip входит сценарий с именем ServiceMonitorWithPrompt.wsf. Этот сценарий содержит описанные выше изменения. Сценарий запускается командой

    ServiceMonitorWithPrompt.wsf

    ServiceName [ServiceName]

    [/Machine:value] [/User:value]

    Кодирование сценария

    ServiceMonitorWithPrompt.wsf защищает пароли, используемые при выполнении сценария, но при начальном запуске сценария требуется вмешательство пользователя. Поэтому ServiceMonitorWithPrompt.wsf для запуска без участия оператора не годится. Однако жесткое задание паролей в простом текстовом формате, как это сделано в сценарии ServiceMonitor.wsf для пароля SMTP, — явно опасный способ. К счастью, с помощью Script Encoder (scr10enc.exe) можно закодировать файлы VBScript и JScript, снизив риск при жестком кодировании паролей до минимума. Эту бесплатную утилиту можно загрузить с узла Microsoft Developer Network (MSDN) по адресу http://msdn.microsoft.com/library/default.asp?url=/downloads/ list/webdev.asp.

    При использовании Script Encoder расширение сценария меняется на .vbe и .jse для файлов VBScript и JScript соответственно. Такая смена расширения важна, потому что сообщает механизмам WSH о кодировании сценария.

    К сожалению, Script Encoder не работает с файлами .wsf, так как утилита несовместима с тэгами XML, используемыми в WSH. Чтобы обойти этот недостаток, достаточно принять следующие меры.

    1. Вырезать исходный текст VBScript в разделе в файле ServiceMonitor.wsf и сохранить его в файле .vbs.
    2. Закодировать .vbs-файл с помощью Script Encoder.
    3. Вырезать закодированный исходный текст из файла .vbe и вставить его в раздел файла ServiceMonitor.wsf.

    В файле 44580.zip есть сценарий с именем ServiceMonitorEncoded.wsf, который содержит закодированный раздел. На экране 1 показан фрагмент этого сценария. Следует обратить внимание на оператор VBScript.Encode в тэге