Как защитить Concourse CI с помощью SSL с помощью Nginx в Ubuntu 16.04

Вступление

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

В previous учебник мы продемонстрировали, как установить и настроить экземпляр Concourse CI на сервер Ubuntu 16.04. К концу мы получили сервер непрерывной интеграции, который можно было контролировать и контролировать как из командной строки, так и через веб-интерфейс.

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

Предпосылки

Прежде чем начать, вам понадобится сервер Ubuntu 16.04 * с не менее 1 ГБ ОЗУ *. Выполните следующие руководства, чтобы настроить пользователя без полномочий root, установить и настроить Concourse, установить Nginx и настроить соединения TLS / SSL на сервере. Вам также понадобится * доменное имя *, указанное на вашем сервере Concourse для правильной защиты:

После выполнения этих предварительных условий у вас будет сервер Concourse, работающий на порту 8080. Кроме того, Nginx будет работать на портах 80 и 443. Трафик на порт 80 будет перенаправлен на порт 443, который будет шифровать трафик для запросов на доменное имя вашего сервера.

Когда вы будете готовы начать, продолжайте ниже.

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

Первое, что нам нужно сделать, это изменить файл блока сервера SSL для маршрутизации трафика на сервер Concourse CI.

Найдите правильный файл для редактирования

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

grep -R server_name /etc/nginx/sites-enabled

Вы, вероятно, увидите что-то вроде этого:

Output/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;

В приведенном выше выводе имя домена (в данном случае + example.com +) определяется в файле + / etc / nginx / sites-enabled / default +. Вы захотите отредактировать файл (первый столбец), связанный с вашим доменным именем.

Вполне возможно, что вы также можете увидеть что-то вроде этого:

Output/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 Server

Чтобы начать, откройте файл, который определяет ваш домен, в текстовом редакторе:

sudo nano /etc/nginx/sites-enabled/

С краткими комментариями, ваш файл, скорее всего, будет выглядеть примерно так, если вы правильно следовали инструкциям в разделе предварительных условий:

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name ;
   return 301 https://$server_name$request_uri;
}

server {
   listen 443 ssl http2 default_server;
   listen [::]:443 ssl http2 default_server;
   include snippets/ssl-.conf;
   include snippets/ssl-params.conf;

   root /var/www/html;
   index index.html index.htm index.nginx-debian.html;

   server_name ;

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

   location ~ /.well-known {
       allow all;
   }
}

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

Во-первых, в самом начале файла, до того как заблокирован сервер +, мы создадим блок + upstream, называемый * concourse *, который определяет, как наш веб-процесс Concourse принимает соединения. Сервер непрерывной интеграции принимает соединения через порт 8080.

Затем найдите блок сервера, который отвечает за обслуживание содержимого SSL, ища блок со строкой + listen 443 +. Еще раз проверьте, что + имя_сервера +, определенное в этом блоке, соответствует имени вашего домена (или имеет значение + имя_сервера _; +, если вы не нашли никаких результатов, соответствующих имени вашего домена, когда вы искали с помощью + find +).

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

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

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name ;
   return 301 https://$server_name$request_uri;
}

server {
   listen 443 ssl http2 default_server;
   listen [::]:443 ssl http2 default_server;
   include snippets/ssl-.conf;
   include snippets/ssl-params.conf;

   root /var/www/html;
   index index.html index.htm index.nginx-debian.html;

   server_name ;

   location / {








   }

   location ~ /.well-known {
       allow all;
   }
}

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

Протестируйте и активируйте новую конфигурацию

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

sudo nginx -t
Outputnginx: 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.

Настройка Concourse для привязки к локальному интерфейсу обратной связи

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

Мы можем изменить это поведение, изменив веб-конфигурацию Concourse. Откройте файл конфигурации процесса + web +, который мы создали в + / etc / concourse / 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:

/ И т.д. / подвальный / web_environment

. . .
CONCOURSE_EXTERNAL_URL=://

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

Перезапустите процесс Concourse + web +, чтобы начать использовать новые настройки:

sudo systemctl restart concourse-web

Проверьте, что интерфейс Concourse + web + прослушивает только локальный петлевой интерфейс, набрав:

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

Приведенный выше вывод указывает, что процесс Concourse + web + прослушивает только локальный интерфейс.

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

sudo ufw delete allow 8080
secondary_label Output]
Rule deleted
Rule deleted (v6)

Теперь мы можем безопасно войти в веб-интерфейс.

Тестирование веб-интерфейса

В выбранном вами веб-браузере посетите доменное имя вашего сервера:

https://

Вы должны иметь доступ к начальной странице CI Concourse:

изображение: https: //assets.digitalocean.com/articles/concourseci_ssl_1604/initial_screen.png [начальный экран CI Concourse]

Если вы посмотрите в адресную строку вашего браузера, вы увидите некоторые признаки того, что вы подключаетесь к серверу интеграции через безопасное соединение:

изображение: https: //assets.digitalocean.com/articles/concourseci_ssl_1604/secure_indicator.png [защищенное соединение Concourse CI]

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

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

изображение: https: //assets.digitalocean.com/articles/concourseci_ssl_1604/select_main_team.png [Concourse CI select main team]

На следующей странице вам будет предложено ввести свои учетные данные.

После ввода учетных данных, которые вы настроили в файле + web_environment +, вы войдете в систему и вернетесь к стандартному интерфейсу заполнителя:

изображение: https: //assets.digitalocean.com/articles/concourseci_ssl_1604/placeholder_interface.png [Concourse CI select main team]

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

Заключение

В этом руководстве мы настроили Nginx в качестве безопасного обратного прокси-сервера для Concourse CI server. Nginx принимает защищенные соединения от клиентов и перенаправляет запросы на сервер Concourse. Concourse связывается с локальным интерфейсом обратной связи, поэтому удаленные клиенты не могут подключаться напрямую.

Теперь, когда вы можете безопасно связаться с сервером Concourse, вы можете приступить к созданию и управлению конвейерами, используя инструмент + fly + и веб-интерфейс. Вы можете следовать нашему следующему руководству, чтобы узнать https://www.digitalocean.com/community/tutorials/how-to-set-up-continuous-integration-pipelines-with-concourse-ci-on-ubuntu-16-04 [ как разрабатывать и внедрять конвейеры непрерывной интеграции], чтобы настроить автоматические процессы тестирования для вашего проекта. Возможно, вы также захотите проверить пример ushello world ”в документации Concourse.

Related