суббота, 2 октября 2010 г.

Хранение учетных данных в скриптах и групповых политиках на примере задачи по смене пароля локального администратора

Введение

clip_image001С точки зрения безопасности пароль локального администратора должен соответствовать следующим требованиям:

· быть известным только ограниченному кругу лиц;

· обладать достаточной сложностью;

· регулярно изменяться.

В связи с этим периодически возникает задача централизованной передачи учетных данных на рабочие станции пользователей. Решать данную задачу в домене Active Directory можно как минимум несколькими способами:

1) при помощи стартап-скриптов;

2) используя предпочтения групповых политик;

3) запуском скрипта на выделенном компьютере.

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

Стартап-скрипты

Стартап-скриптов зачастую используется для автоматизированного выполнения задач, требующих административных привилегий, на компьютерах пользователей. Допустим, что перед нами стоит задача привести к единому стандарту пароль локального администратора на части компьютеров домена.

Для решения применим скрипт, позаимствованный с блога «Hey, Scripting Guy!», и немного отредактируем его. В итоге получится что-то вроде:

strComputer = "."

Set objUser = GetObject("WinNT://" & strComputer & "/Administrator,user")

objUser.SetPassword "12345-as" '

objUser.SetInfo

Сам скрипт не идеален. Например, в него можно добавить:

1) привязку к SID встроенного администратора (это необходимо если учётная запись была переименована);

2) логирование в журнале событий системы;

3) отправку оповещений об ошибках выполнения по электронной почте.

Однако скрипт нужен нам лишь в качестве примера, поэтому нет смысла усложнять его структуру.

Теперь для автоматического изменения пароля администратора нам необходимо:

1) создать групповую политику;

2) добавить туда наш скрипт в качестве стартап-скрипта (более подробно об этом написано в KB198642);

3) прикрепить групповую политику к контейнеру с компьютерами, на которых должен изменяться пароль.

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

Кодирование

Для решения данной проблемы мы можем воспользоваться утилитой Script Encoder от компании Microsoft. Эта утилита позволяет преобразовать vbs-скрипт в формат vbe. В результате, тело скрипта хранится в закодированном виде и это никак не сказывается на возможности его исполнения. Рассмотрим это более подробно на нашем примере:

1) Скачиваем установочный файл с сайта Microsoft.

2) Распаковываем его.

3) В результате получаем несколько файлов. Один из них - нужная нам утилита screnc.exe. Синтаксис использования следующий:

SRCENC [switches] inputfile outputfile.

Здесь inputfile – исходный vbs-скрипт, outputfile – его зашифрованный аналог, [switches] – необязательные параметры, которые нам не понадобятся.

4) В итоге тело скрипта будет иметь вид:

«#@~^mQAAAA==dDD/K:aEYD,xPrRE@#@&?nO,W4Ni/DP{~!+Dr(LnmOcrrxgP)JzE~LP/O.;Whw!OD~LPrzb9:bUkkY.lDW.S!/+ME#@#@&W(%i/Dc?nYKCk/AWM[PrF+fW*OCdrPv@#@&G(Lik+MR?Y&U0K@#@&Ly4AAA==^#~@»

Полученный vbe-файл можно использовать в качестве стартап-скрипта и он, также как и исходный скрипт, будет менять пароль локального администратора.

Декодирование

Казалось бы теперь учетные данные защищены и системный администратора может спать спокойно. Однако существуют vbs-скрипты, с помощью которых можно легко раскодировать зашифрованный вариант. Пример такого скрипта можно получить по следующему адресу: http://www.interclasse.com/scripts/decovbe.php.

Для его использования, скопируем код в файл decode.vbs и запустим его из командной строки. В качестве аргумента будет путь и имя закодированного vbe-файла:

decode.vbs output.vbe

В результате выполнения должно появиться окно, содержащее текст исходного vbs-скрипта. Как следствие учетные данные администратора опять могут стать известны потенциальному злоумышленнику.

Альтернативные варианты

Рассмотрим альтернативные способы решения задачи передачи учетных данных на рабочие станции. К таковым можно отнести:

1) Group Policy Preferences;

2) централизованное изменение пароля со стороны сервера;

3) усложнение структуры скрипта и ограничение доступа к нему.

Group Policy Preferences (GPP)

Предпочтения групповых политик это своего рода замена скриптам в групповых политиках. Данная технология активно рекламируется Microsoft и действительно значительно упрощает работу системного администратора. Изменение пароля локального администратора при помощи GPP довольно подробно описано в статье: «Change local administrator passwords with Group Policy Preferences». Ключевая мысль этой статьи: «Не рекомендуется изменять пароли локального администратора и сервисных учетных записей при помощи GPP». Связано это с тем, что ни смотря на то, что пароль администратора хранится в зашифрованном виде, для его получения достаточно 256bit AES ключа находящегося на рабочей станции. Таким образом, этот способ также не является безопасным.

Централизованное изменение пароля

Еще одним вариантом изменения пароля является выполнение скрипта не на рабочей станции, а непосредственно на сервере. Пример скрипта для осуществления этого можно найти в статье:

«How Can I Change a User’s Password?». Предложенный там скрипт:

Set objOU = GetObject("LDAP://OU=Finance, DC=fabrikam, DC=com")

objOU.Filter = Array("Computer")

For Each objItem in objOU

strComputer = objItem.CN

Set objUser = GetObject("WinNT://" & strComputer & "/Administrator")

objUser.SetPassword("i5A2sj*!")

Next

берет информацию о компьютерах из контейнера Active Directory и поочередно подключаясь к каждому из них меняет пароль администратора. Из минусов такого варианта можно отметить:

· необходимость удаленного подключения к компьютерам (а они не всегда могут быть доступны);

· организацию автоматического запуска скрипта по расписанию.

Усложнение структуры скрипта

Достаточно много вариантов с применением скриптов изложено в обсуждение «Смена пароля локального администратора» на форумах Microsoft Technet. Особенно интересен вариант с веб-сервером. При его использовании компьютер во время загрузке обращается к серверу, на котором выполняется скрипт по изменению пароля локального администратора. Таким образом этот способ удачно сочетает в себе двух других вариантов, основанных на использовании startup-скриптов и централизованной смены пароля.

Заключение

В статье предложены различные способы централизованной автоматической смены пароля локального администратора на рабочих станциях домена Active Directory. Для каждого рассмотрена возможность получения учетных данных потенциальным злоумышленником. В конце статье предложен наиболее безопасный, с точки зрения автора, алгоритм.

Ссылки:

· Script Encoder;

· Passwords in Group Policy Preferences;

· Change local administrator passwords with Group Policy Preferences;

· How Can I Change a User’s Password? ;

· Форумы Technet: Смена пароля локального администратора.

1 комментарий: