Apache Tomcat – это сервер приложений и контейнер сервлетов, который используется для обслуживания приложений Java. Часто используемый для развёртывания и поддержки сайтов и приложений всех масштабов сервер Tomcat является одновременно гибким и мощным решением.
Данное руководство поможет защитить сервер Tomcat 8 в Ubuntu 16.04 с помощью 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 в Ubuntu 16.04».
После этого нужно настроить на сервере SSL. На данном этапе важно, есть у вас домен или нет.
- Если у вас есть доменное имя, вы можете получить бесплатный SSL-сертификат от сервиса Let’s Encrypt.
- Если у вас нет домена, можно создать самоподписанный сертификат. Такой сертификат также шифрует все соединения, однако не подтверждает подлинности домена.
Установка и настройка mod_jk
Сначала нужно установить модуль mod_jk, который можно найти в стандартном репозитории системы.
Для этого обновите индекс пакетов и запустите следующую команду:
sudo apt-get update
sudo apt-get install libapache2-mod-jk
После установки модуль включается автоматически.
После этого нужно настроить модуль. Его главный конфигурационный файл находится в /etc/libapache2-mod-jk/workers.properties. Откройте его в редакторе:
sudo nano /etc/libapache2-mod-jk/workers.properties
Найдите в файле директиву workers.tomcat_home. Укажите в ней домашний каталог установки Tomcat (в данном случае это каталог /opt/tomcat):
workers.tomcat_home=/opt/tomcat
Сохраните и закройте файл.
Настройка виртуального хоста Apache
После этого нужно настроить виртуальный хост Apache для поддержки mod_jk.
Конфигурационный файл виртуального хоста зависит от метода настройки SSL.
При использовании самоподписанного SSL-сертификата откройте default-ssl.conf:
sudo nano /etc/apache2/sites-available/default-ssl.conf
Если же вы используете SSL-сертификат от Let’s Encrypt, то местонахождение файла зависит от того, что вы указали в опциях при создании сертификата. Чтобы узнать, какой виртуальный хост обслуживает SSL, введите:
sudo apache2ctl -S
Вывод будет начинаться примерно так:
VirtualHost configuration:
*:80 example.com (/etc/apache2/sites-enabled/000-default.conf:1)
*:443 is a NameVirtualHost
default server example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
port 443 namevhost example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
port 443 namevhost www.example.com (/etc/apache2/sites-enabled/default-ssl.conf:2)
. . .
Найдите строки, связанные с портом SSL, 443 (в данном случае это строки 3 – 6). В них указано, какой виртуальный хост обслуживает SSL. Как видите, в данном случае это файлы 000-default-le-ssl.conf и default-ssl.conf. нужно отредактировать оба файла.
sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
sudo nano /etc/apache2/sites-enabled/default-ssl.conf
Вне зависимости от того, какие файлы вам нужно отредактировать, процедура будет одна и та же. В тег VirtualHost добавьте следующее:
<VirtualHost *:443>
. . .
JKMount /* ajp13_worker
. . .
</VirtualHost>
Сохраните и закройте файл.
Примечание: Если файлов, отвечающих за поддержку SSL, несколько, повторите эту процедуру для всех файлов.
Проверьте конфигурации на наличие ошибок:
sudo apache2ctl configtest
Если команда вернула Syntax OK, перезапустите веб-сервер:
sudo systemctl restart apache2
Теперь сервер Tomcat доступен в браузере по соединениям SSL:
https://example.com
Если это так, переходите к разделу «Ограничение доступа к Tomcat».
Вариант 2: Проксирование на Nginx
Проксирование легко настроить и на веб-сервере Nginx, хотя Nginx не предоставляет специального модуля для взаимодействия с Tomcat.
Требования
Прежде чем приступить к настройке проксирования запросов Nginx на Tomcat, нужно установить и защитить сервер Nginx. Инструкции по установке можно найти в руководстве «Установка Nginx в Ubuntu 16.04».
После этого нужно настроить на сервере SSL. На данном этапе важно, есть у вас домен или нет.
- Если у вас есть доменное имя, вы можете получить бесплатный SSL-сертификат от сервиса Let’s Encrypt.
- Если у вас нет домена, можно создать самоподписанный сертификат. Такой сертификат также шифрует все соединения, однако не подтверждает подлинности домена.
Настройка блока server
Настройка Nginx как прокси для Tomcat очень проста.
Откройте файл блока server вашего сайта (в руководстве используется стандартный server блок).
sudo nano /etc/nginx/sites-available/default
В начале файла добавьте блок upstream. Он сообщает серверу Nginx, какие соединения прослушивает Tomcat. Поместите следующий блок вне блоков server, находящихся в файле.
upstream tomcat {
127.0.0.1:8080 fail_timout=0;
}
server {
. . .
Далее в блоке server для порта 443 отредактируйте блок location /. Все запросы нужно передавать непосредственно блоку upstream. Для этого закомментируйте текущий параметр и используйте директиву proxy_pass.
Также в этот блок нужно добавить настройки proxy_params; этот файл определяет множество параметров проксирования соединений сервером Nginx.
upstream tomcat {
127.0.0.1:8080 fail_timout=0;
}
server {
. . .
location / {
#try_files $uri $uri/ =404;
include proxy_params;
proxy_pass http://tomcat/;
}
. . .
}
Сохраните и закройте файл.
Тестирование и перезапуск Nginx
Проверьте настройки на наличие ошибок:
sudo nginx -t
Если ошибок не обнаружено, перезапустите Nginx:
sudo systemctl restart nginx
Теперь сервер Tomcat доступен в браузере по соединениям SSL:
https://example.com
Ограничение доступа к Tomcat
Теперь соединения сервера Tomcat шифруются по SSL.
Чтобы все запросы Tomcat проходили через прокси-сервер, нужно настроить Tomcat для прослушивания соединений только на локальном кольцевом интерфейсе.
Откройте файл server.xml в каталоге настроек Tomcat:
sudo nano /opt/tomcat/conf/server.xml
В этом файле нужно отредактировать определение Connector. На данный момент существует два активных определения Connector; одно из них обрабатывает обычные запросы HTTP (порт 8080), а второе – запросы Apache JServ Protocol (порт 8009). Настройки будут выглядеть примерно так:
. . .
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
. . .
<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" />
. . .
<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
Сохраните и закройте файл.
Перезапустите Tomcat:
sudo systemctl restart tomcat
Если вы следовали руководству по установке Tomcat, сервер защищён брандмауэром ufw. Поскольку на данный момент все соединения Tomcat ограничены локальным кольцевым интерфейсом, можно удалить правило брандмауэра для Tomcat.
sudo ufw delete allow 8080
Теперь установка Tomcat доступна только через прокси-сервер.
Заключение
Теперь соединения сервера Tomcat шифруются по SSL с помощью прокси-сервера. Конечно, внедрение отдельного веб-сервера может потребовать дополнительного программного обеспечения, однако с его помощью надёжная защита сервера настраивается значительно проще.