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

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

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

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

Требования

  • Сервер Ubuntu 20.04, настроенный по этому мануалу.
  • Предварительно установленный сервер Jenkins (инструкции здесь).
  • Веб-сервер Nginx (инструкции по установке можно найти здесь).
  • Сертификат Let’s Encrypt (ознакомьтесь с мануалом Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.04). Обратите внимание: для этого обязательно нужен домен! Здесь мы используем условный домен example.com.

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

Согласно мануалу Создание сертификата Let’s Encrypt для Nginx в Ubuntu 20.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-адрес клиента (файл /etc/nginx/proxy_params предоставляется веб-сервером Nginx).
  • Параметр proxy_pass устанавливает протокол и адрес прокси-сервера (в данном случае это сервер Jenkins, доступный на localhost на порту 8080).
  • Увеличьте значение proxy_read_timeout с 60 до 90 (так рекомендует документация Jenkins).
  • Добавьте 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: , , , , ,

Добавить комментарий