Как настроить GoCD с помощью Let’s Encrypt SSL-сертификатов в Ubuntu 16.04

Вступление

GoCD - мощная платформа для непрерывной интеграции и доставки, предназначенная для автоматизации процессов тестирования и выпуска. Благодаря множеству расширенных функций, таких как возможность сравнивать сборки, визуализировать сложные рабочие процессы и автоматизировать отслеживание версий сборок, GoCD - это гибкий инструмент, который может помочь командам доставить хорошо протестированное программное обеспечение в производственную среду.

В последней статье мы https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-gocd-on-ubuntu-16-04 установили сервер GoCD, настроили агента, и настроенная аутентификация. В этом руководстве мы настроим GoCD на использование надежного SSL-сертификата Let Encrypt для предотвращения предупреждений браузера при доступе к веб-интерфейсу. Мы предоставим инструкции для двух разных возможных конфигураций.

Первый метод установит веб-сервер Nginx в качестве обратного прокси-сервера, который будет перенаправлять соединения на конечную точку HTTP GoCD. Этот выбор обеспечивает более плавный опыт Let Encrypt и, вероятно, будет лучшим вариантом для большинства людей.

Второй метод, который мы обсудим, получит сертификат от Let’s Encrypt, а затем отключит сертификат, используемый конечной точкой HTCDPS GoCD. Хотя это устраняет необходимость в отдельном веб-сервере и, возможно, экономит ресурсы, GoCD использует хранилище сертификатов SSL хранилища ключей Java, которое напрямую не совместимо с форматом сертификата, предлагаемым Let’s Encrypt. Нам нужно будет создать скрипт для автоматического преобразования сертификатов в ожидаемый формат каждый раз, когда происходит обновление. Этот вариант лучше всего подходит, если на вашем сервере есть минимальные ресурсы, и вы хотите выделить все доступное для самого GoCD.

Предпосылки

Если у вас еще нет сервера GoCD, настроенного в Ubuntu 16.04, вам необходимо настроить его перед запуском этого руководства. Базовому серверу требуется * как минимум 2 ГБ ОЗУ и 2 ядра ЦП *. GoCD также требуется выделенный раздел или диск для хранения артефактов. Вы можете узнать, как настроить это дополнительное пространство, используя одно из следующих двух руководств:

После настройки сервера вы можете выполнить начальную настройку и установить GoCD, используя следующие руководства:

  • Initial Server Setup с Ubuntu 16.04: это руководство покажет вам, как создать пользователя + sudo + и настроить основной брандмауэр.

  • Как установить и настроить GoCD в Ubuntu 16.04: это руководство поможет вам путем установки программного обеспечения, настройки точки монтирования артефактов и настройки аутентификации пользователя.

Чтобы получить SSL-сертификат от Let’s Encrypt, на вашем сервере должно быть * доменное имя *.

Дальнейшие требования зависят от метода, который вы хотите использовать, и будут объяснены в соответствующих разделах. Когда вы будете готовы продолжить, выберите метод, который вы хотите использовать, и следуйте соответствующим инструкциям.

Вариант 1. Настройка Nginx в качестве обратного прокси-сервера для GoCD

Если вы хотите настроить Nginx в качестве завершающего обратного прокси-сервера SSL для GoCD, следуйте этому разделу. В этой конфигурации Nginx будет настроен на обслуживание HTTPS-трафика с использованием сертификата Let Encrypt. Он будет расшифровывать клиентские подключения, а затем перенаправлять трафик на веб-интерфейс GoCD, используя обычный HTTP. Это требует некоторых дополнительных затрат для внешнего интерфейса Nginx, но это более простой подход.

Дополнительные требования

Если вы хотите использовать Nginx в качестве обратного прокси-сервера для GoCD, вам сначала необходимо установить Nginx и клиент Let Encrypt, а затем запросить сертификат для вашего домена. Эти учебные пособия содержат шаги, необходимые для получения сертификата и настройки вашего веб-сервера:

После того, как вы выполнили приведенные выше руководства, GoCD по-прежнему должен быть доступен с использованием самозаверяющего сертификата путем доступа к + https: //: 8154 +, а страница Nginx по умолчанию должна отображаться с использованием сертификата Let’s Encrypt при удалении порта. Спецификация.

Теперь мы можем настроить Nginx для прокси-запросов к серверу GoCD, чтобы клиентские подключения были зашифрованы с помощью сертификата Let Encrypt.

Конфигурирование Nginx To Proxy для HTTP-интерфейса GoCD

Мы загрузили SSL-сертификат из Let Encrypt и настроили Nginx для использования сертификата при обслуживании запросов по стандартному SSL-порту. Нашим следующим шагом будет настройка Nginx для передачи этих запросов обычному HTTP-интерфейсу GoCD, доступному через порт 8153.

