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

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

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

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

Требования

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

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

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

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

. . .
server {
# SSL Configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
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 /
. . .
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 set up is broken" error.
proxy_redirect      http://localhost:8080 https://your.ssl.domain.name;

Сохраните и закройте файл. Пока что перезапускать 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
More info   Dismiss

В таком случае убедитесь, что параметры 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; bad; vendor preset: enabled)
Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago
Docs: man:systemd-sysv-generator(8)
Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
Process: 11391 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 Tue 2017-04-25 22:36:08 UTC; 2min 51s ago
Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=
Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC
Main PID: 11353 (nginx)

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

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

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

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

http://your.ssl.domain.name

Примечание: Вместо your.ssl.domain.name укажите свой домен.

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

В поле User введите admin. В поле Password укажите пароль, автоматически сгенерированный инструментом Jenkins во время установки. Пароль можно получить с помощью команды:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Примечание: Если вы изменили пароль администратора, введите новый пароль.

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

Заключение

Теперь конфиденциальные данные Jenkins шифруются, а Nginx работает как обратный прокси-сервер.

Больше информации о Jenkins можно найти на сайте или в блоге проекта.

Tags: , , , ,

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