Как зашифровать соединения Tomcat 8 с Apache или Nginx на CentOS 7

Вступление

Apache Tomcat - это контейнер веб-сервера и сервлета, предназначенный для обслуживания приложений Java. Tomcat, который часто используется в корпоративных развертываниях и для небольших приложений, является гибким и мощным.

В этом руководстве мы обсудим, как обезопасить установку CentOS 7 Tomcat с помощью SSL. По умолчанию после установки все соединения между сервером Tomcat и клиентами не шифруются, включая любые введенные пароли или любые конфиденциальные данные. Есть несколько способов включить SSL в нашу установку Tomcat. В этом руководстве будет рассказано, как настроить прокси-сервер с поддержкой SSL для безопасного согласования с клиентами, а затем передать запросы Tomcat.

Мы расскажем, как настроить это как дляApache, так и дляNginx.

Почему обратный прокси?

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

Протокол SSL с Tomcat имеет ряд недостатков, которые затрудняют управление:

  • Tomcat, when run as recommended with an unprivileged user, cannot bind to restricted ports like the conventional SSL port 443: для этого есть обходные пути, например, использование программыauthbind для сопоставления непривилегированной программы с ограниченным портом, настройка переадресации портов с помощью брандмауэра и т. д., но каждый из них вносит дополнительную сложность.

  • SSL with Tomcat is not as widely supported by other software: такие проекты, как Let’s Encrypt, не предоставляют встроенного способа взаимодействия с Tomcat. Кроме того, формат хранилища ключей Java требует преобразования обычных сертификатов перед использованием, что усложняет автоматизацию.

  • Conventional web servers release more frequently than Tomcat: это может иметь серьезные последствия для безопасности ваших приложений. Например, поддерживаемый набор шифров Tomcat SSL может быстро устареть, оставляя ваши приложения с неоптимальной защитой. В случае, если необходимы обновления для системы безопасности, вероятно, проще обновить веб-сервер, чем установку Tomcat.

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

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

Предпосылки

Чтобы выполнить это руководство, на вашем сервере уже должна быть установлена ​​Tomcat. В этом руководстве предполагается, что вы использовали инструкции в нашемTomcat 8 on CentOS 7 installation guide для настройки.

Когда у вас запущен и работает Tomcat, перейдите ниже к разделу о предпочитаемом вами веб-сервере. Apache начинается непосредственно под ним, а конфигурациюNginx можно найти, немного пропустив вперед.

(Вариант 1) Проксирование с помощьюmod_jk веб-сервера Apache

Веб-сервер Apache имеет модуль под названиемmod_jk, который может напрямую связываться с Tomcat, используя протокол Apache «JServ». Соединитель для этого протокола включен по умолчанию в Tomcat, поэтому Tomcat уже готов обработать эти запросы.

Раздел Предварительные условия

Прежде чем мы сможем обсудить, как прокси-соединения веб-сервера Apache с Tomcat, вы должны установить и обезопасить веб-сервер Apache.

Вы можете установить веб-сервер Apache, выполнив шаг 1the CentOS 7 LAMP installation guide. Не устанавливайте MySQL или PHP.

После этого вам нужно будет настроить SSL на сервере. То, как вы это сделаете, будет зависеть от того, есть у вас доменное имя или нет.

  • If you have a domain name… самый простой способ защитить ваш сервер - использовать Let’s Encrypt, который предоставляет бесплатные доверенные сертификаты. Следуйте нашимLet’s Encrypt guide for Apache, чтобы настроить это.

  • If you do not have a domain…, и вы используете эту конфигурацию только для тестирования или личного использования, вместо этого вы можете использовать самозаверяющий сертификат. Это обеспечивает тот же тип шифрования, но без проверки домена. Следуйте нашимself-signed SSL guide for Apache, чтобы настроить.

Когда вы закончите с этими шагами, продолжите ниже, чтобы узнать, как подключить веб-сервер Apache к вашей установке Tomcat.

Шаг 1. Скомпилируйте и установитеmod_jk

Хотя сам Tomcat поставляется с соединителем JServ, репозитории пакетов CentOS 7 не включают модульmod_jk, который необходим веб-серверу Apache для связи с использованием этого протокола. Чтобы добавить эту функцию, нам нужно будет скачать и скомпилировать коннектор с сайта проекта Tomcat.