Чтобы начать, откройте файл блока сервера Nginx по умолчанию, настроенный для использования вашего сертификата Let Encrypt:

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

В верхней части файла, вне блока + server +, откройте новый раздел + upsteam +. Мы назовем этот блок + gocd +, чтобы мы могли легко распознать его позже. Внутри укажите адрес, который Nginx может использовать для связи с HTTP-интерфейсом GoCD. В нашем случае это будет использовать локальное устройство обратной связи, поэтому полный адрес должен быть +127.0.0.1: 8153 +:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   . . .

Затем в блоке + server + найдите блок + location / +. Внутри закомментируйте директиву + try_files, чтобы мы могли указать конфигурацию вашего прокси. Вместо строки + try_files + добавьте проход прокси в определенный выше + gocd +, используя протокол + http: // +. Включите файл + proxy_params +, чтобы установить другие параметры прокси, необходимые для нашего блока местоположения:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

. . .

server
   . . .

   location / {
       try_files $uri $uri/ =404;


   }

   . . .

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

Вернувшись в командную строку, проверьте конфигурацию Nginx на наличие синтаксических ошибок, набрав:

sudo nginx -t

Если ошибок не найдено, перезапустите службу Nginx, набрав:

sudo systemctl restart nginx

Теперь ваш веб-интерфейс GoCD должен быть доступен через ваше обычное доменное имя с протоколом + https: // +.

Последний элемент, который нам нужно настроить, - это настройка URL сайта в веб-интерфейсе GoCD.

Обновление URL сайта GoCD для использования нового адреса

После перезапуска Nginx единственной оставшейся задачей является изменение настройки URL-адреса сайта, которую GoCD использует для создания соответствующих ссылок.

Посетите домен вашего сервера GoCD в веб-браузере и, если необходимо, войдите в систему:

https://

Затем нажмите * ADMIN * в верхней строке меню и выберите * Конфигурация сервера * в раскрывающемся меню:

изображение: https: //assets.digitalocean.com/articles/gocd_ssl_1604/config_server_link.png [GoCD настроить ссылку на сервер]

В разделе * Управление сервером * измените * URL сайта *, чтобы удалить спецификацию порта +: 8154 + с конца. Если ранее вы использовали IP-адрес вместо имени домена, измените URL-адрес, чтобы использовать также и имя домена:

изображение: https: //assets.digitalocean.com/articles/gocd_ssl_1604/site_url_setting.png [Настройка URL-адреса сайта GoCD]

Прокрутите вниз до нижней части страницы и нажмите * SAVE *, чтобы немедленно внести изменения. Теперь ваш сайт настроен на передачу всех запросов вашего домена через Nginx в веб-интерфейс GoCD.

Вариант 2. Конфигурирование собственного SSL GoCD для использования сертификатов Let Encrypt

Следуйте этому разделу, если вы хотите настроить собственный веб-сервер GoCD для использования сертификатов Let Encrypt. В этой конфигурации мы заменим самоподписанный сертификат, уже используемый сервером GoCD, на доверенный сертификат, предоставляемый Let Encrypt. Однако для этого нам потребуется преобразовать файлы сертификатов в новый формат и импортировать их в файл хранилища ключей Java. Мы создадим сценарий, чтобы процесс мог повторяться при каждом обновлении файлов сертификатов.

Дополнительные требования

Если вы хотите обрабатывать все операции SSL из самого GoCD, вам необходимо загрузить сертификат с Let Encrypt без процедуры настройки веб-сервера. Следуйте этому руководству, чтобы загрузить соответствующего клиента и получить сертификат для своего домена:

После завершения описанных выше руководств GoCD по-прежнему должен быть доступен с использованием самозаверяющего сертификата путем доступа к + https: //: 8154 +, а файлы сертификатов Let’s Encrypt должны быть доступны в `+ / etc / letsencrypt / live / + `каталог.

Создание сценария преобразования сертификата

GoCD использует Java keystore для обработки сертификатов SSL. К сожалению, это другой формат, чем тот, который используется Let’s Encrypt. Чтобы использовать наши сертификаты Let Encrypt с GoCD, нам нужно будет конвертировать их, используя очень специфическую процедуру.

Из-за сложности процедуры и необходимости конвертировать сертификаты при каждом их обновлении мы создадим сценарий для автоматизации процедуры. В каталоге + / usr / local / bin + создайте и откройте скрипт с именем + convert_certs_for_gocd.sh + в своем текстовом редакторе:

sudo nano /usr/local/bin/convert_certs_for_gocd.sh

