Вступление
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 с помощью прокси-сервера веб-сервера. Хотя настройка отдельного процесса веб-сервера может увеличить объем программного обеспечения, используемого для обслуживания ваших приложений, это значительно упрощает процесс обеспечения безопасности вашего трафика.