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

Вступление

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

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

Предпосылки

One Ubuntu 16.04 server настроен с пользователемsudo без полномочий root и брандмауэром, следуя инструкциямUbuntu 16.04 initial server setup guide с установленными и настроенными Jenkins и Nginx, используя следующие руководства:

Когда вы выполните эти требования, вы готовы начать.

[[step-one -—- configuring-nginx]] == Шаг первый - Настройка Nginx

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

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

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

/etc/nginx/sites-available/default

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

/etc/nginx/sites-available/default

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

Затем мы добавим фактические настройки прокси. Конфигурация начинается с включения предоставленных Nginxproxy_params, которые гарантируют, что такая информация, как имя хоста, протокол клиентского запроса и IP-адрес клиента, будет доступна в наших файлах журнала. Затемproxy_pass устанавливает протокол и адрес прокси-сервера, которым в нашем случае является сервер Jenkins, доступ к которому осуществляется на локальном хосте через порт 8080. Затем мы увеличиваемproxy_read_timeout с 60-секундного значения по умолчанию для Nginx до рекомендованного для проекта 90-секундного значения. И, наконец, мы добавляемproxy_redirect, чтобы гарантировать, чтоresponses are properly rewritten включает правильное имя хоста.

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

/etc/nginx/sites-available/default

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

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

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

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

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

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

Jenkins error: Reverse proxy set up is broken

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

[[step-two -—- configuring-jenkins]] == Шаг второй - Настройка 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 и Nginx.

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

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

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

В веб-браузере введите «http: //your.ssl.domain.name», заменив свой домен наyour.ssl.domain.name. После нажатия клавиши ВВОД URL-адрес должен начинаться сhttps, а в строке адреса должно быть указано, что соединение является безопасным.

Verify Jenkins is being served over https

Мы введемadmin в поле «Пользователь» и автоматически сгенерированный пароль, который Дженкинс создал и сохранил при его установке.

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

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

Navigate to the Jenkins admin password page

Нажмите «admin» в правом верхнем углу и выберите «Configure» из выпадающего меню. Введите и подтвердите новый пароль и нажмите «Сохранить». Теперь вы можете безопасно использовать веб-интерфейс Jenkins.

Заключение

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

Related