5.7.2. Использование протокола HTTPS для доступа к VDI

Для работы консоли по протоколу HTTPS необходим сертификат. Получение сертификата будет рассмотрено на примере Let’s Encrypt. Let’s Encrypt – бесплатный, автоматизированный и открытый центр сертификации, разработанный исследовательской группой Internet Security Research Group. В этой статье использовано условное доменное имя – rtk-dc.tionixlabs.ru (конфигурация сервера web-VDI).

Перед установкой и настройкой убедитесь, что выполнены следующие, предварительные, условия:

  • указано имя домена, указывающее на ваш IP-адрес общего сервера.
  • открыты порты 80 и 443 (в локальном брандмауэре).

Если в системе уже имеются сертификаты, то процедуры установки ПО, настройки конфигурации Let’s Encrypt и выписывания (генерации) сертификата могут быть пропушены. В этом случае для настройки доступа по SSL могут быть использованы существующие файлы сертификатов (.crt/.key).

5.7.2.1. Установка ПО

Установите на контроллер (УУ) файлы репозитория CentOS:

yum install epel-release

Установите пакеты, необходимые для SSL-шифрования трафика веб-сервера:

yum install mod_ssl openssl
yum install certbot python2-certbot-apache

5.7.2.2. Настройка конфигурации Let’s Encrypt

Чтобы упростить процесс обновления сертификата (Let’s Encrypt), создайте конфигурационный файл:

touch /etc/letsencrypt/cli.ini

Откройте для редактирования и заполните конфигурационный файл (cli.ini) следующим содержанием:

email = support@tionix.ru
agree-tos = true
no-eff-email = true
keep = true
authenticator = webroot
webroot-path = /var/lib/letsencrypt

Отредактируйте файл конфигурации /etc/httpd/conf.d/acme-challenge.conf так, чтобы он содержал следующие строки:

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/.well-known/acme-challenge">
  AllowOverride None
  Require all granted
</Directory>

5.7.2.3. Выписывание сертификата

Внимание.

Изложенная ниже процедура генерации сертификата – необязательна, т.к. может быть использован существующий (самоподписанный) сертификат.

Запустите Certbot, выполнив команду:

certbot certonly -d rtk-dc.tionixlabs.ru

При помощи ключа -d задается доменное имя, для которого будет сгенерирован сертификат. Данная опция может быть использована несколько раз.

После выполнения команды выше, в папке /etc/letsencrypt/live/rtk-dc.tionixlabs.ru/ должны появиться следующие файлы:

  • cert.pem — сертификат (вашего) домена;
  • chain.pem — сертификат цепи Let’s Encrypt;
  • tionix.pem — сочетание содержимого cert.pem и chain.pem;
  • privkey.pem — закрытый ключ (вашего) сертификата.

Смените права доступа к файлам конфигурации Let’s Encrypt:

chmod 0644 -R /etc/letsencrypt/
chmod 0755 /etc/letsencrypt/live/ /etc/letsencrypt/archive/

5.7.2.4. Настройка конфигурации Dashboard

Добавьте в файл конфигурации веб-сервера, определяющего использование SSL/etc/httpd/conf.d/ssl.conf – следующие строки:

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-$
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

Отредактируйте конфигурацию виртуального хоста домена, обслуживающего графический интерфейс управления – Dashboard.

Откройте файл openstack-dashboard.conf для редактирования, с помощью редактора nano или другого доступного текстового редактора:

nano /etc/httpd/conf.d/openstack-dashboard.conf

Файл представлен в формате, совместимом с веб-сервером (Apache2). Он должен содержать следующие строки:

listen 443 https

<Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi>
  Options All
  AllowOverride All
  Require all granted
</Directory>

<Directory /usr/share/openstack-dashboard/static>
  Options All
  AllowOverride All
  Require all granted
</Directory>

<VirtualHost *:80>
  RewriteEngine on
  RewriteRule "^/$" "https://<IP_облака>/dashboard/" [R=301,L]
  RewriteRule "^/dashboard/(.*)" "https://<IP_облака>/dashboard/$1" [R=301,L]
</VirtualHost>

<VirtualHost *:443>
  RewriteEngine on
  RewriteRule "^/$" "https://<IP_облака>/dashboard/" [R=301,L]
  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3
  SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
  SSLCertificateFile /etc/pki/tls/certs/localhost.crt
  SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  Header always set Strict-Transport-Security "max-age=15768000"
  WSGIProcessGroup dashboard
  WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
  WSGIDaemonProcess dashboard processes=3 threads=10
  Alias /dashboard/static /usr/share/openstack-dashboard/static