Перед загрузкой исходного кода для коннектора нам нужно будет установить необходимые зависимости сборки и времени выполнения из репозиториев CentOS. Мы будем устанавливать GCC для компиляции коннектора и файлов разработки веб-сервера Apache, чтобы была доступна необходимая библиотека Apache.

sudo yum install gcc httpd-devel

Как только зависимости установлены, переместитесь в доступный для записи каталог и загрузите исходный код соединителя. Вы можете найти последнюю версию наTomcat connector download page. Скопируйте ссылку, связанную с последним источникомtar.gz для коннекторов Tomcat JK, и используйте командуcurl, чтобы загрузить ее на свой сервер:

cd /tmp
curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz

Затем извлеките архив в текущий каталог и перейдите в подкаталогnative, где исходный код и сценарии сборки расположены в иерархии извлеченных файлов:

tar xzvf tomcat-connectors*
cd tomcat-connectors*/native

Теперь мы готовы к настройке программного обеспечения. Нам нужно указать расположение двоичного файла инструмента расширения Apacheapxs, чтобы успешно настроить источник для нашего сервера. После этого мы можем использоватьmake для сборки программного обеспечения и установки скомпилированного модуля:

./configure --with-apxs=/usr/bin/apxs
make
sudo make install

Это установит модульmod_jk в каталог модулей Apache.

Шаг 2: Настройте модуль mod_jk

Теперь, когда модуль установлен, мы можем настроить веб-сервер Apache, чтобы использовать его для связи с нашим экземпляром Tomcat. Это можно сделать, настроив несколько файлов конфигурации.

Начните с открытия файла с именемjk.conf в каталоге/etc/httpd/conf.d:

sudo vi /etc/httpd/conf.d/jk.conf

Внутри нам нужно начать с загрузки модуляmod_jk. После этого мы настроим специальный журнал и файл общей памяти. Наконец, мы будем использовать директивуJkWorkersFile, чтобы указать на файл, который мы будем создавать, чтобы указать конфигурацию нашего рабочего.

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

/etc/httpd/conf.d/jk.conf

LoadModule jk_module modules/mod_jk.so

JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm

JkWorkersFile conf/workers.properties

Сохраните и закройте файл, когда вы закончите.

Далее мы создадим файл свойств работника. Мы будем использовать это, чтобы определить работника для подключения к нашему бэкэнду Tomcat:

sudo vi /etc/httpd/conf/workers.properties

Внутри этого файла мы определим одного работника, который будет подключаться к нашему экземпляру Tomcat через порт 8009, используя версию 13 протокола Apache JServ:

/etc/httpd/conf/workers.properties

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009

Когда вы закончите, сохраните и закройте файл.

Шаг 3. Настройте виртуальный хост Apache на прокси с помощьюmod_jk

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

Откройте файл сейчас, набрав:

sudo vi /etc/httpd/conf.d/ssl.conf

Внутри блока конфигурацииVirtualHost добавьте директивуJkMount для передачи всего трафика, который этот виртуальный хост получает, в только что определенный нами рабочий экземпляр. JkMount можно разместить в любом месте разделаVirtualHost:

/etc/httpd/conf.d/ssl.conf

. . .



