Expertus metuit
Безопасное подключение к экрану виртуалки в VirtualBox
2018-03-27 10:56

Эта статья о том, как настроить безопасное подключение к виртуалкам на VirtualBox. В качестве гостевой системы используется Linux (Debian/Ubuntu). Базовая документация, на основе которой написана статья: https://www.virtualbox.org/manual/ch07.html.

У VirtualBox есть возможность подключаться к экрану запущенной виртуалки через RDP. Однако в GUI все необходимые для этого настройки не выведены и нужно использовать утилиту VBoxManage.

Чего мы хотим добиться: защищённое TLS-соединение до виртуальной машины с аутентификацией по логину и паролю. Все настройки делаем целиком из командной строки.

Создание сертификатов

Для работы 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

Комментарии

Текст комментария (разметка: *курсив*, **полужирная**, [ссылка](http://example.com) или <http://example.com> ещё)
Имя (обязательно, 50 символов или меньше)
Опциональный email, на который получать ответы (не будет опубликован)
Веб-сайт
© 2006—2018 Sergey Stolyarov | Работает на Pyrone