Бывают случаи, когда требуется выполнить какую-либо команду на сервере локально (например, сконфигурировать iSCSI Initiator). Подключаться для этого через Remote Desktop и запускать cmd – неудобно, использовать Telnet – небезопасно, ставить на сервер демона ssh – не… хочется…
Специально для таких запущенных случаев, Microsoft, начиная с Windows Server 2003 R2, снабдила администраторов новым средством управления – Windows Remote Management (WinRM), позволяющим удаленно выполнять команды, используя стандартные средства ОС, и обеспечивая при этом должный уровень безопасности.
Вам даже не придется устанавливать дополнительных программ и компонентов – все, что называется, включено:
Настройка WinRM
В качестве примера я рассмотрю процесс настройки WinRM на Windows Server 2008. Эта процедура никак не отличается от настройки WinRM, например, на Windows Vista или Hyper-V Server.
Проще всего WinRM настроить можно, используя режим быстрой конфигурации, набрав в CMD:
1 |
<strong>winrm quickconfig</strong> |
и ответив утвердительно (‘y‘) на вопрос о создании нового объекта-listener’а, прослушающего порт TCP 80, и использующего протокол HTTP для коммуникаций между клиентом и сервером.
И все, сервером можно управлять удаленно, используя команду:
1 |
<strong>winrs -r:<em><ИМЯ_СЕРВЕРА></em> <em><КОМАНДА></em></strong> |
где:
<ИМЯ_СЕРВЕРА> – имя или IP адрес сервера, к которому осуществляется подключение;
<КОМАНДА> – удаленная команда, которую требуется выполнить.
Если клиент и сервер не являются членами одного домена, вам потребуется дополнительно указать имя пользователя из-под которого будет запускаться команда и его пароль:
1 |
<strong>winrs -r:<em><ИМЯ_СЕРВЕРА></em> -u:<em><ИМЯ_ПОЛЬЗОВАТЕЛЯ></em> -p:<em><ПАРОЛЬ></em> <em><КОМАНДА></em></strong> |
а заодно, как советует появившееся сообщение, добавить сервер в список доверенных узлов, либо использовать более надежный протокол для коммуникации (HTTPS).
Для добавления узла в список надежных, выполните на клиенте, с которого планируете подключаться:
1 |
<strong>winrm set winrm/config/client @{TrustedHosts="<em><ИМЯ_УЗЛА1></em>[,<em><ИМЯ_УЗЛА2></em>]"}</strong> |
После настройки вы можете получить информацию о существующих listener’ах с помощью команды:
1 |
<strong>winrm enumerate winrm/config/listener</strong> |
Удалить существующий listener можно следующим образом:
1 |
<strong>winrm delete winrm/config/listener?Address=*+Transport=HTTPS</strong> |
Настройка WinRM с использованием HTTPS
В ряде случаев вам может потребоваться создать надежный канал для безопасной пересылки команд между клиентом и сервером. Для этого можно использовать HTTPS.
Однако, для создания listener’а с поддержкой HTTPS вам потребуется цифровой сертификат, который можно запросить у доверенного Центра Сертификации, либо воспользоваться различными утилитами по созданию самоподписанных (самозаверенных) сертификатов, например, Makecert, входящей в состав Windows SDK. Скачать Makecert отдельно можно отсюда.
Для создания самоподписанного серитификата выполните следующую команду:
1 |
<strong>makecert -a sha1 -r -pe -n "CN=<em><ИМЯ_СЕРВЕРА></em>" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -m 12 <em><ФАЙЛ_СЕРТИФИКАТА></em></strong> |
где
<ИМЯ_СЕРВЕРА> соответствует имени, которое будет использовать клиент при подключении к серверу;
<ФАЙЛ_СЕРТИФИКАТА> – путь к файлу, куда будет сохранен сертификат с открытым ключем.
Сертификат с закрытым ключем будет создан и помещен в хранилище сертификатов локального компьютера. Добавьте его к доверенным корневым сертификатам:
1 |
<strong>certutil -addstore root cert.cer</strong> |
Теперь просмотрите хранилище сертификатов, найдите там требуемый сертификат и запишите его Thumbprint (Cert Hash):
1 |
<strong>certutil -store my</strong> |
Наконец, можно приступать к созданию HTTPS listener. Введите команду:
1 |
<strong>winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="<em><ИМЯ_УЗЛА></em>";CertificateThumbprint="<em><ХЭШ_СЕРТИФИКАТА></em>";Port="<em><ПОРТ></em>"}</strong> |
где
<ИМЯ_УЗЛА> – имя, которое указывается при обращении к серверу
<ХЭШ_СЕРТИФИКАТА> – Thumbprint, который вы узнали на предыдущем шаге (без пробелов).
<ПОРТ> – порт, на который будет подключаться клиент (TCP 443 по-умолчанию).
Если на сервере включен брандмауэр Windows, не забудьте добавить правило:
1 |
<strong>netsh advfirewall firewall add rule protocol=TCP dir=in localport=4443 action=allow</strong> |
При использовании самоподписанных сертификатов, вам придется добавить его к доверенным корневым сертификатам на клиенте.
После выполнения всех шагов, вы, наконец, получите возможность удаленного выполнения команд:
Обратите внимание, что в случае использования нестандартного порта, вам потребуется специально его указать. Чтобы не делать этого каждый раз, вы можете изменить стандартный порт, который клиент использует при подключении по HTTPS, с помощью команды:
1 |
<strong>winrm set winrm/config/client/DefaultPorts @{HTTPS="4443"}</strong> |
Заключение
Как видите, настройка Windows Remote Management достаточно проста в классических ситуациях (с использованием единого домена и CA), однако, при небольшом отклонении от данного шаблона могут обнаружиться несколько подводных камней. К WinRM привыкнуть можно достаточно быстро, особенно, если вы частенько пользуетесь консолью для настройки системы.
При подготовке статьи использовались следующие материалы: