Настройка Jenkins для поддержки SSL с помощью обратного прокси-сервера Nginx в Ubuntu 18.04

По умолчанию Jenkins поставляется с собственным встроенным веб-сервером Winstone, который прослушивает порт 8080.

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

Данный мануал поможет настроить Nginx как обратный прокси-сервер Jenkins и включить шифрование SSL.

Требования

1: Настройка Nginx

В руководстве Создание сертификата Let’s Encrypt для Nginx в Ubuntu 18.04 настройки веб-сервера Nginx для поддержки SSL были помещены в файл /etc/nginx/sites-available/example.com. Откройте его:

sudo nano /etc/nginx/sites-available/example.com

Добавьте в блок server логи доступа и ошибок Jenkins:

. . .
server {
. . .
# SSL Configuration
#
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
access_log            /var/log/nginx/jenkins.access.log;
error_log             /var/log/nginx/jenkins.error.log;
. . .
}

Затем нужно настроить проксирование. Поскольку запросы будут передаваться сервису Jenkins, закомментируйте строку try_files (иначе она будет выдавать ошибку 404 до того как запрос попадет к Jenkins).

. . .
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;        }
. . .

Теперь добавьте настройки проксирования.

  • Параметры proxy_params сохраняют в логах важные данные (имя хоста, протокол клиентского запроса и IP-адрес клиента).
  • Параметр proxy_pass устанавливает протокол и адрес прокси-сервера (в данном случае это сервер Jenkins, доступный на localhost на порту 8080).
  • Увеличьте значение proxy_read_timeout с 60 до 90.
  • Добавьте proxy_redirect, чтобы ответы правильно переписывались и содержали правильное имя хоста.

Примечание: В поле proxy_redirect укажите свой домен, защищенный сертификатом SSL.

. . .
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
include /etc/nginx/proxy_params;
proxy_pass          http://localhost:8080;
proxy_read_timeout  90s;
# Fix potential "It appears that your reverse proxy setup is broken" error.
proxy_redirect      http://localhost:8080 https://example.com;

Сохраните и закройте файл. Пока что перезапускать Nginx не нужно (сначала обновите настройки Jenkins). Проверьте ошибки в конфигурации:

sudo nginx -t

Если ошибок нет, команда вернет:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если команда обнаружила ошибки, исправьте их и повторите проверку.

Примечание: Если вы допустили ошибку в proxy_pass (например, поставили лишний слеш), на странице настройки Jenkins появится такое сообщение:

It appears that your reverse proxy set up is broken

В таком случае убедитесь, что параметры proxy_pass и proxy_redirect в настройках Nginx указаны правильно.

2: Настройка Jenkins

Чтобы сервер Jenkins мог взаимодействовать с Nginx, обновите его настройки. Сервер Jenkins должен прослушивать интерфейс localhost, а не все интерфейсы (0.0.0.0). Если Jenkins будет прослушивать все интерфейсы, он будет доступен по стандартному нешифрованному порту 8080.

Внесите поправки в настройки:

sudo nano /etc/default/jenkins

Найдите строку JENKINS_ARGS и добавьте в список аргументов —httpListenAddress=127.0.0.1.

. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

Сохраните и закройте файл.

Чтобы обновить настройки, перезапустите Jenkins.

sudo systemctl restart jenkins

Команда systemctl не выводит результат некоторых команд. Запросите состояние Jenkins.

sudo systemctl status jenkins

В строке Active должно быть указано состояние active (exited).

jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Mon 2018-07-09 20:26:25 UTC; 11s ago
Docs: man:systemd-sysv-generator(8)
Process: 29766 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
Process: 29812 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

Затем перезапустите веб-сервер Nginx:

sudo systemctl restart nginx

И запросите его состояние:

sudo systemctl status nginx
nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-07-09 20:27:23 UTC; 31s ago
Docs: man:nginx(8)
Process: 29951 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 29963 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 29952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 29967 (nginx)

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

3: Тестирование настройки

Чтобы проверить настройку, попробуйте сбросить пароль администратора. Для начала попробуйте получить доступ к сайту по http и убедитесь, что Jenkins автоматически перенаправляет запросы на https.

В адресную строку браузера введите:

http://example.com

Нажмите ввод. В адресе вместо http должен быть указан протокол https. Если это так, сервер поддерживает шифрование.

В поле User введите admin. В поле Password укажите пароль, который вы выбрали во время установки.

После этого нужно изменить пароль администратора. Для этого кликните по имени пользователя в правом верхнем углу и выберите Configure в выпадающем меню. Введите и подтвердите новый пароль. Нажмите Save.

Заключение

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

Читайте также: Настройка непрерывной интеграции в Jenkins в Ubuntu 16.04

Также полезно ознакомиться с мануалом Creating your first Pipeline и с поддерживаемой сообществом библиотекой плагинов.

Tags: , , , ,