Создание сертификата Let’s Encrypt для GitLab в Ubuntu 16.04

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

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

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

Данное руководство поможет настроить GitLab для поддержки SSL-сертификата Let’s Encrypt. Этот сертификат защитит исходящие соединения и конфиденциальные данные от злоумышленников.

Требования

  • Сервер Ubuntu 16.04.
  • Предварительно установленное приложение GitLab (руководство по установке можно найти здесь).
  • FQDN. Если у вас нет домена, вы не сможете получить сертификат Let’s Encrypt. Чтобы получить домен, обратитесь к регистратору доменных имен.
  • Запись А, направленная на IP-адрес сервера. С её помощью Let’s Encrypt проверит подлинность домена.

1:Установка клиента Let’s Encrypt

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

Клиент Let’s Encrypt был переименован в certbot, но в репозитории Ubuntu 16.04 он по-прежнему называется letsencrypt. Эта версия клиента подойдёт. Обновите индекс пакетов и установите letsencrypt:

sudo apt-get update
sudo apt-get install letsencrypt

После установки клиента Let’s Encrypt нужно подготовить сервер к проверке прав на домен.

2: Подготовка к проверке прав на домен

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

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

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

Для начала создайте фиктивный root-каталог:

sudo mkdir -p /var/www/letsencrypt

Затем настройте веб-сервер Nginx, встроенный в GitLab, для использования этого каталога. Откройте конфигурационный файл GitLab.

sudo nano /etc/gitlab/gitlab.rb

Добавьте в него строку, которая введёт пользовательскую директиву в конфигурационный файл Nginx. Найдите в файле раздел GitLab Nginx и добавьте в него такую строку:

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

После этого в каталоге .well-known, который находится в root-каталоге сервера, появится файл, с помощью которого Let’s Encrypt проверит право на домен.

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

Обновите настройки Nginx и GitLab:

sudo gitlab-ctl reconfigure

Сервер готов к проверке прав собственности на домен.

3: Запрос сертификата Let’s Encrypt

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

Версия Let’s Encrypt, которая находится в репозитории Ubuntu 16.04, требует использовать при этом три опции:

  1. задать аутентификатор (-a webroot),
  2. указать каталог document root (-w /var/www/letsencrypt),
  3. указать домен (-d your_domain).

sudo letsencrypt certonly -a webroot -w /var/www/letsencrypt -d your_domain

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

Enter email address (used for urgent notices and lost key recovery):
admin@example.com

Примите условия использования сервиса Let’s Encrypt; для этого нажмите Agree.

Если ЦС Let’s Encrypt смог подтвердить ваше право на домен, вы увидите:

IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to account@example.com.
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/gitlab.example.com/fullchain.pem. Your cert
will expire on 2016-11-28. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
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 Let's
Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, 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/your_domain:

sudo ls /etc/letsencrypt/live/your_domain
cert.pem  chain.pem  fullchain.pem  privkey.pem

Для настройки сертификата нужны пути к файлам fullchain.pem и privkey.pem.

4: Настройка GitLab для поддержки сертификата Let’s Encrypt

Теперь нужно настроить приложение GitLab для шифрования трафика через TLS/SSL.

Настройка GitLab

Откройте конфигурационный файл GitLab:

sudo nano /etc/gitlab/gitlab.rb

Найдите external_url; скорее всего, на данный момент эта строка содержит примерно такую ссылку:

http://your_domain

Замените http на https:

. . .
external_url 'https://your_domain'
. . .

Найдите раздел GitLab Nginx и добавьте в него следующие строки.

  • Строка nginx[‘redirect_http_to_https’] автоматически переадресует все запросы HTTP (порт 80) на HTTPS (порт 443).
  • Строка ssl_certificate задаёт путь к файлу fullchain.pem.
  • Строка ssl_certificate_key задаёт путь к файлу privkey.pem.

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

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

Настройка брандмауэра для поддержки трафика HTTPS

Теперь нужно открыть в брандмауэре порт 443.

sudo ufw allow https
Rule added
Rule added (v6)

Запросите состояние ufw, чтобы убедиться, что порт открыт.

sudo ufw status
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Теперь трафик HTTPS больше не блокируется.

Обновление настроек GitLab

Обновите настройки GitLab, чтобы включить поддержку SSL.

sudo gitlab-ctl reconfigure

Теперь GitLab принимает трафик HTTPS. Чтобы убедиться в этом, откройте домен сервера GitLab в браузере.

http://your_domain

Примечание: Укажите протокол HTTP, чтобы проверить автоматическую переадресацию на HTTPS.

Обратите внимание на адресную строку: браузер должен автоматически перенаправить трафик на HTTPS.

Теперь приложение GitLab защищено шифрованием TLS/SSL.

5: Автоматическое обновление сертификата Let’s Encrypt

TLS/SSL-сертификаты Let’s Encrypt действительны в течение 90 дней. Чтобы успеть обновить сертификат до истечения срока его действия, настройте автоматическое обновление сертификатов.

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

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

Откройте crontab:

sudo crontab -e

По запросу выберите текстовый редактор.

На экране появится текстовый файл с текущей таблицей crontab. Добавьте в конец файла:

. . .
0 */12 * * * /usr/bin/letsencrypt renew >> /var/log/le-renew.log
5 */12 * * * /usr/bin/gitlab-ctl restart nginx

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

Теперь клиент Let’s Encrypt будет проверять сертификаты каждые 12 часов. Результаты проверки можно просмотреть в каталоге /var/log/le-renew.log.

На обновление сертификата может уйти несколько минут. После этого перезапустите процесс Nginx с помощью команды gitlab-ctl.

Заключение

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

Tags: , , , , ,

Добавить комментарий