Эта статья о том, как настроить зашифрованное (SSL) RDP-подключение к виртуалкам на VirtualBox. В качестве гостевой системы используется Linux (Debian/Ubuntu). Базовая документация, на основе которой написана статья: https://www.virtualbox.org/manual/ch07.html.
У VirtualBox есть возможность подключаться к экрану запущенной виртуалки через RDP. Однако в GUI все необходимые для этого настройки отсутствуют и нужно использовать утилиту VBoxManage в командной строке.
Чего мы хотим добиться: защищённое TLS-соединение до виртуальной машины с аутентификацией по логину и паролю. Все настройки делаем целиком из командной строки.
Включение режима простой аутентификации¶
По умолчанию в VirtualBox работает только аутентификация через системного пользователя, однако можно включить модуль VBoxAuthSimple, чтобы можно было использовать произвольные пары логин/пароль, задаваемые для каждой виртуалки. Модуль включается такой командой (её нужно запускать из-под того пользователя, под которым работает VirtualBox, не из-под root!):
$ VBoxManage setproperty vrdeauthlibrary "VBoxAuthSimple"
Создание сертификатов¶
Для работы TLS необходимы сертификат CA, приватный ключ сервера и сертификат сервера, подписанный CA. Я не буду подробно объяснять, как и что делать, вместо этого вы можете скачать готовый скрипт и при необходимости отредактировать его. Ниже команда, которая скрипт скачивает и запускает.
$ wget 'https://github.com/sigsergv/blog-data/raw/master/virtualbox-secure-connection/generate-certificates.sh' -O - | bash
После отработки скрипта вы получите три файла:
$HOME/.config/VirtualBox/vrde-ca-cert.pem
— сертификат CA$HOME/.config/VirtualBox/vrde-server-key.pem
— приватный ключ сервера$HOME/.config/VirtualBox/vrde-server-cert.pem
— сертификат сервера, подписанный CA
Вы можете также эти сертификаты получить каким-нибудь иным способом, но лежать они должны обязательно по указанным путям, они дальше будут использоваться в конфигурации виртуалки.
Настройка виртуальной машины¶
Этот раздел нужно выполнить для каждой виртуальной машины, к экрану которой вы хотите включить внешний доступ. Виртуалку лучше всего выключить, иначе некоторые команды могут не выполниться. Все команды запускаются на хосте, а не госте.
Список всех виртуалок можно получить командой VBoxManage list vms
:
$ VBoxManage list vms "debian-stable-1" {365229eb-a86b-4b10-90f0-e68ff5c8f322}
Первый элемент — это имя виртуалки, мы его будем использовать в командах.
Определимся с настройками для виртуалки:
- RDP-сервер на порту 40301
- Аутентификация по отдельно заданным логину и паролю
- Шифрование канала TLS
Включаем режим аутентификации:
$ VBoxManage modifyvm "debian-stable-1" --vrdeauthtype external
Вычисляем хешированный пароль:
$ VBoxManage internalcommands passwordhash "SECRET_PASSWORD" Password hash: 6c6548ee9814fcfe3f91a0ef52d0bb7378fd28415ae59d517485db341f2ecaaf
Дальше указываем этот хеш для юзера (в моём случае это sigsergv
):
$ VBoxManage setextradata "debian-stable-1" "VBoxAuthSimple/users/sigsergv" 6c6548ee9814fcfe3f91a0ef52d0bb7378fd28415ae59d517485db341f2ecaaf
Включаем шифрование, указываем TLS сертификаты и ключи:
$ VBoxManage modifyvm "debian-stable-1" --vrdeproperty "Security/Method=tls" $ VBoxManage modifyvm "debian-stable-1" --vrdeproperty "Security/CACertificate=${HOME}/.config/VirtualBox/vrde-ca-cert.pem" $ VBoxManage modifyvm "debian-stable-1" --vrdeproperty "Security/ServerCertificate=${HOME}/.config/VirtualBox/vrde-server-cert.pem" $ VBoxManage modifyvm "debian-stable-1" --vrdeproperty "Security/ServerPrivateKey=${HOME}/.config/VirtualBox/vrde-server-key.pem"
Включаем RDP-сервер и выставляем нужный порт (40301 в моём случае):
$ VBoxManage modifyvm "debian-stable-1" --vrde on --vrdeport 40301 "debian-stable-1" {365229eb-a86b-4b10-90f0-e68ff5c8f322}
И стартуем виртуалку в «безголовом» (“headless”) режиме:
$ VBoxManage startvm "debian-stable-1" --type headless Waiting for VM "debian-stable-1" to power on... VM "debian-stable-1" has been successfully started.
Я все (почти все) эти команды оформил в виде скрипта vbox-enable-secure-rdp.sh
, вы его можете скачать так:
$ wget 'https://github.com/sigsergv/blog-data/raw/master/virtualbox-secure-connection/vbox-enable-secure-rdp.sh' \ -O vbox-enable-secure-rdp.sh && chmod +x vbox-enable-secure-rdp.sh
И все (кроме генерации хеша и сертификатов) предыдущие команды заменяются одним вызовом:
$ ./vbox-enable-secure-rdp.sh "debian-stable-1" sigsergv 6c6548ee9814fcfe3f91a0ef52d0bb7378fd28415ae59d517485db341f2ecaaf 40301