Как настроить Jenkins с использованием SSL с помощью обратного прокси-сервера Nginx в Ubuntu 18.04

Вступление

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

В этом руководстве вы настроите Nginx в качестве обратного прокси-сервера для направления клиентских запросов в Jenkins.

Предпосылки

Для начала вам понадобится следующее:

[[step-1 -—- configuring-nginx]] == Шаг 1. Настройка Nginx

В предварительном руководствеHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04 вы настроили Nginx для использования SSL в файле/etc/nginx/sites-available/example.com. Откройте этот файл, чтобы добавить настройки обратного прокси:

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

В блокеserver с настройками конфигурации SSL добавьте специальные журналы доступа и ошибок Jenkins:

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

. . .
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:

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

. . .
           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: файл/etc/nginx/proxy_params предоставляется Nginx и гарантирует, что важная информация, включая имя хоста, протокол клиентского запроса и IP-адрес клиента, сохраняется и доступна в файлах журнала.

  • proxy_pass: устанавливает протокол и адрес прокси-сервера, которым в данном случае будет сервер Jenkins, доступ к которому осуществляется черезlocalhost на порту8080.

  • proxy_read_timeout: это позволяет увеличить значение Nginx по умолчанию в 60 секунд до рекомендованного Jenkins значения в 90 секунд.

  • proxy_redirect: это гарантирует, чтоresponses are correctly rewritten будет включать правильное имя хоста.

Обязательно замените свое защищенное SSL доменное имя наexample.com в строкеproxy_redirect ниже:

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

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 setup is broken" error.
                proxy_redirect      http://localhost:8080 https://example.com;

После внесения этих изменений сохраните файл и выйдите из редактора. Мы не будем перезапускать Nginx до тех пор, пока не настроим Jenkins, но теперь мы можем протестировать нашу конфигурацию:

sudo nginx -t

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

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

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

[.Примечание]##

Note:
Если вы неправильно сконфигурируетеproxy_pass (например, добавив косую черту в конце), вы получите что-то похожее на следующее на странице JenkinsConfiguration.

Jenkins error: Reverse proxy set up is broken

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

[[step-2 -—- configuring-jenkins]] == Шаг 2. Настройка Jenkins

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

Давайте изменим файл конфигурации/etc/default/jenkins, чтобы внести следующие изменения:

sudo nano /etc/default/jenkins

Найдите строкуJENKINS_ARGS и добавьте--httpListenAddress=127.0.0.1 к существующим аргументам:

/etc/default/jenkins

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

Сохраните и выйдите из файла.

Чтобы использовать новые параметры конфигурации, перезапустите Jenkins:

sudo systemctl restart jenkins

Посколькуsystemctl не отображает вывод, проверьте статус:

sudo systemctl status jenkins

Вы должны увидеть статусactive (exited) в строкеActive:

Output● 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
Output● 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 будет обслуживаться безопасно.

[[step-3 -—- testing-the-configuration]] == Шаг 3 - Проверка конфигурации

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

В браузере введитеhttp://example.com, заменив свой домен наexample.com. После того, как вы нажметеENTER, URL-адрес должен начинаться сhttps, а в строке местоположения должно быть указано, что соединение является безопасным.

Вы можете ввести имя администратора, созданное вами вHow To Install Jenkins on Ubuntu 18.04, в полеUser, и пароль, который вы выбрали, в полеPassword.

После входа в систему вы можете изменить пароль, чтобы убедиться в его безопасности.

Нажмите на свое имя пользователя в верхнем правом углу экрана. На главной странице профиля выберитеConfigure из списка в левой части страницы:

Navigate to Jenkins password page

Это приведет вас на новую страницу, где вы можете ввести и подтвердить новый пароль:

Jenkins create password page

Подтвердите новый пароль, нажавSave. Теперь вы можете безопасно использовать веб-интерфейс Jenkins.

Заключение

В этом руководстве вы настроили Nginx в качестве обратного прокси-сервера для встроенного веб-сервера Jenkins, чтобы защитить свои учетные данные и другую информацию, передаваемую через веб-интерфейс. Теперь, когда Jenkins в безопасности, вы можете изучитьhow to set up a continuous integration pipeline для автоматического тестирования изменений кода. Другие ресурсы, которые следует учитывать, если вы новичок в Jenkins, - это учебникthe Jenkins project’s “Creating your first Pipeline” илиthe library of community-contributed plugins.

Related