Как настроить Nginx с SSL в качестве обратного прокси-сервера для Jenkins

Вступление

По умолчанию Jenkins поставляется со своим собственным встроенным веб-сервером, который прослушивает порт 8080. Это удобно, если вы запускаете частный экземпляр Jenkins или вам просто нужно быстро что-то поднять и не беспокоиться о безопасности. Однако, как только вы получите реальные производственные данные, отправляемые на ваш хост, рекомендуется использовать более безопасный веб-сервер, такой как Nginx.

В этом посте будет подробно рассказано, как обернуть ваш сайт SSL с использованием веб-сервера Nginx в качестве обратного прокси-сервера для вашего экземпляра Jenkins. * Это руководство предполагает некоторое знакомство с командами Linux, работающей установкой Jenkins и установкой Ubuntu 14.04. *

Вы можете установить Jenkins позже в этом руководстве, если он еще не установлен.

Шаг первый - настройка Nginx

Nginx стал популярным веб-сервером благодаря своей скорости и гибкости в последние годы, поэтому мы будем использовать этот веб-сервер.

Команды в этом разделе предполагают, что у вас есть пользователь, настроенный с помощью https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04- vps [доступ sudo].

Установить Nginx

Обновите ваши списки пакетов и установите Nginx:

sudo apt-get update
sudo apt-get install nginx

Это не важно, но вы можете проверить версию Nginx на случай, если вам понадобится устранить неполадки в будущем. Более новые версии Nginx также предоставляют несколько дополнительных функций.

nginx -v

Получить сертификат

Далее вам нужно будет приобрести или создать сертификат SSL. Эти команды предназначены для самозаверяющего сертификата, но вы должны получить официально https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs [ подписанный сертификат], если вы хотите избежать предупреждений браузера.

Перейдите в соответствующий каталог и сгенерируйте сертификат:

cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Вам будет предложено ввести некоторую информацию о сертификате. Вы можете заполнить это по своему усмотрению; просто знайте, что информация будет видна в свойствах сертификата. Мы установили число битов на 2048, так как это минимум, необходимый для его подписания ЦС. Если вы хотите подписать сертификат, вам нужно будет создать CSR.

Изменить конфигурацию

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

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

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

server {
   listen 80;
   return 301 https://$host$request_uri;
}

server {

   listen 443;
   server_name ;

   ssl_certificate           /etc/nginx/cert.crt;
   ssl_certificate_key       /etc/nginx/cert.key;

   ssl on;
   ssl_session_cache  builtin:1000  shared:SSL:10m;
   ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
   ssl_prefer_server_ciphers on;

   access_log            /var/log/nginx/jenkins.access.log;

   location / {

     proxy_set_header        Host $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;

     # Fix the “It appears that your reverse proxy set up is broken" error.
     proxy_pass          http://localhost:8080;
     proxy_read_timeout  90;

     proxy_redirect      http://localhost:8080 https://;
   }
 }

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

Первый раздел говорит серверу Nginx прослушивать любые запросы, поступающие на порт 80 (по умолчанию HTTP), и перенаправлять их на HTTPS.

...
server {
  listen 80;
  return 301 https://$host$request_uri;
}
...

Далее у нас есть настройки SSL. Это хороший набор значений по умолчанию, но его можно расширить. Для более подробного объяснения, пожалуйста, прочитайте https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 в этом учебнике].

...
 listen 443;
 server_name ;

 ssl_certificate           /etc/nginx/cert.crt;
 ssl_certificate_key       /etc/nginx/cert.key;

 ssl on;
 ssl_session_cache  builtin:1000  shared:SSL:10m;
 ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
 ssl_prefer_server_ciphers on;
 ...

Последний раздел, где происходит проксирование. Он в основном принимает любые входящие запросы и передает их на экземпляр Jenkins, который связан / прослушивает порт 8080 в локальном сетевом интерфейсе. Это немного другая ситуация, но thurutorial имеет некоторые хорошие информация о настройках прокси Nginx.

...
location / {

   proxy_set_header        Host $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;

   # Fix the “It appears that your reverse proxy set up is broken" error.
   proxy_pass          http://localhost:8080;
   proxy_read_timeout  90;

   proxy_redirect      http://localhost:8080 https://;
}
...

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

изображение: https: //assets.digitalocean.com/articles/nginx_jenkins/1.jpg [Ошибка Дженкинса: настройка обратного прокси-сервера нарушена]

Итак, если вы видите эту ошибку, дважды проверьте ваши настройки и настройки в конфигурации Nginx!

Шаг второй - настройка Jenkins

Как указывалось ранее, в этом руководстве предполагается, что Jenkins уже установлен. Thutorial покажет вам, как установить Jenkins при необходимости. Вам, вероятно, потребуется переключиться на пользователя root для этой статьи.

Чтобы Jenkins работал с Nginx, нам нужно обновить конфигурацию Jenkins для прослушивания только на интерфейсе localhost вместо всех (0.0.0.0), чтобы обеспечить правильную обработку трафика. Это важный шаг, потому что если Jenkins все еще прослушивает все интерфейсы, он все равно будет потенциально доступен через свой оригинальный порт (8080). Мы изменим файл конфигурации, чтобы внести эти изменения.

sudo nano /etc/default/jenkins

Найдите строку + JENKINS \ ARGS и обновите ее, чтобы она выглядела следующим образом:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

Обратите внимание, что параметр * –httpListenAddress = 127.0.0.1 * необходимо либо добавить, либо изменить.

Затем продолжите и перезапустите Jenkins и Nginx.

sudo service jenkins restart
sudo service nginx restart

Теперь вы сможете посещать свой домен по протоколу HTTP или HTTPS, и сайт Jenkins будет обслуживаться безопасно. Вы увидите предупреждение о сертификате, если вы использовали самозаверяющий сертификат.

Необязательно - обновить URL-адреса OAuth

Если вы используете GitHub или другой плагин OAuth для аутентификации, он, вероятно, будет сломан в этот момент. Например, при попытке посетить URL-адрес вы получите «Не удалось открыть страницу» с URL-адресом, подобным следующему:

http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

Чтобы это исправить, вам нужно обновить несколько настроек, включая настройки вашего плагина OAuth. Сначала обновите URL Jenkins (в графическом интерфейсе Jenkins); Это можно найти здесь:

  • Jenkins → Управление Jenkins → Настройка системы → Расположение Jenkins *

Обновите URL Jenkins для использования HTTPS - + https: // +

изображение: https: //assets.digitalocean.com/articles/nginx_jenkins/2.jpg [Дженкинс URL]

Затем обновите настройки OAuth у внешнего поставщика. Этот пример для GitHub. На GitHub это можно найти в разделе * Настройки → Приложения → Приложения разработчика * на сайте GitHub.

Там должна быть запись для Дженкинс. Обновите * URL-адрес домашней страницы * и * URL-адрес обратного вызова авторизации *, чтобы отразить настройки HTTPS. Это может выглядеть примерно так:

изображение: https: //assets.digitalocean.com/articles/nginx_jenkins/3.jpg [настройки Jenkins на GitHub; https: // был использован с обоими URL]

Заключение

Осталось только убедиться, что все работает правильно. Как уже упоминалось выше, теперь вы сможете просматривать только что настроенный URL-адрес - по HTTP или HTTPS. Вы должны быть перенаправлены на защищенный сайт и должны увидеть некоторую информацию о сайте, включая ваши недавно обновленные настройки SSL. Как отмечалось ранее, если вы не используете имена хостов через DNS, то ваше перенаправление может работать не так, как нужно. В этом случае вам нужно будет изменить раздел в конфигурационном файле Nginx.

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

Related