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

Вступление

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

В этом руководстве мы обсудим, как обезопасить установку Ubuntu 16.04 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 Ubuntu 16.04 installation guide для настройки.

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

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

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

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

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

Вы можете установить веб-сервер Apache, выполнив шаг 1this 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

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

Мы можем установитьmod_jk из репозиториев Ubuntu по умолчанию. Обновите локальный индекс пакета и установите его, набрав:

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. Для нашей установки Tomcat это будет/opt/tomcat:

/etc/libapache2-mod-jk/workers.properties

workers.tomcat_home=/opt/tomcat

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

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

Далее нам нужно настроить наш виртуальный хост Apache для запросов прокси к нашей установке Tomcat.

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

Если вы настроили самоподписанный сертификат SSL, используя руководство, указанное выше, откройте файлdefault-ssl.conf:

sudo nano /etc/apache2/sites-available/default-ssl.conf

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

sudo apache2ctl -S

Ваш вывод, вероятно, начнется с чего-то вроде этого:

OutputVirtualHost 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 в этом примере), мы можем определить, какие файлы виртуальных хостов участвуют в обслуживании этих доменов. Здесь мы видим, что задействованы как файл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 вы должны ввести следующее:



    . . .

    JKMount /* ajp13_worker

    . . .

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

Когда вы закончите, проверьте свою конфигурацию, набрав:

sudo apache2ctl configtest

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

sudo systemctl restart apache2

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

https://example.com

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

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

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

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

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

Вы можете установить Nginx, выполнивour guide on installing Nginx on Ubuntu 16.04.

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

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

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

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

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

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

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

sudo nano /etc/nginx/sites-available/default

Внутри, ближе к верху файла, нам нужно добавить блок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», который мы только что определили.

Нам также нужно будет включить в этот блок конфигурациюproxy_params. Этот файл определяет многие детали того, как Nginx будет прокси-соединение:

/etc/nginx/sites-available/default

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

server {
    . . .

    location / {
        #try_files $uri $uri/ =404;
        include proxy_params;
        proxy_pass http://tomcat/;
    }

    . . .
}

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

Шаг 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 nano /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, в вашей установке включен брандмауэрufw. Теперь, когда все наши запросы к Tomcat ограничены локальным интерфейсом обратной связи, мы можем удалить правило из нашего брандмауэра, разрешающее внешние запросы к Tomcat.

sudo ufw delete allow 8080

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

Заключение

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

Related