В статье "Защищаем протокол RDP" я рассказал о том, как использовать протокол защиты на уровне гнезд Secure Sockets Layer (SSL) для соединения с сервером по фирменному протоколу Remote Desktop Protocol (RDP), разработанному специалистами Microsoft для службы Windows Terminal Services. Такая конфигурация обеспечивает безопасность, но SSL не дает гарантий того, что получать соединение с сервером по протоколу RDP смогут только доверенные клиенты. В настоящей статье я разъясню, как обеспечивается еще более надежное соединение посредством подтверждения идентичности как клиента, так и сервера. Такое соединение осуществляется с помощью пары "секретный ключ - открытый ключ" через шлюз Secure Shell (SSH).

В тестовой системе SSH, о которой я буду рассказывать подробно, шлюз SSH расположен на сервере RDP. В роли сервера RDP выступает дистанционно администрируемый контроллер домена (domain controller, DC) Windows Server 2003. Если расположить шлюз SSH и сервер RDP на одной и той же системе, пользователи, прошедшие процедуру аутентификации Windows, будут иметь потенциальную возможность получения доступа к другим службам. Если же вы хотите, чтобы такой доступ предоставлялся только для порта RDP 3389, необходимо разместить шлюз SSH на отдельной системе и позаботиться о том, чтобы доступ с шлюза на сервер RDP, а также в противоположном направлении, осуществлялся через брандмауэр.

Здесь важно отметить, что по умолчанию система Windows 2003 не обеспечивает совместимости с оболочкой SSH. Чтобы получить возможность в дальнейшем действовать в соответствии с моими указаниями, вам придется установить размещенные по адресу http://www.openssh.com средства подключения OpenSSH for Windows. Для туннелирования соединения RDP на сервер, где размещается SSH, потребуется специально спроектированный клиент RDP под названием WiSSH (http://www.wissh.com). WiSSH не предоставляется бесплатно, но можно загрузить тестовую версию программы для проведения испытаний, по адресу http://www.wissh.com/Trial (имейте в виду, что указатель URL чувствителен к регистру символов). Обязательно загрузите клиент WiSSH, прежде чем выполнять указания в моем примере. Итак, за дело.

Установка шлюза SSH

После загрузки клиента WiSSH необходимо настроить шлюз SSH. Загрузите последнюю версию инструментального средства OpenSSH for Windows и запустите установочную программу на сервере RDP. Примите настройки, предлагаемые по умолчанию. Пока можете игнорировать предупреждение, отображаемое в конце процедуры настройки, - редактированием файла passwd мы займемся в ближайшее время.

Если вы используете систему Windows 2003 Service Pack 1 (SP1), убедитесь, что в качестве уровня безопасности для RDP задан RDP Security Layer, поскольку шлюз SSH обеспечивает шифрование "от конца к концу" и аутентификацию "клиент-сервер". Для настройки уровня безопасности из папки administration tools на сервере RDP откройте окно Terminal Services Configuration.

Правой клавишей мыши щелкните на элементе RDP-Tcp, он расположен в правой части окна, под надписью Connections; далее щелкните на элементе Properties.

Рис. 1. Назначьте уровень безопасности RDP

В качестве значения уровня безопасности выберите RDP Security Layer, как показано на Рис. 1. Теперь нажмите Close. Затем создайте учетную запись пользователя домена, которую сможете использовать для подключения к серверу по протоколу RDP с помощью встроенного клиента Remote Desktop Connection. В оснастке Active Directory Users and Computers консоли Microsoft Management Console (MMC) нужно создать пользователя домена с именем sshuser. Теперь создадим файл паролей для сервера OpenSSH и введем в этот файл пользователя sshuser.

Чтобы создать файл паролей для сервера OpenSSH, откройте окно командной строки и замените рабочий каталог на следующий:

c:program filesopensshin

Если у вас нет опыта в использовании командной строки, введите следующие команды смены каталога (change directory, cd):

cd
cd program files
cd openssh
cd bin

Чтобы создать пароль, выполните команду:

mkpasswd -d -u sshuser >> .etcpasswd

Теперь в окне оснастки Active Directory Users and Computers консоли MMC нужно удалить учетную запись пользователя домена sshuser. Учетная запись пользователя SSH должна быть абсолютно независимой от учетной записью пользователя Windows, который будет подключаться к серверу RDP.

Далее мы сконфигурируем сервер SSH таким образом, чтобы он отвергал простые Windows-соединения на базе имени пользователя и пароля и принимал соединения только от тех клиентов, которые представляют секретный ключ, соответствующий открытому ключу сервера, и имя пользователя OpenSSH (в нашем случае это sshuser). Чтобы воспользоваться секретным ключом, клиент должен представить пароль на этой стадии, предшествующей аутентификации. По завершении выполняемой шлюзом проверки прав доступа клиента данный клиент может зарегистрироваться на сервере, представив имя пользователя и пароль Windows.

