Сам себе devops или настраиваем Nginx прокси для Apache Tomcat на Ubuntu за 5 минут c https и firewall’ом

в 17:45, , рубрики: certbot, devops, java, LetsEncrypt, nginx, tomcat, Ubuntu, ufw

Сам себе devops или настраиваем Nginx прокси для Apache Tomcat на Ubuntu за 5 минут c https и firewall'ом - 1

Я не админ, но иногда возникают задачи, которые проще (и интереснее) решать самому чем кому-то делегировать.

Изредка у нас появляется необходимость «поднять» servlet контейнер (чаще всего Apache Tomcat) и настроить для него проксирование, ssl termination (а проще говоря https) и все это прикрыть firewall'ом (оставив наружу только ssh и http/https).

Так получилось, что за последнюю неделю я эту задачу решал трижды (так стали звезды, а до этого — года два назад) и этот опыт трансформировался в сей небольшой опус.

Итак, дано Ubuntu сервер 18.04 или 16.04 (скорее всего у вас не будет проблем и с более ранними версиями 14.04 или около). Если у вас нет Ubuntu сервера, то можете его быстро «поднять», например, на Digital Ocean (ссылка моя реферальная).

DNS

Для простой схемы получения бесплатного https сертификата от Let's Encrypt нам понадобится доступ к DNS серверу. Прописываем в нем IP адрес нашего Ubuntu сервера с именем, скажем, xyz. Давайте, для определенности, предположим, что у вас есть домен mydomain.com, т.е. DNS имя нашего сервера будет xyz.mydomain.com

Установка

Устанавливаем Apache Tomcat (я буду использовать 8 версию)

apt install tomcat8

А теперь Nginx

apt install nginx-core

Настройка

Nginx

Настраиваем Nginx'у прописанный ранее в DNS server name (файл /etc/nginx/sites-available/default)

server_name xyz.mydomain.com; 

Прописываем ссылку на установленный Apache Tomcat (если Вы ничего не меняли, то он «живет» на порту 8080). Нам нужно добавить блок upstream до блока server.

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

Вносим изменения в блок location и перенаправляем весь трафик на Apache Tomcat

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

Проверяем, что все внесли корректно

service nginx configtest

и рестартуем nginx

service nginx restart

Apache Tomcat

В принципе эта часть опциональная и если Вам не важно чтобы на tomcat «приходили» реальные ip адреса, порты, схема по которой идет запрос (я про https) и запрашиваемый сервер, то этот шаг можно опустить. Однако, в некоторых случаях этот шаг обязателен (например, для технологии Java Web Start aka JNLP).

В файл /etc/tomcat8/server.xml в блок <Host/> добавляем.

<Host>
...
      <Valve className="org.apache.catalina.valves.RemoteIpValve"
        remoteIpHeader="x-forwarded-for"
        remoteIpProxiesHeader="x-forwarded-by"
        protocolHeader="x-forwarded-proto"
        />
</Host>

Перезапускаем tomcat

service tomcat8 restart

HTTPS сертификат

HTTPS сертификат с верификацией через http поможет получить нам бот certbot, а точнее его модификация для nginx'a — python-certbot-nginx

На Ubuntu 18.04 для установки certbot'a достаточно выполнить

apt install python-certbot-nginx

Для Ubuntu 16.04 — придется повозиться с добавлением репозиториев и пр. (см. подробное руководство по ссылке).

Запускаем

certbot --nginx 

В процессе указываем свой email, принимаем лицензионное соглашение, не разрешаем «шарить» свои данные с Let's Encrypt, подтверждаем DNS имя, на которое будет выписан сертификат, соглашаемся на то, чтобы бот сам «отконфигурил» nginx.

Вуаля :)

На всякий случай проверяем, что возобновление сертификата пройдет без проблем (сертификат выдается на 90 дней и после этого может бесконечно продляться на тот же срок).

certbot renew --dry-run

И для внутренней паранои проверяем, что cron файл на месте

ls -al /etc/cron.d/certbot

Firewall

Останавливаем и делаем backup (snapshot) виртуалки.

ufw allow ssh
ufw allow http
ufw allow https
ufw default allow outgoing
ufw default deny incoming
ufw show added

Молимся!

ufw enable
ufw status

Проверяем, что все получилось — сайт доступен по https, http трафик перенаправляется и порты, кроме ранее перечисленных, и ssh надежно закрыты.

P.S.: Я искренне надеюсь, что сей текст может быть кому-то полезен и буду рад конструктивной критике.

Автор: FoxyBOA

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js