Удаленный доступ (RDP) в Windows Azure

Наша команда часто общается с разработчиками, которые выбрали для своих решений платформу Windows Azure. Опыт начинающих Windows Azure программистов показал, что наличие удаленного доступа по RDP к экземпляру ролей Windows Azure, во многом упрощает жизнь и диагностировании проблем.

И самое интересно, что не все сразу замечают эту функциональность. Поэтому в статье я хочу рассказать о том, каким образом настроить RDP и как он работает в Облаках.

Итак, удаленный доступ может быть настроен для любой роли в Windows Azure: веб, воркер или VM-роли.

С помощью Visual Studio настройка выполняется буквально в два клика через диалог публикации:

image image

Обратите внимание, что нам требуется сертификат, который шифрует учетные данные. Мы можем использовать уже имеющийся сертификат или создать новый. Visual Studio автоматически загрузит сертификат в нашу подписку Windows Azure при публикации приложения.

Далее просто на портале нажимаем кнопку Connect.

image

В итоге Вы получаете полнофункциональный RDP доступ (в том числе и copy-past возможности по передаче файлов).

image

Без Visual Studio так же можно выполнить настройку RDP (все шаги, описанные ниже среда разработки с Windows Azure SDK, выполняет автоматически):

1. Создает self-signed PFX сертификат и экспортируем его из хранилища в файл.

2.Изменяем настройки ServiceDefinition.csdef.

<Imports>
<Import moduleName="RemoteAccess"/>
<Import moduleName="RemoteForwarder"/>
</Imports>

3.Изменяем настройки ServiceConfiguration.Cloud.cscfg.

<Role name=Deployment>
<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.Enabled" value="" />
<Setting name="Microsoft.WindowsAzure.Plugins.RemoteForwarder.Enabled" value="" />
</ConfigurationSettings>
</Role>

4. Добавляем информацию о сертификате

<Certificates>
<Certificate name="Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption" thumbprint="9427befa18ec6865a9ebdc79d4c38de50e6316ff" thumbprintAlgorithm="sha1" />
</Certificates>

5. Создаем пакет и загружаем данный пакет и сертификат в Вашу Windows Azure подписку.

6. Успешно подсоединяемся к роли.

Как же это работает внутри?

За RDP функциональность отвечают два компонента: RemoteAccess и RemoteForwarder. В конфигурационный файл сервиса (ServiceDefinition.csdef) будут импортированы два модуля: RemoteAccess и RemoteForwarder.

clip_image001

Remote Access

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

clip_image003

RemoteAccess отслеживает каждую учетную запись для доступа, для этого есть специальная группа Windows Azure Remote Access Users. Когда изменяется конфигурация или роль заново поднимается, RemoteAccess выполняет поиск учетной записи в группе, указанной в параметре AccountUsername.Если пользователь найден, то обновляется пароль и дата доступа (expiration date) для него. Таким образом, RemoteAccess гарантирует, что на машине присутствует только один активный пользователь в единицу времени.

clip_image004

RemoteForwarder

RemoteForwarder импортируется только на одну роль и “разбирается с тем”, что Windows Azure во вне предоставляет только одну точку входу (input endpoint), за которой по факту могут скрываться несколько экземпляров. При этом RemoteForwarder на каждом экземпляре роли прослушивает 3389 порт (RDP).

clip_image012

Когда Windows Azure получает запрос на соединение, то выполняется поиск в первом полученном пакете специального куки. Этот куки можно увидеть, если открыть файл *.rdp в текстовом редакторе.

clip_image005

Далее по данным этого куки RemoteForwarder открывает внутреннее соединение с запрашиваемым экземпляром и направляет весь трафик на этот экземпляр.