← Cloudflare One / cloudflare-one / tutorials
Zero Trust GitLab SSH & HTTP
С помощью Cloudflare Access можно добавить правила Zero Trust к локально размещённому экземпляру GitLab. В сочетании с Cloudflare Tunnel пользователи смогут подключаться по HTTP и SSH и проходить аутентификацию через поставщика идентификации вашей команды.
В этом пошаговом руководстве описано, как:
- Разверните экземпляр GitLab
- Заблокируйте все входящие подключения к этому экземпляру и используйте Cloudflare Tunnel для настройки исходящих подключений к Cloudflare
- Создание политик в Cloudflare Access, чтобы контролировать, кто может получить доступ к GitLab
- Подключитесь по HTTP и SSH через Cloudflare
Время выполнения:
1 час
Развёртывание GitLab
В этом разделе пошагово описано развертывание GitLab в DigitalOcean. Если вы уже развернули GitLab, этот раздел можно пропустить.
Создайте Droplet с 16 ГБ RAM и 6 CPU. Это должно обеспечить поддержку 500 пользователей, согласно Рекомендации по ресурсам для GitLab ↗.
GitLab предоставит внешний IP-адрес, доступный из интернета (пока что). Для первоначальной настройки вам потребуется подключиться к развёрнутому серверу, используя этот внешний IP-адрес. Защитить подключения к этому IP-адресу можно с помощью добавление ключей SSH ↗ в ваш аккаунт DigitalOcean.
В этом примере для настройки Droplet используется машина с macOS. Скопируйте IP-адрес, назначенный этой машине, из DigitalOcean.
Откройте Terminal и выполните следующую команду, заменив IP-адрес на адрес, назначенный DigitalOcean.
Далее установите 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 будет установлен.
Однако приложение еще не запущено. Убедиться в этом можно, проверив прослушиваемые порты с помощью ss.
sudo ss -lntupВ результате должны отображаться только службы, активные на данный момент на этом компьютере:
sudo ss -lntupNetid 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 reconfigureGitLab запустит свои компонентные службы. После завершения убедитесь, что GitLab запущен и прослушивает оба порта: 22 и 80.
sudo ss -lntupNetid 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 выглядит следующим образом:
Чтобы определить, кто может обращаться к приложению, Cloudflare Access использует интеграцию с поставщиками идентификации, такими как Okta, Microsoft Entra ID или Google: именно они выдают пропуска, которые проверяются на входе. VPN, в отличие от этого, предоставляет пользователям свободный доступ ко всей частной сети, если только кто-то отдельно не создаст правило, которое это ограничит, тогда как Access проверяет удостоверение при каждом запросе и с любой заданной детализацией.
Для GitLab начните с создания двух политик. Пользователи подключаются к GitLab двумя способами: через веб-приложение и по SSH. Создайте политики для защиты отдельного поддомена под каждый способ. Сначала веб-приложение.
Прежде чем создавать правило, вам нужно будет выполнить действия из эти инструкции чтобы настроить Cloudflare Access в вашем аккаунте.
После включения перейдите в Приложения странице в Zero Trust. Выберите Создать новое приложение.
Выберите Самостоятельный хостинг и конфиденциальность.
Вам будет предложено указать поддомен, который будет представлять этот ресурс. Это должен быть поддомен домена в вашем аккаунте 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.
Подключение к Cloudflare
Теперь GitLab можно подключить к Cloudflare с помощью Cloudflare Tunnel.
- Создайте новый Tunnel, выполнив следующую команду.
cloudflared tunnel create gitlabcloudflared сгенерирует уникальный ID для этого Tunnel, например 6ff42ae2-765d-4adf-8112-31c55c1551ef. Этот Tunnel можно использовать как для трафика SSH, так и для трафика HTTP.
- Вам нужно будет настроить Cloudflare Tunnel так, чтобы он проксировал трафик к обоим назначениям. Приведенная ниже конфигурация направляет трафик, предназначенный для DNS-записи веб-приложения, и трафик SSH, представленный отдельной DNS-записью, на нужный порт.
Для редактирования файла конфигурации используйте любой текстовый редактор на ваш выбор. В примере используется Vi.
vim ~/.cloudflared/config.yml- Настройте 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
- Правильность настройки файла конфигурации можно проверить следующей командой:
cloudflared tunnel ingress validatecloudflared должен показывать, что туннель работает нормально. Теперь вы можете запустить туннель.
cloudflared tunnel run
Настройте записи DNS
Теперь в панели управления Cloudflare можно создать DNS-записи для GitLab. Обратите внимание, что вам все равно понадобятся две записи: одна для веб-приложения и одна для SSH-трафика.
-
Войдите в Панель управления Cloudflare ↗ и перейдите в DNS-записи странице вашего домена.
Перейдите в Записи ↗ -
Выберите Add record. Выберите
CNAMEв качестве типа записи. -
В Название поле введите
gitlab. -
В Цель поле введите ID созданного Tunnel, а затем
cfargotunnel.com. В этом примере это значение:
6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com- Выберите Save.
- Повторите процесс, создав еще один
CNAMEзапись с тем же Цель, но введитеgitlab-sshдля Название. После этого должны появиться обе записи, указывающие на один и тот же Tunnel. Правила ingress, заданные в файле конфигурации выше, направят трафик на нужный порт.
Подключение к веб-приложению
Теперь можно проверить сквозную настройку веб-приложения. Перейдите на поддомен, созданный для веб-приложения. Cloudflare Access предложит вам пройти аутентификацию. Войдите через своего поставщика.
После аутентификации должно открыться веб-приложение GitLab.
Зарегистрируйте собственный аккаунт и создайте проект 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/democloudflared предложит вам войти через моего поставщика идентификации и после успешного входа выдаст токен вашему устройству, чтобы вы могли пройти аутентификацию.
Заблокируйте открытые порты
Теперь в брандмауэре 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.