Настройки после распределенной установки фермы Termidesk

Создание самоподписанного SSL-сертификата

Для создания самоподписанного SSL-сертификата и ключа к нему нужно:

  • получить доступ к интерфейсу командной строки;

  • выполнить генерацию SSL-сертификата (/etc/ssl/certs/nginx-selfsigned.crt) и ключа к нему (/etc/ssl/private/nginx-selfsigned.key):

sudo openssl req -new -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

Используемые ключи команды:

  • openssl - базовый инструмент командной строки для создания и управления сертификатами, ключами и другими файлами OpenSSL;

  • req - эта опция указывает, что на данном этапе нужно использовать запрос на подпись сертификата X.509 (CSR). X.509 – это стандарт инфраструктуры открытого ключа, которого придерживаются SSL и TLS при управлении ключами и сертификатами. Данная команда позволяет создать новый сертификат X.509;

  • new - эта опция указывает, что будет создаваться новый запрос;

  • x509 - эта опция вносит поправку в предыдущую команду, сообщая утилите о том, что вместо запроса на подписание сертификата необходимо создать самоподписанный сертификат;

  • nodes - ключ для пропуска опции защиты сертификата парольной фразой. Нужно, чтобы при запуске балансировщик нагрузки (nginx) имел возможность читать файл без вмешательства пользователя. Установив пароль, придется вводить его после каждой перезагрузки;

  • days 365 - эта опция устанавливает срок действия сертификата (в данном случае сертификат действителен в течение года);

  • newkey rsa:2048 - эта опция позволяет одновременно создать новый сертификат и новый ключ. Поскольку ключ, необходимый для подписания сертификата, не был создан ранее, нужно создать его вместе с сертификатом. Данная опция создаст RSA-ключ размером 2048 бит;

  • keyout - эта опция сообщает OpenSSL, куда поместить сгенерированный файл ключа;

  • out - эта опция сообщает OpenSSL, куда поместить созданный сертификат.

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

  • Country Name (2 letter code) [AU];

  • State or Province Name (full name) [Some-State];

  • Locality Name (eg, city) [];

  • Organization Name (eg, company) [Internet Widgits Pty Ltd];

  • Organizational Unit Name (eg, section) [];

  • Common Name (e.g. server FQDN or YOUR name) [];

  • Email Address [].

Наиболее важным параметром является Common Name (необходимо ввести FQDN балансировщика). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, нужно внести в эту строку IP-адрес сервера.

Файлы ключа и сертификата будут размещены в каталоге, указанном при вызове команды openssl в параметрах keyout и out.

При использовании OpenSSL необходимо также создать ключи Диффи-Хеллмана, для этого:

  • открыть программу «Terminal Fly» и получить доступ к интерфейсу командной строки;

  • сгенерировать ключи Диффи-Хеллмана длиной 4096 бит и сохранить их в файл /etc/nginx/dhparam.pem:

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Настройка nginx для поддержки SSL

Для настройки nginx нужно:

  • создать новый пустой сниппет nginx в каталоге /etc/nginx/snippets для указания размещения сертификата и ключа:

sudo touch /etc/nginx/snippets/self-signed.conf
  • отредактировать созданный файл, приведя его к виду:

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
  • создать еще один пустой сниппет, предназначенный для настроек SSL (это позволит серверу nginx использовать надежный механизм преобразования и включит некоторые дополнительные функции безопасности):

sudo touch /etc/nginx/snippets/ssl-params.conf
  • отредактировать созданный файл ssl-params.conf, приведя его к виду:

Следует настраивать TLS версии 1.2 и 1.3, т.к. некоторое компоненты могут использовать эти протоколы для связи.
ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 77.88.8.8 77.88.8.1 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

Поскольку сертификат является самоподписанным, SSL stapling не будет использоваться. Сервер nginx выдаст предупреждение, отключит stapling для данного сертификата и продолжит работу.

Конфигурирование веб-сервера

Для конфигурирования веб-сервера нужно:

  • создать пустой конфигурационный файл:

sudo touch /etc/nginx/sites-available/sampledomain.ru.conf
  • отредактировать созданный файл, приведя его к виду:

Здесь и далее примеры IP-адресов приведены в соответствии с RFC 5737. Указанные IP-адреса должны быть заменены на актуальные, используемые согласно схеме адресации, принятой в инфраструктуре организации.

Для корректного отображения IP-адресов источника подключения следует в «Портале администратора» задать параметру «Использовать анонсируемый IP клиента» значение «Да» («Системные параметры - Системные настройки - Безопасность»).

upstream daas-upstream-ws {
 least_conn;
    # PROXY TERMIDESK

     server 192.0.2.41:5099;
     server 192.0.2.42:5099;
     server 192.0.2.43:5099;
     server 192.0.2.44:5099;

}

upstream daas-upstream-nodes {
 least_conn;
     # DISPATCHER TERMIDESK

     server 192.0.2.30:443;
     server 192.0.2.31:443;
     server 192.0.2.32:443;

 }

server {
 listen 0.0.0.0:80;
 listen 0.0.0.0:443 ssl;

  include snippets/self-signed.conf;
  include snippets/ssl-params.conf;

 location /websockify {
         # limit_req zone=fast nodelay;
        proxy_http_version 1.1;
        proxy_pass http://daas-upstream-ws/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Connection timeout
        proxy_connect_timeout 1000;
        proxy_send_timeout 1000;
        proxy_read_timeout 1000;
        send_timeout 1000;

        # Disable cache
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }

 location / {
        proxy_pass https://daas-upstream-nodes/;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 }

}
IP-адреса, перечисленные в директиве daas-upstream-ws, являются адресами «Шлюзов» Termidesk, а IP-адреса, перечисленные в директиве daas-upstream-nodes, являются адресами «Универсальных диспетчеров» Termidesk.
  • создать символическую ссылку на данный виртуальный хост из директории /etc/nginx/sites-available в директорию /etc/nginx/sites-enabled, чтобы nginx его обслуживал:

sudo ln -s /etc/nginx/sites-available/sampledomain.ru.conf /etc/nginx/sites-enabled/
  • проверить корректность настроек:

sudo nginx -t
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Веб-сервер возвращает предупреждение в случае использования самоподписанного сертификата, однако это не влияет на работу.
  • если в синтаксисе обнаружены ошибки, необходимо исправить их, затем перезапустить веб-сервер:

sudo systemctl restart nginx