Как обезопасить GitLab с Let’s Encrypt в Ubuntu 16.04

Вступление

GitLab, в частности GitLab CE (Community Edition), представляет собой приложение с открытым исходным кодом, в основном используемое для размещения репозиториев Git, с дополнительными функциями, связанными с разработкой, такими как отслеживание проблем. Проект GitLab позволяет относительно просто настроить экземпляр GitLab на собственном оборудовании с помощью простого механизма установки.

По умолчанию GitLab обслуживает страницы по обычному незашифрованному HTTP. Как и любое веб-приложение, которое обрабатывает конфиденциальную информацию, такую ​​как учетные данные для входа, GitLab должен быть настроен на обслуживание страниц через TLS / SSL для шифрования данных при передаче. Это очень важно с GitLab, так как кодовая база вашего проекта может быть изменена кем-то, способным перехватить ваши учетные данные для входа.

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

В этом руководстве мы продемонстрируем, как настроить экземпляр GitLab, установленный в Ubuntu 16.04, для использования доверенного сертификата SSL, полученного из Let Encrypt. Это защитит всю исходящую связь с пользователями и обеспечит защиту паролей, кода и любых других сообщений от прочтения или подмены сторонними лицами.

Предпосылки

Чтобы завершить это руководство, вам потребуется установить экземпляр GitLab на сервере Ubuntu 16.04. Мы предполагаем, что вы следовали нашему https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-gitlab-on-ubuntu-16-04 способ установки и настройки GitLab в Ubuntu. 16.04] руководство по настройке.

Чтобы получить сертификат от Let’s Encrypt, ваш сервер должен быть настроен с полным доменным именем (FQDN). Если у вас еще нет зарегистрированного доменного имени, вы можете зарегистрировать его у одного из множества регистраторов доменных имен (например, Namecheap, GoDaddy и т. Д.).

Если вы этого еще не сделали, обязательно создайте * A Record *, который указывает ваш домен на публичный IP-адрес вашего сервера. Это необходимо из-за того, что Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого выдается сертификат. Например, если вы хотите получить сертификат для + gitlab.example.com +, этот домен должен разрешиться на ваш сервер, чтобы процесс проверки заработал. Вам понадобится реальный домен с действительными записями DNS, указывающими на ваш сервер, чтобы успешно выполнить это руководство.

Установите Certbot, клиент Let Encrypt

Прежде чем мы сможем получить SSL-сертификат для нашей установки GitLab, нам нужно будет загрузить и установить Certbot, официальный клиент Let Encrypt.

Разработчики Certbot поддерживают свой собственный репозиторий программного обеспечения Ubuntu с последними версиями программного обеспечения. Поскольку Certbot находится в такой активной разработке, стоит использовать этот репозиторий для установки более нового Certbot, чем предусмотрено Ubuntu.

Сначала добавьте репозиторий:

sudo add-apt-repository ppa:certbot/certbot

Вам нужно нажать + ENTER, чтобы принять. После этого обновите список пакетов, чтобы получить информацию о пакете нового репозитория:

sudo apt-get update

И наконец, установите Certbot с помощью + apt-get:

sudo apt-get install certbot

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

Подготовка к проверке корневого домена Let Encrypt

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

GitLab содержит веб-сервер Nginx с внутренним управлением для обслуживания самого приложения. Это делает установку довольно автономной, но добавляет дополнительный уровень сложности при попытке изменить сам веб-сервер.

Поскольку встроенный Nginx в настоящее время используется для обслуживания самого GitLab, лучшим методом проверки домена является метод веб-корня. Certbot будет использовать существующий веб-сервер для обслуживания известного файла с сервера через порт 80. Это доказывает центру сертификации, что лицо, запрашивающее сертификат, имеет административный контроль над веб-сервером, что фактически подтверждает право собственности на сервер и домен.

Чтобы настроить валидацию корневого веб-домена для GitLab, нашим первым шагом будет создание фиктивного корневого документа:

sudo mkdir -p /var/www/letsencrypt

Это не будет использоваться обычными операциями Nginx, но будет использоваться Certbot для проверки домена.

Далее нам нужно настроить конфигурацию GginLab Nginx, чтобы использовать этот каталог. Откройте основной файл конфигурации GitLab, набрав:

sudo nano /etc/gitlab/gitlab.rb

Внутри нам нужно добавить строку, которая будет вставлять пользовательскую директиву в файл конфигурации GginLab Nginx. Вероятно, лучше прокрутить вниз до раздела * GitLab Nginx * файла, но строку можно разместить где угодно.

Вставьте следующую строку:

/etc/gitlab/gitlab.rb

. . .
nginx['custom_gitlab_server_config'] = "location ^~ /.well-known { root /var/www/letsencrypt; }"
. . .

Метод веб-проверки Let Encrypt root помещает файл в каталог «+ .well-known » в корне документа, чтобы центр сертификации мог его проверить. Эта строка сообщает Nginx об отправке запросов на ` /. Well-known +` из корня сети, который мы создали минуту назад.

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

Затем, примените изменения в конфигурации Nginx GitLab, повторно настроив приложение:

sudo gitlab-ctl reconfigure

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

Запросить сертификат с Certbot

Теперь, когда экземпляр GginLab Nginx сконфигурирован с необходимым блоком местоположения, мы можем использовать Certbot для проверки нашего доменного имени и запроса сертификата.

Поскольку нам нужен только сертификат и мы не хотим автоматически настраивать веб-сервер, мы будем использовать подкоманду + certonly. Укажем три варианта. Нам нужно выбрать аутентификатор веб-корня (+ - webroot +), передать корень документа (+ - webroot-path = / var / www / letsencrypt +) и использовать команду + -d + для передачи наше доменное имя:

sudo certbot certonly --webroot --webroot-path=/var/www/letsencrypt -d

Вам будет предложено указать адрес электронной почты. Важно указать действующий адрес электронной почты, так как это единственный способ надежно получать электронные письма об истечении срока действия сертификата и другой важной информации. Вам также будет предложено принять условия обслуживания Let’s Encrypt.

Когда вы закончите, Let’s Encrypt должен выдать вам сертификат для домена, если он смог правильно подтвердить право собственности. Вы должны увидеть вывод, который выглядит примерно так:

OutputIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /etc/letsencrypt/live/gitlab.example.com/fullchain.pem. Your cert
  will expire on 2017-07-26. To obtain a new or tweaked version of
  this certificate in the future, simply run certbot again. To
  non-interactively renew *all* of your certificates, run "certbot
  renew"
- If you lose your account credentials, you can recover through
  e-mails sent to [email protected].
- Your account credentials have been saved in your Certbot
  configuration directory at /etc/letsencrypt. You should make a
  secure backup of this folder now. This configuration directory will
  also contain certificates and private keys obtained by Certbot so
  making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

  Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
  Donating to EFF:                    https://eff.org/donate-le

Вы можете найти все сертификаты и ключи, которые были созданы, просмотрев каталог + / etc / letsencrypt / live / + с привилегиями + sudo +:

sudo ls /etc/letsencrypt/live/
Outputcert.pem  chain.pem  fullchain.pem  privkey.pem

Для нашей конфигурации нам нужно знать только полный путь к файлам + fullchain.pem + и + privkey.pem +.

Настройте GitLab для использования сертификатов Let’s Encrypt

Теперь, когда мы получили доверенные сертификаты от Let’s Encrypt, мы можем настроить GitLab на использование TLS / SSL для всего своего трафика.

Изменить конфигурацию GitLab

Начните с открытия файла конфигурации GitLab снова:

sudo nano /etc/gitlab/gitlab.rb

Вверху измените + external_url +. В настоящее время он, вероятно, указывает на + http: // +. Нам просто нужно изменить + http на` + https`:

/etc/gitlab/gitlab.rb

. . .
external_url 'http://'
. . .

Затем прокрутите вниз до раздела * GitLab Nginx *. Раскомментируйте и измените или просто добавьте следующие строки.

Строка перенаправления указывает Nginx автоматически перенаправлять запросы, сделанные на порт HTTP 80, на порт 443 HTTPS. Строка + ssl_certificate + должна указывать полный путь к файлу + fullchain.pem +, а строка + ssl_certificate_key + должна указывать полный путь к файлу + privkey.pem +:

/etc/gitlab/gitlab.rb

. . .
nginx['redirect_http_to_https'] =
. . .
nginx['ssl_certificate'] = "/etc/letsencrypt/live//fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live//privkey.pem"
. . .

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

Разрешить HTTPS-трафик через брандмауэр

Затем, перед перезагрузкой конфигурации GginLab Nginx, убедитесь, что HTTPS-трафик разрешен через брандмауэр вашего сервера. Для этого вы можете открыть порт 443, набрав:

sudo ufw allow https
OutputRule added
Rule added (v6)

Убедитесь, что порт 443 открыт, набрав:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere

OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)

Как видите, порт 443 теперь открыт.

Переконфигурируйте GitLab, чтобы включить SSL

Теперь заново настройте GitLab для реализации ваших изменений:

sudo gitlab-ctl reconfigure

Теперь ваш экземпляр GitLab должен быть доступен через HTTPS с использованием вашего доверенного сертификата Let Encrypt. Вы можете проверить это, посетив доменное имя вашего сервера GitLab. Поскольку мы перенаправляем HTTP на HTTPS, это должно работать без явного указания протокола:

http://

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

изображение: https: //assets.digitalocean.com/articles/gitlab_lets_encrypt_1604/https_connection_verification.png [подтверждение GitLab SSL]

Ваша установка GitLab теперь защищена сертификатом TLS / SSL.

Проверка Certbot Auto-Renewal

Сертификаты Let’s Encrypt действительны только в течение девяноста дней. Это должно стимулировать пользователей автоматизировать процесс обновления их сертификатов. Пакет «+ certbot », который мы установили, позаботится об этом, выполняя «certbot renew» дважды в день через системный таймер. В несистемных дистрибутивах эта функциональность обеспечивается скриптом, помещенным в ` / etc / cron.d +`. Эта задача выполняется два раза в день и обновляет любой сертификат, срок действия которого истекает в течение тридцати дней.

Чтобы проверить процесс обновления, вы можете выполнить пробный прогон с помощью + certbot +:

sudo certbot renew --dry-run

Если вы не видите ошибок, все готово. При необходимости Certbot обновит ваши сертификаты и перезагрузит Nginx, чтобы получить изменения. Если процесс автоматического продления не удастся, Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты, предупреждая вас, когда ваш сертификат скоро истечет.

Заключение

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

Теперь, когда ваш экземпляр GitLab защищен, его можно безопасно использовать для управления проектами, размещения репозиториев кода и настройки непрерывной интеграции. Вы можете узнать об использовании GitLab для автоматического тестирования каждого коммита в вашем репозитории в нашей статье на https://www.digitalocean.com/community/tutorials/how-to-set-up-continuous-integration-pipelines-with-gitlab- ci-on-ubuntu-16-04 [настройка конвейеров непрерывной интеграции с GitLab CI].

Related