</VirtualHost>

В качестве <IP_облака> необходимо прописать доменное имя, заведенное в DNS, либо IP-адрес контроллера (УУ).

5.7.2.5. Конфигурация TIONIX Web-VDI

Для удаленного (веб-) доступа к консоли виртуальной машины используется сетевой порт 8888 (Раздел 5.7). Функциональность обеспечивается модулем TIONIX.VDIserver.

Настройку конфигурации можно выполнить двумя способами – настроить веб-сервер Apache2 (обычно для одного контроллера), либо подать сертификат в HAproxy (для кластерных конфигураций).

Отредактируйте конфигурацию (виртуального хоста) для VDI, открыв для редактирования файл конфигурации сервера VDI:

nano /etc/httpd/conf.d/tionix-vdi-server.conf

Файл конфигурации сервера VDI должен иметь следующее содержимое:

Listen 8888

<VirtualHost *:8888>
    WSGIDaemonProcess tionix_vdi_server_web user=tionix group=tionix processes=3 threads=10
    WSGIScriptAlias /vdi /usr/lib/python2.7/site-packages/tionix_vdi_server/wsgi.py
    WSGIProcessGroup tionix_vdi_server_web

    WSGIPassAuthorization On

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/rtk-dc.tionixlabs.ru/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/rtk-dc.tionixlabs.ru/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/rtk-dc.tionixlabs.ru/privkey.pem

    ErrorLog /var/log/httpd/tionix-vdi-server.log
    CustomLog /var/log/httpd/tionix-vdi-server-access.log combined
    RewriteRule "^/$" "https://rtk-dc.tionixlabs.ru/vdi/" [R=301,L]
    <Directory /usr/lib/python2.7/site-packages/tionix_vdi_server>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    Alias /vdi/static /usr/lib/python2.7/site-packages/tionix_vdi_server/static/tionix_vdi_server
    <Directory /usr/lib/python2.7/site-packages/tionix_vdi_server/static/tionix_vdi_server>
        Require all granted
    </Directory>
</VirtualHost>

Ключевыми параметрами, определяющими включение SSL-шифрования с помощью сертификатов, являются:

SSLCertificateFile /etc/letsencrypt/live/<доменное_имя>/cert.pem

SSLCertificateChainFile /etc/letsencrypt/live/<доменное_имя>/chain.pem

SSLCertificateKeyFile /etc/letsencrypt/live/<доменное_имя>/privkey.pem

Данные файлы определены на этапе выписывания сертификата (см. выше).

5.7.2.6. Настройка Web-VDI в Haproxy

Данный метод настройки используется в случае использования отказоустойчивого кластера (три контроллера/УУ), либо в случае использования haproxy на одном УУ.

Подготовьте pem-файл (/etc/ssl/certs/itsk.pem), выполнив команду:

cat mydomain.key mydomain.crt >> tionix.pem

Примечание.

Названия файлов mydomain.* следует указывать в соответствии с выбранным именем домена (в данном случае будет использоваться домен tionix).

Содержание файла настройки /etc/haproxy/haproxy.cfg:

#. Tionix VDI Web
frontend tionix-vdi-web-https
 bind 10.16.31.250:8888 ssl crt /etc/ssl/certs/tionix.pem
 http-request redirect scheme https unless { ssl_fc }
 default_backend tionix-vdi-web-server

backend tionix-vdi-web-server
 server control1 10.16.31.7:8888 check inter 2000 rise 2 fall 3 weight 100
 server control3 10.16.31.9:8888 check inter 2000 rise 2 fall 3 weight 100
 server control2 10.16.31.8:8888 check inter 2000 rise 2 fall 3 weight 100

После настройки перезапустите сервис haproxy, выполнив (на контроллере) одну из команд:

# systemctl restart haproxy

# systemctl reload haproxy

5.7.2.7. Настройка VDI Broker (HTTPS)

Существует два метода настройки:

  • Gunicorn (при использовании одного контроллера);
  • HAproxy (VDI в кластерной конфигурации).

Gunicorn переводит запросы, полученные от веб-сервера, в формат, который может обрабатывать веб-приложение, и обеспечивает выполнение кода (при необходимости).

5.7.2.8. Настройка Gunicorn

Для настройки HTTPS в gunicorn, серверу нужно передать дополнительные параметры при старте:

cat /etc/systemd/system/tionix-vdi-broker-api.service.d/override.conf

Содержимое настройки среды передается с помощью параметра Environment, настраиваемого в секции Service (переменная среды GUNICORN_CMD_ARGS)

