INTEGRITY Документация

Zero Trust GitLab SSH & HTTP

С помощью Cloudflare Access можно добавить правила Zero Trust к локально размещённому экземпляру GitLab. В сочетании с Cloudflare Tunnel пользователи смогут подключаться по HTTP и SSH и проходить аутентификацию через поставщика идентификации вашей команды.

В этом пошаговом руководстве описано, как:

Время выполнения:

1 час


Развёртывание GitLab

В этом разделе пошагово описано развертывание GitLab в DigitalOcean. Если вы уже развернули GitLab, этот раздел можно пропустить.

Создайте Droplet с 16 ГБ RAM и 6 CPU. Это должно обеспечить поддержку 500 пользователей, согласно Рекомендации по ресурсам для GitLab.

Create Droplet

GitLab предоставит внешний IP-адрес, доступный из интернета (пока что). Для первоначальной настройки вам потребуется подключиться к развёрнутому серверу, используя этот внешний IP-адрес. Защитить подключения к этому IP-адресу можно с помощью добавление ключей SSH в ваш аккаунт DigitalOcean.

В этом примере для настройки Droplet используется машина с macOS. Скопируйте IP-адрес, назначенный этой машине, из DigitalOcean.

IP-адрес устройства

Откройте Terminal и выполните следующую команду, заменив IP-адрес на адрес, назначенный DigitalOcean.

ssh [email protected]

Далее установите GitLab. В этом примере используется Ubuntu package и действия из документации GitLab, за некоторыми исключениями, указанными ниже.

Чтобы начать, выполните следующие команды.

sudo apt-get update

sudo apt-get install -y curl openssh-server ca-certificates
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

Приведённые выше команды загружают программное обеспечение GitLab на эту машину. Теперь его нужно установить. Именно на этом этапе инструкция впервые отступает от действий, описанных в документации GitLab: следующий шаг в руководстве GitLab предполагает настройку внешнего имени хоста, но здесь достаточно просто установить программное обеспечение.

sudo apt-get install gitlab-ee

Приблизительно через минуту GitLab будет установлен.

Установите GitLab

Однако приложение еще не запущено. Убедиться в этом можно, проверив прослушиваемые порты с помощью ss.

sudo ss -lntup

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

sudo ss -lntup
Netid   State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port   Process
udp     UNCONN   0        0                      *:9094                *:*
tcp     LISTEN   0        128              0.0.0.0:22            0.0.0.0:*       users:(("sshd",pid=29,fd=3))
tcp     LISTEN   0        128                 [::]:22               [::]:*       users:(("sshd",pid=29,fd=4))

Чтобы запустить GitLab, выполните команду reconfigure этой программы.

sudo gitlab-ctl reconfigure

GitLab запустит свои компонентные службы. После завершения убедитесь, что GitLab запущен и прослушивает оба порта: 22 и 80.

GitLab Services
sudo ss -lntup
Netid   State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port   Process
udp     UNCONN   0        0                      *:9094                *:*
tcp     LISTEN   0        4096           127.0.0.1:9236          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:8150          0.0.0.0:*
tcp     LISTEN   0        128              0.0.0.0:22            0.0.0.0:*       users:(("sshd",pid=29,fd=3))
tcp     LISTEN   0        4096           127.0.0.1:8151          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:3000          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:8153          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:8154          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:8155          0.0.0.0:*
tcp     LISTEN   0        511              0.0.0.0:8060          0.0.0.0:*       users:(("nginx",pid=324,fd=8))
tcp     LISTEN   0        4096           127.0.0.1:9121          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:9090          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:9187          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:9093          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:9229          0.0.0.0:*
tcp     LISTEN   0        1024           127.0.0.1:8080          0.0.0.0:*
tcp     LISTEN   0        511              0.0.0.0:80            0.0.0.0:*       users:(("nginx",pid=324,fd=7))
tcp     LISTEN   0        4096           127.0.0.1:9168          0.0.0.0:*
tcp     LISTEN   0        4096           127.0.0.1:8082          0.0.0.0:*
tcp     LISTEN   0        128                 [::]:22               [::]:*       users:(("sshd",pid=29,fd=4))
tcp     LISTEN   0        4096                   *:9094                *:*