. . .
JkMount /* worker1
. . .

Сохраните и закройте файл, когда вы закончите.

Затем проверьте свою конфигурацию, набрав:

sudo apachectl configtest

Если вывод содержитSyntax OK, перезапустите процесс веб-сервера Apache:

sudo systemctl restart httpd

Теперь вы сможете получить доступ к вашей установке Tomcat, посетив версию вашего сайта в вашем браузере:

https://example.com

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

(Вариант 2) HTTP-прокси с помощью Nginx

Проксирование также легко с Nginx, если вы предпочитаете его веб-серверу Apache. Хотя у Nginx нет модуля, позволяющего ему использовать Apache JServ Protocol, он может использовать свои мощные возможности прокси-сервера HTTP для связи с Tomcat.

Раздел Предварительные условия

Прежде чем мы сможем обсудить, как прокси-соединения Nginx с Tomcat, вы должны установить и защитить Nginx.

То, как вы это сделаете, будет зависеть от того, есть у вас доменное имя или нет.

  • If you have a domain name… самый простой способ защитить ваш сервер - использовать Let’s Encrypt, который предоставляет бесплатные доверенные сертификаты. Следуйте нашимLet’s Encrypt guide for Nginx, чтобы настроить Nginx и защитить его с помощью Let's Encrypt.

  • If you do not have a domain…, и вы используете эту конфигурацию только для тестирования или личного использования, вместо этого вы можете использовать самозаверяющий сертификат. Это обеспечивает тот же тип шифрования, но без проверки домена. Следуйте нашимself-signed SSL guide for Nginx, чтобы установить Nginx и настроить его с помощью самозаверяющего сертификата.

Когда вы закончите с этими шагами, продолжите ниже, чтобы узнать, как подключить веб-сервер Nginx к вашей установке Tomcat.

Шаг 1: Настройка конфигурации блока Nginx Server

Настроить Nginx для прокси на Tomcat очень просто.

Начните с открытия файла блока сервера, связанного с вашим сайтом. Как самоподписанные руководства, так и руководства Let's Encrypt SSL настраивают зашифрованный серверный блок в файле/etc/httpd/conf.d/ssl.conf, поэтому мы будем использовать это:

sudo vi /etc/nginx/conf.d/ssl.conf

Внутри, ближе к верху файла, нам нужно добавить блокupstream. Это обрисует детали соединения, чтобы Nginx знал, где наш сервер Tomcat слушает. Поместите это вне любого из блоковserver, определенных в файле:

/etc/nginx/sites-available/default

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {

    . . .

Затем в блокеserver, определенном для порта 443, измените блокlocation /. Мы хотим передавать все запросы непосредственно в только что определенный нами блокupstream. Закомментируйте любое существующее содержимое и используйте директивуproxy_pass для передачи «tomcat» вверх по течению, которое мы только что определили.

Мы также установим некоторые заголовки, которые позволят Nginx передавать Tomcat информацию о запросе:

/etc/nginx/sites-available/default

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    . . .

    location / {
        #try_files $uri $uri/ =404;
        proxy_pass http://tomcat/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    . . .
}

Когда вы закончите, сохраните и закройте файл.

Шаг 2: протестируйте и перезапустите Nginx

Затем проверьте, чтобы убедиться, что изменения конфигурации не привели к синтаксическим ошибкам:

sudo nginx -t

Если об ошибках не сообщается, перезапустите Nginx, чтобы внести изменения:

sudo systemctl restart nginx

Теперь вы сможете получить доступ к вашей установке Tomcat, посетив версию вашего сайта в вашем браузере:

https://example.com

Ограничение доступа к установке Tomcat

Теперь у вас есть зашифрованный SSL-доступ к вашей установке Tomcat, мы можем заблокировать установку Tomcat немного больше.

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

Откройте файлserver.xml в каталоге конфигурации Tomcat, чтобы изменить эти параметры:

sudo vi /opt/tomcat/conf/server.xml

В этом файле нам нужно изменить определенияConnector. В настоящее время в конфигурации включены два соединителя. Один обрабатывает обычные HTTP-запросы на порт 8080, а другой обрабатывает запросы Apache JServ Protocol на порт 8009. Конфигурация будет выглядеть примерно так:

/opt/tomcat/conf/server.xml

. . .

    
. . .

    
    

Чтобы ограничить доступ к локальному интерфейсу обратной связи, нам просто нужно добавить атрибут «адрес», установленный на127.0.0.1 в каждое из этих определений коннектора. Конечный результат будет выглядеть так:

/opt/tomcat/conf/server.xml

. . .

    
. . .

    
    

После внесения этих двух изменений сохраните и закройте файл.

Нам нужно перезапустить наш процесс Tomcat для реализации этих изменений:

sudo systemctl restart tomcat

Ваша установка Tomcat теперь должна быть доступна только через прокси вашего веб-сервера.

Заключение

На этом этапе соединения с вашим экземпляром Tomcat должны быть зашифрованы с помощью SSL с помощью прокси-сервера веб-сервера. Хотя настройка отдельного процесса веб-сервера может увеличить объем программного обеспечения, используемого для обслуживания ваших приложений, это значительно упрощает процесс обеспечения безопасности вашего трафика.

Related