[Service]
Environment="GUNICORN_CMD_ARGS=--keyfile /etc/tionix/privkey.pem --certfile /etc/tionix/fullchain.pem --ssl-version 5 --ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"

Значение для параметра --ssl-version определяется константами модуля Python ssl.PROTOCOL_ (в данном примере – ssl.PROTOCOL_TLSv1_2).

Для версий gunicorn 20.0 и выше можно указывать строковое значение без префикса, например: –ssl-version TLSv1_2.

Обновленное значение для параметра –ciphers всегда можно получить из Mozilla SSL Configuration Generator, выбрав HAProxy и указав используемую версию OpenSSL.

Значение будет находиться в параметре ssl-default-bind-ciphers. Альтернативно, параметры можно указать в отдельном файле настройки конфигурации (Python-скрипте):

import ssl
keyfile = "/etc/tionix/privkey.pem"
certfile = "/etc/tionix/fullchain.pem"
ssl_version = ssl.PROTOCOL_TLSv1_2
ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"

Для запуска указанный выше скрипт, подгружается с помощью особого указания (ключа –config):

gunicorn --config /path/to/config

5.7.2.9. Настройка VDI HAproxy

Данный метод настройки используется только в случае использования отказоустойчивого кластера (три контроллера/УУ), либо в случае использования на одном УУ.

При настройке HAproxy используются сертификаты в формате PEM. Создайте и разместите на контроллерах pem-файл – /etc/ssl/certs/tionix.pem.

Создание файла следует выполнить команой в следующем формате:

cat mydomain.key mydomain.crt >> tionix.pem

Примечание.

Названия файлов mydomain.* следует указывать в соответствии с выбранным именем домена. В данном случае в качестве целевого будет использоваться pem-файл, соответствующий домену tionix.

После того как pem-файл(ы) подготовлен(ы) и размещен(ы), настройте конфигурацию HAproxy. Ниже приведено содержание файла настройки – /etc/haproxy/haproxy.cfg, располагаемого на контроллерах (УУ):

#frontend tionix-vdi-http
#     bind 10.16.31.250:8888
#       redirect scheme https code 301

frontend tionix-vdi-9365
     bind 10.16.31.250:9365 ssl crt /etc/ssl/certs/tionix.pem
     http-request redirect scheme https unless { ssl_fc }
     default_backend tionix-vdi-9365-backend

backend tionix-vdi-9365-backend
    balance source
    server control1 10.16.31.7:9365 check inter 2000 rise 2 fall 3 weight 100
    server control2 10.16.31.8:9365 check inter 2000 rise 2 fall 3 weight 50
    server control3 10.16.31.9:9365 check inter 2000 rise 2 fall 3 weight 80

После настройки перезапустите службу haproxy (на контроллере), выполнив одну из команд:

#  «Жесткий» рестарт
# systemctl restart haproxy

#  «Мягкое» изменение конфигурации
# systemctl reload haproxy

Примечание.

Символ решетки означает выполнение команды правами root.

5.7.2.10. Настройка HTTPS для консоли виртуальных машин

На управляющем узле отредактируйте файл конфигурации Nova (Compute Service) – /etc/nova/nova.conf.

В секции [DEFAULT] пропишите необходимые параметры:

ssl_only=true
cert=/etc/nova/ssl/controller.crt
key=/etc/nova/ssl/controller.key

После сохранения изменений в файле nova.conf необходимо перезапустить службу OpenStack ( Nova NoVNCproxy ) и системную службу httpd (веб-сервер Apache2):

systemctl restart openstack-nova-novncproxy
systemctl restart httpd

На вычислительных узлах (ВУ, Compute*) отредактируйте конфигурационные файл(ы) /etc/nova/nova.conf.

В секции [VNC] пропишите необходимый параметр удаленного (веб-) доступа – базовый адрес NoVNCproxy в формате URL:

5.7.2.11. Изменение сетевой конфигурации (DNS)

Для корректной работы службы доменных имен – DNS – доменное имя (rtk-dc.tionixlabs.ru) должно быть корректным (доступным, разрешенным – «резолвиться»). Для этого на местном сервере, содержащем службу DNS, следует добавить „А“ запись вида:

внутренний IP контроллера и имя прописанное в сертификате

Альтернативно, можно добавить запись в файл статической IP-адресации ( /etc/hosts ), для временного пользования:

<IP-адрес> rtk-dc.tionixlabs.ru controller

где

<IP-адрес> – IP-адрес тестируемого контроллера (УУ);

controller – алиас, указываемый вместо полного доменного имени.