В редакторе Notepad откройте файл sshd_config, расположенный в каталоге c:program filesopensshetc. Обратите внимание на необычное форматирование и ни в коем случае ничего в нем не меняйте. Это необходимо для того, чтобы программа OpenSSH смогла прочесть файл sshd_config. Перед тем как вносить в файл конфигурации какие-либо изменения, снимите с него резервную копию, чтобы в случае необходимости всегда иметь возможность обратиться к неизмененной версии файла.

Теперь убедитесь, что все следующие переменные имеют значения, указанные здесь, и что все символы комментирования сняты (иначе говоря, удалите, где это необходимо, все расположенные в начале строк символы #):

StrictModes no
RSAAuthentication no
AuthorizedKeysFile
/etc/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no

Сохраните этот файл. Затем из окна командной строки запустите сервер OpenSSH, для чего введите текст

net start opensshd

С помощью WiSSH сгенерируйте пару "секретный ключ - открытый ключ"

Теперь, когда программа OpenSSH функционирует, пришло время установить клиент WiSSH и создать пару "секретный ключ - открытый ключ". Установите WiSSH на клиентской системе, которая будет подключаться к серверу RDP через шлюз SSH. Примите настройки, предлагаемые по умолчанию. По завершении установки перейдите в программный каталог WiSSH и откройте окно генератора ключей WiSSH Private Key Generator. На Рис. 2 показаны те детали, которые будут отображаться в окне Private Key Generator.

Рис. 2. Создайте и сохраните секретный и открытый ключи

Введите стойкий пароль (он должен иметь не менее 10 знаков и содержать вперемешку прописные и строчные буквы, цифры и символы, а также отличаться от пароля для учетной записи Windows, которую вы будете использовать для регистрации при соединении по протоколу RDP). Нажмите кнопку Generate Keys. Сохраните секретный ключ и открытый ключ OpenSSH Style в настольной системе (для этого требуется нажать кнопки Save Private Key и Save Public Key). Переместите открытый ключ в каталог c:program filesopensshetc на сервере и назначьте этому файлу новое имя authorized_keys.

Настройте клиента WiSSH на соединение с удаленным настольным сервером через шлюз SSH

Из меню Programs на клиентской системе запустите клиент WiSSH и щелкните на вкладке Gateway, как показано на Рис. 3. В поле SSH Gateway Host введите IP-адрес (или имя DNS, если разрешение функционирует) сервера, на котором вы установили OpenSSH.

Рис. 3. Настройте клиент WiSSH на соединение через шлюз SSH

Если с хост-системой можно установить соединение, фон поля SSH Gateway Host станет зеленым. Установите флажок Use Private/Public Key Authentication и в открывающемся списке найдите секретный ключ, который вы сохранили на настольной системе.

Теперь перейдите на вкладку Login. В поле Gateway Credentials введите имя пользователя sshuser. Введите пароль, который вы создали для использования с секретным ключом. В поле Remote Host введите тот же IP-адрес или имя DNS, которое создали для SSH Gateway Host. В нашем примере удаленная хост-машина и шлюз - это один и тот же сервер.

Нажмите кнопку Connect, и вы сможете соединиться с удаленной настольной системой. Если соединение установлено успешно, вы сможете зарегистрироваться в системе Windows под любой пользовательской учетной записью, имеющей разрешение на регистрацию по протоколу RDP, как показано на Рис. 4.

Рис. 4. Проверьте соединение с удаленной настольной системой

Проверьте надежность защиты

Работа почти закончена, но перед тем как выпускать машину на просторы Internet, полезно удостовериться в том, что шлюз SSH принимает лишь те соединения, в которых используются пары секретных и открытых ключей. Откройте клиент WiSSH, перейдите на вкладку Gateway и снимите флажок Use Private/Public Key Authentication. Теперь попытайтесь установить соединение; вы должны получить сообщение об ошибке. Отметим, что иногда изменение вступает в силу лишь после перезапуска клиента WiSSH. Теперь перейдите на вкладку Login. В поле Gateway Credentials попытайтесь установить соединение с помощью учетных записей пользователей, обычно имеющих разрешение на регистрацию по протоколу RDP. Удостоверьтесь в том, что эти соединения тоже отвергаются. По завершении тестирования не забудьте перенастроить клиент WiSSH так, чтобы он использовал аутентификацию с применением секретных и открытых ключей, и вновь введите на вкладке Login верительные данные шлюза, как делали это ранее.

По завершении настройки шлюза и проведении всей серии испытаний можно через TCP порт 22 устанавливать соединение с Internet и быть уверенным в том, что подключиться к серверу через шлюз SSH смогут лишь те удаленные машины, которые имеют соответствующие секретные ключи.

Решение, о котором я рассказал в этой статье, позволяет безопасно публиковать сервер RDP в Internet. Оно дает возможность системам с любыми IP-адресами, способными подтвердить свою идентичность, подключаться к серверу, не предоставляя им при этом прямого доступа к регистрационному интерфейсу Windows. Это решение можно считать еще одним средством обеспечения безопасности систем Windows.