Внутри вставьте следующий скрипт. Единственный параметр, который вам нужно обновить, это значение переменной + base_domain +. Установите это в качестве имени домена вашего сервера GoCD (это должно соответствовать значению каталога в + / etc / letsencrypt / live / +):

/usr/local/bin/convert_certs_for_gocd.sh

#!/bin/bash

base_domain=""
le_directory="/etc/letsencrypt/live/${base_domain}"
working_dir="$(mktemp -d)"
gocd_pass="serverKeystorepa55w0rd"


clean_up () {
   rm -rf "${working_dir}"
}

# Use this to echo to standard error
error () {
   printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
   clean_up
   exit 1
}

trap 'error "An unexpected error occurred."' ERR

copy_cert_files () {
   cp "${le_directory}/fullchain.pem" "${working_dir}"
   cp "${le_directory}/privkey.pem" "${working_dir}"
}

convert_to_pkcs12 () {
   openssl_pkcs12_args=(
       "pkcs12"
       "-inkey" "${working_dir}/privkey.pem"
       "-in" "${working_dir}/fullchain.pem"
       "-export"
       "-out" "${working_dir}/${base_domain}.crt.pkcs12"
       "-passout" "pass:${gocd_pass}"
   )
   openssl "${openssl_pkcs12_args[@]}"
}

import_to_keytool () {
   keytool_args=(
       "-importkeystore"
       "-srckeystore" "${working_dir}/${base_domain}.crt.pkcs12"
       "-srcstoretype" "PKCS12"
       "-srcstorepass" "${gocd_pass}"
       "-destkeystore" "${working_dir}/keystore"
       "-srcalias" "1"
       "-destalias" "cruise"
       "-deststorepass" "${gocd_pass}"
       "-destkeypass" "${gocd_pass}"
   )
   keytool "${keytool_args[@]}"
}

install_new_keystore () {
   cp /etc/go/keystore /etc/go/keystore.bak
   mv "${working_dir}/keystore" "/etc/go/keystore"
   chown go:go /etc/go/keystore
   systemctl restart go-server
}

if (( EUID != 0 )); then
   error "This script requires root privileges"
fi

copy_cert_files && convert_to_pkcs12 && import_to_keytool && install_new_keystore && clean_up

Давайте рассмотрим точно, что делает этот скрипт.

Сначала мы установили несколько переменных, чтобы облегчить работу с нашим сценарием. Мы устанавливаем доменное имя для сертификатов, которые мы хотим преобразовать, и переменную, которая расширяется до каталога сертификатов Let Encrypt. Мы создаем временный рабочий каталог с помощью команды + mktemp + и присваиваем значение другой переменной. GoCD требует, чтобы все его пароли хранилища ключей Java были равны `+ serverKeystorepa55w0rd + `, мы устанавливаем другую переменную для хранения этого значения.

Далее мы определяем функцию, которая удаляет временный каталог при вызове. Мы используем это в конце нашего скрипта для очистки после себя, а также при возникновении непредвиденных ошибок. Чтобы реализовать эту вторую возможность, мы создаем другую функцию, которая отображает сообщение об ошибке и очищается перед выходом. Мы используем команду + trap + для автоматического вызова этой функции при возникновении ошибки.

После этого мы создаем функции, которые выполняют фактическое преобразование. Первая функция настраивает наше рабочее пространство путем копирования закрытого ключа и сертификата полной цепочки в рабочий каталог. Функция + convert_to_pkcs12 + использует + openssl + для соединения файла сертификата полной цепочки и файла закрытого ключа в объединенном файле PKCS 12, который использует keytool. Для этого процесса требуется пароль для экспорта, поэтому мы используем переменную пароля GoCD.

Следующая функция импортирует новый файл PKCS 12 в файл хранилища ключей Java. Мы импортируем файл и предоставляем пароль для экспорта. Затем мы предоставляем один и тот же пароль для различных паролей файла хранилища ключей. Наконец, последняя функция копирует новый файл + keystore + в каталог + / etc / go + (после резервного копирования старого + keystore +), устанавливает владельца файла и перезапускает сервер GoCD.

В конце сценария мы проверяем, что сценарий вызывается с соответствующими разрешениями, проверяя, является ли эффективный идентификатор пользователя «0», что означает «с теми же разрешениями, что и у root». Затем вызовите функции в соответствующем порядке, чтобы правильно преобразовать сертификаты и установить новый файл + keystore +.

Когда вы закончите, сохраните и закройте файл, чтобы продолжить.

Выполнение первоначального преобразования

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

Во-первых, пометьте скрипт как исполняемый, чтобы он мог выполняться напрямую без вызова интерпретатора:

sudo chmod +x /usr/local/bin/convert_certs_for_gocd.sh

Теперь вызовите скрипт с + sudo + для выполнения первоначального преобразования, установите сгенерированный файл + keystore + и перезапустите процесс GoCD

sudo /usr/local/bin/convert_certs_for_gocd.sh

Поскольку сервер GoCD должен перезагрузиться, процесс может занять некоторое время. После завершения сценария может пройти еще один или два момента, прежде чем сервер будет готов прослушивать соединения. Вы можете посмотреть порты, которые в данный момент используются приложениями, набрав:

sudo watch netstat -plnt

Это представление покажет порты TCP, которые приложения в настоящее время прослушивают с частотой обновления в две секунды. Когда GoCD начинает прослушивать порты 8153 и 8154, экран должен выглядеть следующим образом:

OutputEvery 2.0s: netstat -plnt                                                    Thu Jul 27 20:16:20 2017

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1736/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1736/sshd
tcp6       0      0 :::                 :::*                    LISTEN      8942/java
tcp6       0      0 :::                 :::*                    LISTEN      8942/java

Когда порты 8153 и 8154 присутствуют, нажмите * CTRL-C *, чтобы выйти из экрана.

После того, как приложение начнет прослушивать соединения, проверьте веб-интерфейс, посетив свой домен GoCD через порт 8154 с использованием HTTPS:

https://:8154

Ранее, когда к этой странице обращались, значок в адресной строке указывал, что сертификат нельзя доверять (обратите внимание, что визуальный индикатор вашего браузера может отличаться):

изображение: https: //assets.digitalocean.com/articles/gocd_ssl_1604/ssl_cert_not_trusted_icon.png [Chrome SSL-сертификат не является доверенным значком]

При первом посещении вам, вероятно, пришлось щелкнуть экран предупреждения в вашем браузере:

изображение: https: //assets.digitalocean.com/articles/gocd_install_1604/browser_ssl_warning.png [Предупреждение браузера SSL]

Теперь, когда мы заменили самозаверяющий сертификат доверенным сертификатом, предоставленным Let Encrypt, браузер укажет, что сертификат является доверенным, и пользователям не придется обходить предупреждение браузера для доступа к сайту. Обратите внимание, что предыдущий сертификат может кэшироваться вашим браузером, пока вы не закроете текущую вкладку, окно или сеанс:

изображение: https: //assets.digitalocean.com/articles/gocd_ssl_1604/ssl_cert_trusted_icon.png [Значок доверенного сертификата Chrome SSL]

Это означает, что GoCD смог использовать конвертированный нами сертификат Let’s Encrypt.

Настройка автообновления Hook

Теперь, когда мы убедились, что наш скрипт правильно преобразовал активы сертификата, мы можем быть уверены, что + certbot + вызывает наш скрипт каждый раз, когда сертификат обновляется.

Откройте файл конфигурации продления для вашего домена в каталоге + / etc / letsencrypt / renewal +, набрав:

sudo nano /etc/letsencrypt/renewal/.conf

Внутри, в разделе + [renewalparams] + файла, добавьте строку с настройкой + renew_hook + в расположение вашего скрипта:

/etc/letsencrypt/renewal/example.com.conf

. . .
[renewalparams]
. . .
renew_hook = /usr/local/bin/convert_certs_for_gocd.sh

Программное обеспечение + certbot + устанавливает задание + cron +, которое проверяет необходимость обновления сертификатов дважды в день. После продления сертификата будет запущен скрипт, указанный в + renew_hook +. Таким образом, мы можем гарантировать, что GoCD всегда использует последний действительный сертификат, полученный от Let’s Encrypt.

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

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

sudo certbot renew --dry-run
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for
Waiting for verification...
Cleaning up challenges


-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live//fullchain.pem
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
 /etc/letsencrypt/live//fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

Приведенные выше результаты подтверждают, что внесенные нами изменения не помешали продлению сертификата. Вывод также указывает, что хук продления указывает на правильное расположение скрипта.

Заключение

В этом руководстве мы рассмотрели два различных способа защиты установки GoCD с помощью доверенного сертификата SSL от Let Encrypt. Первый метод настраивал сертификат с Nginx, а затем передавал трафик через веб-интерфейс GoCD. Второй вариант преобразует файлы сертификатов Let Encrypt в формат PKCS 12 и импортирует их в файл хранилища ключей Java, который будет изначально использоваться GoCD. Оба варианта защищают веб-интерфейс GoCD надежным сертификатом, но они достигают этого, используя различные стратегии и уникальные компромиссы. Подход, который подходит вам, во многом будет зависеть от требований и целей вашей команды.

Related