Пользователи подключаются к GitLab по SSH (здесь порт 22) и по HTTP для веб-приложения (порт 80). На следующем шаге вы дадите пользователям возможность опробовать оба варианта через Cloudflare Access. Оставлю это работать и перейду в панель управления Cloudflare.

Защита GitLab с помощью правил Zero Trust

Создание политик Zero Trust

С помощью Cloudflare Access можно создавать правила Zero Trust, определяющие, кто может подключаться как к веб-приложению GitLab (HTTP), так и по SSH.

Когда пользователь отправляет запрос к сайту, защищённому Access, этот запрос сначала попадает в сеть Cloudflare. После этого Access может проверить, разрешён ли пользователю доступ к приложению. При интеграции с Cloudflare Tunnel архитектура Zero Trust выглядит следующим образом:

GitLab Services

Чтобы определить, кто может обращаться к приложению, Cloudflare Access использует интеграцию с поставщиками идентификации, такими как Okta, Microsoft Entra ID или Google: именно они выдают пропуска, которые проверяются на входе. VPN, в отличие от этого, предоставляет пользователям свободный доступ ко всей частной сети, если только кто-то отдельно не создаст правило, которое это ограничит, тогда как Access проверяет удостоверение при каждом запросе и с любой заданной детализацией.

Для GitLab начните с создания двух политик. Пользователи подключаются к GitLab двумя способами: через веб-приложение и по SSH. Создайте политики для защиты отдельного поддомена под каждый способ. Сначала веб-приложение.

Прежде чем создавать правило, вам нужно будет выполнить действия из эти инструкции чтобы настроить Cloudflare Access в вашем аккаунте.

После включения перейдите в Приложения странице в Zero Trust. Выберите Создать новое приложение.

Выберите Самостоятельный хостинг и конфиденциальность.

Self Hosted

Вам будет предложено указать поддомен, который будет представлять этот ресурс. Это должен быть поддомен домена в вашем аккаунте Cloudflare. Для веб-приложения и для SSH-подключения потребуются разные поддомены.

В этом примере используется gitlab.widgetcorp.tech для веб-приложения и gitlab-ssh.widgetcorp.tech для подключения по SSH.

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

Выберите Создание и опубликуйте приложение. Повторите эти шаги для второго приложения, gitlab-ssh.widgetcorp.tech.

Cloudflare Tunnel

Cloudflare Tunnel создаёт защищённое исходящее соединение между этим компьютером и сетью Cloudflare. Благодаря модели с исключительно исходящими соединениями можно предотвратить любой прямой доступ к этому компьютеру и закрыть все внешне открытые точки входа. В результате не остаётся ни одного открытого порта межсетевого экрана.

Работа Cloudflare Tunnel обеспечивается легковесным демоном от Cloudflare под названием cloudflared. Загрузите и установите cloudflared на машине DigitalOcean, следуя инструкциям, указанным на Загрузки страницу.

После установки пройдите аутентификацию для экземпляра cloudflared следующей командой.

cloudflared login

Команда выведет URL-адрес, который вам нужно открыть, чтобы войти в свою учётную запись Cloudflare.

Выберите веб-сайт, который вы добавили в свой аккаунт.

После выбора одного из сайтов аккаунта Cloudflare загрузит файл сертификата для аутентификации этого экземпляра cloudflared. Теперь вы можете использовать cloudflared чтобы управлять подключениями Cloudflare Tunnel в своём аккаунте Cloudflare.

Скачать Cert

Подключение к Cloudflare

Теперь GitLab можно подключить к Cloudflare с помощью Cloudflare Tunnel.

  1. Создайте новый Tunnel, выполнив следующую команду.
cloudflared tunnel create gitlab

