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, требует использовать при этом три опции:
- задать аутентификатор (-a webroot),
- указать каталог document root (-w /var/www/letsencrypt),
- указать домен (-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. Теперь вы можете использовать его для управления проектами, размещения кода, настройки непрерывной интеграции и т.д.