Как зашифровать трафик c между балансировщиком нагрузки и веб-серверами с помощью elasti c beanstalk - PullRequest
1 голос
/ 25 марта 2020

Я хочу зашифровать трафик c между моим балансировщиком нагрузки и веб-серверами в среде Elasti c Beanstalk. У Amazon здесь есть руководство: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-endtoend.html, но оно предполагает ручное создание сертификата для ваших серверов. Есть ли полностью автоматическая c альтернатива?

1 Ответ

3 голосов
/ 25 марта 2020

Если ваши серверы генерируют свои собственные самозаверяющие сертификаты как часть команд контейнера развертывания, то каждый сервер будет получать обновленный сертификат при каждом развертывании и при запуске нового сервера.

Лучшая команда, которую я нашел для этого - следующая: она создает сертификаты, действительные в течение 10 лет:

sudo openssl req -x509 -newkey rsa:4096 -keyout /etc/pki/tls/certs/server.key -out /etc/pki/tls/certs/server.crt -days 3650 -nodes -subj "/CN=example.com"

Используя этот подход, при условии, что вы развертываете (включая обновление версии вашего контейнера EB), по крайней мере, раз в десять лет ваши серверы будут работать.

Это также значительно упрощает настройку. Теперь все, что вам нужно сделать, это:

  1. Добавить файл конфигурации в ваш проект beasstalk elasti c, который генерирует самозаверяющие сертификаты и добавляет настройки HTTPS на веб-сервер.
  2. Пусть группа безопасности веб-сервера принимает подключения порта 443 от группы безопасности балансировщика нагрузки.
  3. Настройте балансировщик нагрузки для переадресации трафика c с порта 443 на порт 443.

Ниже приведен пример полного конфигурационного файла HTTPS elasti c beanstalk для python. Это небольшое изменение предложенного AWS файла конфигурации для python. Я добавил команду генерировать сертификат в начало контейнерных команд и удалил два оператора файла для /etc/pki/tls/certs/server.crt и /etc/pki/tls/certs/server.key, так как они теперь генерируются автоматически. AWS примеры для других языков можно найти здесь .

Python файл конфигурации:

packages:
  yum:
    mod24_ssl : []

files:
  /etc/httpd/conf.d/ssl.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      LoadModule wsgi_module modules/mod_wsgi.so
      WSGIPythonHome /opt/python/run/baselinenv
      WSGISocketPrefix run/wsgi
      WSGIRestrictEmbedded On
      Listen 443
      <VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile "/etc/pki/tls/certs/server.crt"
        SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"

        Alias /static/ /opt/python/current/app/static/
        <Directory /opt/python/current/app/static>
        Order allow,deny
        Allow from all
        </Directory>

        WSGIScriptAlias / /opt/python/current/app/application.py

        <Directory /opt/python/current/app>
        Require all granted
        </Directory>

        WSGIDaemonProcess wsgi-ssl processes=1 threads=15 display-name=%{GROUP} \
          python-path=/opt/python/current/app \
          python-home=/opt/python/run/venv \
          home=/opt/python/current/app \
          user=wsgi \
          group=wsgi
        WSGIProcessGroup wsgi-ssl

      </VirtualHost>

container_commands:
  01createcerts:
    command: |
      sudo openssl req -x509 -newkey rsa:4096 -keyout /etc/pki/tls/certs/server.key -out /etc/pki/tls/certs/server.crt -days 3650 -nodes -subj "/CN=example.com"
  02killhttpd:
    command: "killall httpd"
  0waitforhttpddeath:
    command: "sleep 3"
...