cloudflared сгенерирует уникальный ID для этого Tunnel, например 6ff42ae2-765d-4adf-8112-31c55c1551ef. Этот Tunnel можно использовать как для трафика SSH, так и для трафика HTTP.

  1. Вам нужно будет настроить Cloudflare Tunnel так, чтобы он проксировал трафик к обоим назначениям. Приведенная ниже конфигурация направляет трафик, предназначенный для DNS-записи веб-приложения, и трафик SSH, представленный отдельной DNS-записью, на нужный порт.

Для редактирования файла конфигурации используйте любой текстовый редактор на ваш выбор. В примере используется Vi.

vim ~/.cloudflared/config.yml
  1. Настройте Tunnel для обслуживания трафика.
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json

ingress:
  - hostname: gitlab.widgetcorp.tech
    service: http://localhost:80
  - hostname: gitlab-ssh.widgetcorp.tech
    service: ssh://localhost:22
  # Catch-all rule, which just responds with 404 if traffic doesn't match any of
  # the earlier rules
  - service: http_status:404
Self Hosted
  1. Правильность настройки файла конфигурации можно проверить следующей командой:
cloudflared tunnel ingress validate

cloudflared должен показывать, что туннель работает нормально. Теперь вы можете запустить туннель.

cloudflared tunnel run
Tunnel Run

Настройте записи DNS

Теперь в панели управления Cloudflare можно создать DNS-записи для GitLab. Обратите внимание, что вам все равно понадобятся две записи: одна для веб-приложения и одна для SSH-трафика.

  1. Войдите в Панель управления Cloudflare и перейдите в DNS-записи странице вашего домена.

    Перейдите в Записи ↗
  2. Выберите Add record. Выберите CNAME в качестве типа записи.

  3. В Название поле введите gitlab.

  4. В Цель поле введите ID созданного Tunnel, а затем cfargotunnel.com. В этом примере это значение:

6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com
  1. Выберите Save.
  2. Повторите процесс, создав еще один CNAME запись с тем же Цель, но введите gitlab-ssh для Название. После этого должны появиться обе записи, указывающие на один и тот же Tunnel. Правила ingress, заданные в файле конфигурации выше, направят трафик на нужный порт.
Просмотр DNS

Подключение к веб-приложению

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

После аутентификации должно открыться веб-приложение GitLab.

GitLab Web

Зарегистрируйте собственный аккаунт и создайте проект Blank, чтобы протестировать SSH на следующем шаге.

Пустой проект

GitLab создаст новый проект и репозиторий.

Настройка SSH

Чтобы отправлять и получать код по SSH, вам потребуется установить cloudflared также на клиентской машине. В этом примере используется ноутбук с macOS. На macOS вы можете установить cloudflared следующей командой.

brew install cloudflared

Хотя вам необходимо установить cloudflared, вам не нужно каким-либо особым образом оборачивать SSH-команды. Вместо этого потребуется один раз внести изменение в файл конфигурации SSH.

vim /Users/samrhea/.ssh/config

Введите следующие значения, заменив gitlab-ssh.widgetcorp.tech с именем хоста, которое вы создали.

Host gitlab-ssh.widgetcorp.tech
  ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h

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

git clone [email protected]:samrhea/demo

cloudflared предложит вам войти через моего поставщика идентификации и после успешного входа выдаст токен вашему устройству, чтобы вы могли пройти аутентификацию.

GitLab Clone

Заблокируйте открытые порты

Теперь в брандмауэре DigitalOcean можно настроить одно единственное правило, блокирующее весь входящий трафик, чтобы исключить прямой доступ.

Настройте правила

Cloudflare Tunnel продолжит поддерживать только исходящие соединения, поэтому этот компьютер не окажется вовлечён в майнинг криптовалюты или что-то похуже.

Просмотр логов

Вы также можете просматривать журналы событий, которые были разрешены и заблокированы. Откройте Access странице раздела Logs раздел в Zero Trust.

Устранение неполадок

Если вы используете Git Large File Storage (LFS), учтите, что Git LFS не поддерживается автоматически cloudflared. Чтобы получить доступ к репозиториям, защищенным Cloudflare Access, необходимо выполнить аутентификацию вручную, запустив:

cloudflared access login <your-git-access-url>

Замените <your-git-access-url> с URL-адресом, защищённым Cloudflare Access.