SSL-шифрование Concourse CI с помощью Nginx в Ubuntu 16.04

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

В предыдущем руководстве вы научились устанавливать Concourse CI в Ubuntu 16.04. Поскольку Concourse CI по умолчанию не поддерживает шифрования, все данные передаются в виде простого текста.

Это руководство поможет настроить Concourse CI для поддержки TLS/SSL с помощью обратного прокси-сервера Nginx. Хотя в Concourse использование SSL без прокси, обратный прокси-сервер обеспечивает большую гибкость масштабирования и предоставляет доступ к набору более производительных функций.

Требования

  • Сервер Ubuntu 16.04.
  • 1 Гб RAM.
  • Пользователь с доступом к sudo.
  • Настроенный брандмауэр.
  • Предварительно установленная система Concourse.
  • Установленный сервер Nginx.
  • Сертификаты TLS/SSL.

Все необходимые инструкции по подготовке можно найти в мануалах:

Сервер Concourse использует порт 8080. Веб-сервер Nginx прослушивает порты 80 и 443. Трафик по порту 80 перенаправляется на порт 443, который поддерживает шифрование.

1: Nginx как обратный прокси-сервер Concourse

Сначала нужно отредактировать файл виртуального хоста SSL, чтобы перенаправить трафик на Concourse CI.

Поиск файла

Чтобы доменное имя, защищенное SSL, могло обслуживать интерфейс Concourse, нужно найти файл виртуального хоста, который обслуживает этот домен. С помощью grep его можно найти в каталоге /etc/nginx/sites-enabled.

grep -R server_name /etc/nginx/sites-enabled
/etc/nginx/sites-enabled/default:   server_name example.com;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name example.com;
/etc/nginx/sites-enabled/default:#  server_name example.com;

В данном случае домен (example.com) был обнаружен в файле /etc/nginx/sites-enabled/default. Отредактируйте этот файл.

Также команда grep может вернуть такой результат:

/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:#  server_name example.com;

Обычно «server_name _;» — это виртуальный блок, который команда выводит, если не может найти совпадений с запросом. Если вы не можете найти определение server_name, соответствующее вашему доменному имени, вы должны использовать вместо него этот виртуальный блок.

Виртуальный блок Concourse

Откройте найденный файл виртуального блока.

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

Файл будет выглядеть примерно так (комментарии опущены для краткости).

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
location / {
try_files $uri $uri/ =404;
}
location ~ /.well-known {
allow all;
}
}

Так выглядит общая структура файла виртуального хоста. Ее можно адаптировать для проксирования запросов Concourse.

Во-первых, в самое начало файла (перед блоком server) нужно добавить блок upstream. Он определяет, как процесс web принимает соединения. Сервер непрерывной интеграции принимает подключения по порту 8080.

Затем нужно найти в файле блок, который отвечает за обработку SSL (он содержит строку listen 443). Убедитесь, что параметр server_name в этом блоке содержит правильное доменное имя (или значение «server_name _;», если вы не смогли найти его ранее).

Внутри этого блока server нужно отредактировать блок location /, чтобы веб-сервер Nginx передавал все запросы на сервер Concourse. Для этого нужно добавить параметры из внешнего файла, установить несколько дополнительных параметров и определить заголовки проксирования; после этого запросы будут обрабатываться блоком upstream.

Замените директиву try_files в блоке location / следующими строками. В результате файл должен выглядеть так:

upstream concourse {
server 127.0.0.1:8080;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
location / {
include proxy_params;
proxy_http_version 1.1;
proxy_read_timeout 90;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://concourse;
}
location ~ /.well-known {
allow all;
}
}

Сохраните и закройте файл.

Тестирование и активация новых настроек

Для начала проверьте синтаксис в конфигурациях Nginx.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

Чтобы применить новые настройки, перезапустите Nginx.

sudo systemctl restart nginx

Теперь Nginx может перенаправлять запросы на сервер Concourse.

2: Настройка Concourse для поддержки локального loopback-интерфейса

Теперь, когда Nginx передает трафик на сервер Concourse, можно ограничить доступ к Concourse. На данный момент Concourse принимает соединения по порту 8080 на всех интерфейсах, а это позволяет пользователям обойти SSL-шифрование.

Отредактируйте файл web_environment, чтобы изменить это.

sudo nano /etc/concourse/web_environment

Найдите параметр CONCOURSE_EXTERNAL_URL и укажите в нем URL, по которому пользователи смогут получить доступ к веб-интерфейсу Concourse. Он должен включать протокол https://.

Затем переменной среды CONCOURSE_BIND_IP нужно присвоить значение 127.0.0.1. По умолчанию Concourse прослушивает все интерфейсы. После этого изменения Concourse сможет прослушивать только локальный интерфейс. Удаленные соединения будут проксироваться через Nginx, что обеспечит постоянную поддержку SSL.

. . .
CONCOURSE_EXTERNAL_URL=https://example.com
CONCOURSE_BIND_IP=127.0.0.1

Сохраните и закройте файл.

Перезапустите процесс web.

sudo systemctl restart concourse-web

Убедитесь, что web прослушивает только локальный loopback-интерфейс.

sudo netstat -plunt | grep 8080
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      20932/concourse

Такой вывод сообщает, что процесс web прослушивает только локальный интерфейс.

Теперь нужно отредактировать настройки брандмауэра и закрыть порт 8080, поскольку все запросы на этот порт будет передавать Nginx.

sudo ufw delete allow 8080
Rule deleted
Rule deleted (v6)

Теперь веб-интерфейс поддерживает шифрование.

3: Тестирование шифрования

Откройте в браузере:

https://example.com

Вы увидите приветственную страницу Concourse CI.

no pipelines configured
first, download the CLO tools […]

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

Nginx принимает и передает запросы Concourse. Теперь, когда данные шифруются, можно войти в веб-интерфейс.

Если вы нажмете ссылку login в верхнем правом углу, вы сможете войти в веб-интерфейс. Сначала он предложит выбрать группу. Группа main является единственным доступным вариантом по умолчанию.

Затем интерфейс запросит учетные данные. Введите имя и пароль, указанные в файле web_environment.

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

Заключение

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

Больше информации о fly можно найти в документации Concourse.

Tags: , , , ,