Шифрование соединений Tomcat 8 на Apache или Nginx в CentOS 7

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

Данное руководство поможет защитить сервер Tomcat 8 в CentOS 7 с помощью SSL. По умолчанию сразу после установки обмен данными между сервером Tomcat и клиентами не шифруется (в том числе все пароли и другие конфиденциальные данные). Существует несколько методов внедрения SSL в Tomcat. Это руководство научит настраивать прокси-сервер с поддержкой SSL для безопасного обмена данными с клиентами.

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

Во-первых, методов реализации SSL для Tomcat много (хотя каждый имеет свои недостатки). Во-вторых, у Tomcat есть «родная» функция шифрования соединений. Так почему же именно обратный прокси-сервер?

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

  • При запуске согласно рекомендациям (через аккаунт непривилегированного пользователя) Tomcat не может подключаться к заблокированным портам (например, к стандартному порту SSL, 443). Эту проблему можно обойти с помощью программы authbind, которая позволяет непривилегированной программе подключиться к порту с ограниченным доступом, настроить переадресацию портов для брандмауэра и т.д. Однако настройка таких программ может повлечь за собой дополнительные сложности.
  • Связка SSL + Tomcat редко поддерживается другими программами. К примеру, сервис Let’s Encrypt не предоставляет способов взаимодействия с Tomcat. Кроме того, формат хранилища ключей Java требует обычных сертификатов, которые преобразовываются перед использованием, что затрудняет автоматизацию.
  • Стандартные веб-серверы обновляются чаще, чем Tomcat. Это может иметь серьезные последствия для безопасности приложений. Например, поддерживаемое Tomcat шифрование SSL может быстро устареть, вследствие чего защита приложения станет ненадёжной. В случае необходимости обновить систему безопасности стандартного веб-сервера проще, чем Tomcat.

Обратный прокси-сервер позволяет обойти многие из этих проблем. Тогда обрабатывать запросы клиентов с помощью SSL сможет веб-сервер, который был специально для этого разработан. Затем он передаст запросы через прокси на сервер Tomcat, работающий, согласно рекомендациям, в нормальном режиме (т.е., через непривилегированного пользователя).

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

Общие требования

  • Предустановленный сервер Tomcat 8 (инструкции по установке можно найти здесь).
  • Сервер Apache или Nginx.

Вариант 1: Проксирование на Apache с помощью модуля mod_jk

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

Требования

Прежде чем приступить к настройке проксирования запросов Apache на Tomcat, нужно установить и защитить сервер Apache. Инструкции по установке можно найти в соответствующем разделе руководства «Установка стека LAMP в CentOS 7».

После этого нужно настроить SSL. На данном этапе важно, есть у вас домен или нет.

1: Установка и настройка mod_jk

Стандартный репозиторий пакетов CentOS 7 не предоставляет модуль mod_jk, необходимый веб-серверу Apache для поддержки протокола JServ. Этот модуль можно загрузить с сайта Tomcat.

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

sudo yum install gcc httpd-devel

После этого перейдите в доступный для записи каталог и загрузите исходный код коннектора. Последнюю версию кода можно найти на сайте Tomcat. Скопируйте ссылку на 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

Теперь можно начать сборку. Укажите расположение инструмента apxs, который поможет настроить код. Затем используйте make, чтобы собрать и установить скомпилированный модуль.

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

Теперь модуль mod_jk хранится в каталоге модулей Apache.

2: Настройка mod_jk

Теперь нужно настроить поддержку модуля mod_jk и взаимодействие Apache с Tomcat.

Откройте файл jk.conf:

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

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

Не редактируя, вставьте в конфигурационный файл следующие параметры:

LoadModule jk_module modules/mod_jk.so
JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm
JkWorkersFile conf/workers.properties

Сохраните и закройте файл.

Создайте файл свойств рабочего процесса.

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

Настройте один рабочий процесс, который будет создавать подключение к Tomcat на порте 8009 с помощью версии 13 протокола Apache JServ:

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

Сохраните и закройте файл.

3: Настройка виртуального хоста Apache

После этого нужно настроить виртуальный хост Apache для поддержки mod_jk.

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

Откройте виртуальный хост:

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

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

. . .
<VirtualHost _default_:443>
. . .
JkMount /* worker1
. . .
</VirtualHost>

Сохраните и закройте файл.

Проверьте настройки:

sudo apachectl configtest

Если команда вернула:

Syntax OK

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

sudo systemctl restart httpd

Теперь сервер Tomcat доступен в браузере по SSL:

https://example.com

Если это так, переходите к разделу «Ограничение доступа к Tomcat».

Вариант 2: Проксирование на Nginx

Проксирование легко настроить и на веб-сервере Nginx, хотя Nginx не предоставляет специального модуля для взаимодействия с протоколом Apache JServ.

Требования

Прежде чем приступить к настройке проксирования запросов Nginx на Tomcat, нужно установить и защитить сервер Nginx и настроить SSL. Все необходимые инструкции можно найти по следующим ссылкам. На данном этапе важно, есть у вас домен или нет.

1: Настройка виртуального хоста Nginx

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

Откройте файл блока server вашего сайта. Если вы следовали руководствам, предложенным в требованиях, настройки шифрования хранятся в файле /etc/httpd/conf.d/ssl.conf.

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

В начало файла добавьте блок upstream. Он сообщает серверу Nginx, какие соединения прослушивает Tomcat. Поместите следующий блок вне блоков server, находящихся в файле.

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

Далее в блоке server для порта 443 отредактируйте блок location /. Все запросы нужно передавать непосредственно блоку upstream. Для этого закомментируйте текущий параметр и используйте директиву proxy_pass.

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

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 доступен в браузере по соединениям SSL:

https://example.com

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

Теперь соединения сервера Tomcat шифруются по SSL.

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

Откройте файл server.xml в каталоге настроек Tomcat:

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

В этом файле нужно отредактировать Connector. На данный момент существует два активных определения Connector; одно из них обрабатывает обычные запросы HTTP (порт 8080), а второе – запросы Apache JServ Protocol (порт 8009). Настройки будут выглядеть примерно так:

. . .
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
. . .
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Чтобы ограничить доступ локальным кольцевым интерфейсом, нужно добавить параметр address со значением 127.0.0.1 в каждое определение Connector. В результате получится:

. . .
<Connector port="8080" protocol="HTTP/1.1"          connectionTimeout="20000"
address="127.0.0.1"
redirectPort="8443" />
. . .
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />

Сохраните и закройте файл.

Перезапустите Tomcat:

sudo systemctl restart tomcat

Теперь установка Tomcat доступна только через прокси-сервер.

Заключение

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

Tags: , , , ,

1 комментарий

Добавить комментарий