[ English | 한국어 (대한민국) | English (United Kingdom) | Indonesia | français | русский | Deutsch ]

Защита сервисов при помощи SSL сертификатов

Инструкция по безопасности OpenStack рекомендует использовать защищенное соединение между различными сервисами в окружении OpenStack. Проект OpenStack-Ansible в данный момент предоставляет возможность настройки SSL сертификатов для безопасного взаимодействия между сервисами:

Все публичные точки входа находятся перед haproxy, в связи с чем для большинства окружений единственный сертификат, за которым необходимо следить, это сертификат для haproxy.

Во время развертывания с OpenStack-Ansible вы можете либо использовать самоподписанные сертификаты, которые будут сгенерированы во время процесса развертывания, либо предоставить SSL сертификаты, ключи и промежуточные сертификаты для вашего доверенного центра сертификации. Высокозащищенные окружения используют доверенные сертификаты, предоставленные пользователями, для максимально возможного количества сервисов.

Примечание

Выполните все настройки SSL сертификатов в файле /etc/openstack_deploy/user_variables.yml. Не редактируйте роли или плейбуки самостоятельно для этого.

Самоподписанные сертификаты

Самоподписанные сертификаты предоставляют возможность быстро начать шифровать передаваемые данные. Но они не предоставляют высокого уровня доверия для высокозащищенных окружений. По умолчанию в OpenStack-Ansible используются самоподписанные сертификаты. Когда используются самоподписанные сертификаты, проверка сертификатов автоматически выключается.

Установка данных для самоподписанных сертификатов

Изменить данные любого самоподписанного сертификата можно при помощи переменных. Переменные для каждого сервиса идут в формате <servicename>_ssl_self_signed_subject. Например, что бы изменить данные самоподписанного сертификата для HAProxy, измените файл /etc/openstack_deploy/user_variables.yml следующим образом:

haproxy_ssl_self_signed_subject: "/C=US/ST=Texas/L=San Antonio/O=IT/CN=haproxy.example.com"

Для более подробной информации касаемо доступных полей в данных сертификата, обратитесь к документации OpenSSL по req subcommand.

Генерация и пере-генерация самоподписанных сертификатов

Самоподписанные сертификаты генерируются для каждого сервиса во время первого запуска плейбука.

Что бы сгенерировать самоподписанный сертификат для сервиса, вам необходимо задать переменную <servicename>_ssl_self_signed_regen в true одним из следующих способов:

  • Для принудительного обновления самоподписанного сертификата, вы можете передать переменную openstack-ansible в командной строке:

    # openstack-ansible -e "horizon_ssl_self_signed_regen=true" os-horizon-install.yml
    
  • Для принудительного обновления самоподписанного сертификата при каждом запуске плейбука, установите соответствующую опцию в true. Например, если вы уже запускали плейбук haproxy, но хотите перегенерировать самоподписанный сертификат, установите переменную haproxy_ssl_self_signed_regen в true в файле /etc/openstack_deploy/user_variables.yml:

    haproxy_ssl_self_signed_regen: true
    

Примечание

Перегенерация самоподписанных сертификатов заменяет текущие сертификаты вне зависимости от того были ли они самоподписанными или предоставлены пользователем.

Сертификаты, предоставленные пользователем

Для большего доверия в высоконадежных окружениях, вы можете предоставить собственный SSL сертификат, ключи и промежуточные сертификаты. Получение сертификатов из доверенного центра сертификации находится за пределами данного документа, но раздел Управление Сертификатами Linux Documentation Project объясняет как создать свой собственный центр сертификации и подписывать сертификаты.

Используйте следующий подход для установки собственных SSL сертификатов в OpenStack-Ansible:

  1. Скопируйте ваш SSL сертификат, ключ и промежуточные сертификаты на хост развертывания.

  2. Укажите путь к вашему SSL сертификату, ключу и промежуточным сертификатам в файле /etc/openstack_deploy/user_variables.yml.

  3. Запустите плейбуки для этого сервиса.

Пример HAProxy

Переменные к определению, которые содержат путь к сертификатам на ноде развертывания для настройки HAProxy:

haproxy_user_ssl_cert: /etc/openstack_deploy/ssl/example.com.crt
haproxy_user_ssl_key: /etc/openstack_deploy/ssl/example.com.key
haproxy_user_ssl_ca_cert: /etc/openstack_deploy/ssl/ExampleCA.crt

Пример RabbitMQ

Для установки определенных пользователем сертификатов на RabbitMQ, скопируйте сертификаты на хост развертывания, отредактируйте файл /etc/openstack_deploy/user_variables.yml и задайте следующие переменные:

rabbitmq_user_ssl_cert:    /etc/openstack_deploy/ssl/example.com.crt
rabbitmq_user_ssl_key:     /etc/openstack_deploy/ssl/example.com.key
rabbitmq_user_ssl_ca_cert: /etc/openstack_deploy/ssl/ExampleCA.crt

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

# openstack-ansible rabbitmq-install.yml

Плейбук установит предоставленный вами SSL сертификат, ключ и промежуточные сертификаты на каждый контейнер RabbitMQ.

Процесс идентичен для остальных сервисов. Замените префикс rabbitmq в переменной на horizon, haproxy или keystone, а после запустите плейбук для данного сервиса для разливки предоставленного сертификата на данные сервисы.

LetsEncrypt certificates

The HAProxy ansible role supports using LetsEncrypt to automatically deploy trusted SSL certificates for the public endpoint. Each HAProxy server will individually request a LetsEncrypt certificate.

The http-01 type challenge is used by certbot to deploy certificates so it is required that the public endpoint is accessible directly on the internet.

Deployment of certificates using LetsEncrypt has been validated for openstack-ansible using Ubuntu Bionic. Other distributions should work but are not tested.

To deploy certificates with LetsEncrypt, add the following to /etc/openstack_deploy/user_variables.yml to enable the letsencrypt function in the haproxy ansible role, and to create a new backend service called letsencrypt to service http-01 challenge requests.

haproxy_ssl: true
haproxy_ssl_letsencrypt_enable: True
haproxy_ssl_letsencrypt_install_method: "distro"
haproxy_ssl_letsencrypt_setup_extra_params: "--http-01-address {{ ansible_host }} --http-01-port 8888"
haproxy_ssl_letsencrypt_email: "email.address@example.com"

haproxy_extra_services:
  # an internal only service for acme-challenge whose backend is certbot running on any haproxy instance
  - service:
      haproxy_service_name: letsencrypt
      haproxy_backend_nodes: "{{ groups['haproxy_all'] }}"
      backend_rise: 1                       #rise quickly to detect certbot running without delay
      backend_fall: 2
      haproxy_bind:
        - 127.0.0.1                         #bind to the localhost as the host internal IP will be used by certbot
      haproxy_port: 8888
      haproxy_balance_type: http

Copy the whole variable haproxy_default_services from /opt/openstack-ansible/inventory/group_vars/haproxy/haproxy.yml to /etc/openstack_deploy/group_vars/haproxy/haproxy_all.yml and update the section for horizon to include the ACL redirects http-01 challenges to the HAProxy letsencrypt backend as follows:

- service:
    haproxy_service_name: horizon
    haproxy_backend_nodes: "{{ groups['horizon_all'] | default([]) }}"
    haproxy_ssl: "{{ haproxy_ssl }}"
    haproxy_ssl_all_vips: true
    haproxy_port: "{{ haproxy_ssl | ternary(443,80) }}"
    haproxy_backend_port: 80
    haproxy_redirect_http_port: 80
    haproxy_balance_type: http
    haproxy_balance_alg: source
    haproxy_backend_options:
      - "httpchk HEAD / HTTP/1.0\\r\\nUser-agent:\\ osa-haproxy-healthcheck"
    haproxy_service_enabled: "{{ groups['horizon_all'] is defined and groups['horizon_all'] | length > 0 }}"
    haproxy_redirect_scheme: "https if !{ ssl_fc } !{ path_beg /.well-known/acme-challenge/ }"   #redirect all non-ssl traffic to ssl except acme-challenge
    haproxy_frontend_acls:                                 #use a frontend ACL specify the backend to use for acme-challenge
      letsencrypt-acl:
          rule: "path_beg /.well-known/acme-challenge/"
          backend_name: letsencrypt