INTEGRITY Dokumentace

Zero Trust GitLab SSH & HTTP

Pomocí Cloudflare Access můžete přidat pravidla Zero Trust k vlastní instanci GitLab. V kombinaci s Cloudflare Tunnel se tak uživatelé mohou připojovat přes HTTP i SSH a ověřovat se u poskytovatele identity vašeho týmu.

Tento postup popisuje, jak:

Doba dokončení:

1 hodina


Nasazení GitLab

Tato část vás provede nasazením GitLabu na DigitalOcean. Pokud jste GitLab už nasadili, tuto část můžete přeskočit.

Vytvořte Droplet se 16 GB RAM a 6 CPU. To by mělo umožnit podporu 500 uživatelů na základě Doporučené nároky GitLabu na zdroje.

Create Droplet

GitLab poskytne externí IP adresu, která je prozatím vystavena internetu. Pro počáteční konfiguraci se budete muset k nasazenému serveru připojit pomocí této externí IP adresy. Připojení k této IP adrese můžete zabezpečit pomocí přidávání klíčů SSH do vašeho účtu DigitalOcean.

Tento příklad používá počítač s macOS ke konfiguraci Droplet. Zkopírujte IP adresu přiřazenou počítači z DigitalOcean.

IP adresa zařízení

Otevřete Terminal a spusťte následující příkaz, přičemž IP adresu nahraďte IP adresou přidělenou službou DigitalOcean.

ssh [email protected]

Dále nainstalujte GitLab. Tento příklad používá Balíček Ubuntu a postupujte podle kroků v dokumentaci GitLab, s několika výjimkami uvedenými níže.

Pro začátek spusťte následující příkazy.

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

Výše uvedené příkazy stáhnou software GitLab do tohoto počítače. Nyní jej musíte nainstalovat. Zde se tento návod poprvé odchyluje od postupu popsaného v dokumentaci GitLabu. Další krok v návodu od GitLabu nastavuje externí název hostitele, vy ale software rovnou nainstalujete.

sudo apt-get install gitlab-ee

Přibližně po minutě bude GitLab nainstalován.

Instalace GitLab

Aplikace však ještě neběží. To můžete ověřit kontrolou naslouchajících portů pomocí ss.

sudo ss -lntup

Výsledkem by měly být pouze služby, které jsou na počítači aktuálně aktivní:

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))

Chcete-li spustit GitLab, spusťte příkaz reconfigure tohoto softwaru.

sudo gitlab-ctl reconfigure

GitLab spustí své komponentní služby. Po dokončení ověřte, že GitLab běží a naslouchá na portech 22 i 80.

Služby GitLab
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                *:*

Uživatelé se ke GitLabu připojují přes SSH (zde port 22) a k webové aplikaci přes HTTP (port 80). V dalším kroku umožníte uživatelům vyzkoušet obojí přes Cloudflare Access. Necháme to běžet a přejdeme do Cloudflare dashboardu.

Zabezpečení GitLabu pomocí pravidel Zero Trust

Sestavování zásad Zero Trust

Pomocí Cloudflare Access můžete vytvořit pravidla Zero Trust, která určují, kdo se může připojit k webové aplikaci GitLab (HTTP) a kdo přes SSH.

Když uživatel odešle požadavek na web chráněný Access, tento požadavek nejprve dorazí do sítě Cloudflare. Access pak může zkontrolovat, zda má uživatel k aplikaci povolený přístup. Při integraci s Cloudflare Tunnel vypadá architektura Zero Trust takto:

Služby GitLab

Cloudflare Access zjišťuje, kdo se k aplikaci může dostat, prostřednictvím integrace s poskytovateli identity, jako je Okta, Microsoft Entra ID nebo Google, kteří vydávají identifikační karty kontrolované u dveří. Zatímco VPN umožňuje uživatelům volný pohyb po privátní síti, dokud proti tomu někdo aktivně nezasáhne pravidlem, Access provádí kontrolu identity při každém požadavku, a to s libovolnou nakonfigurovanou granularitou.

U GitLabu začněte vytvořením dvou zásad. Uživatelé se ke GitLabu připojují dvěma způsoby: přes webovou aplikaci a přes SSH. Pro každý z nich vytvořte zásadu zabezpečující příslušnou subdoménu. Nejprve webovou aplikaci.

Než pravidlo vytvoříte, musíte postupovat podle tyto pokyny k nastavení Cloudflare Access ve vašem účtu.

Po povolení přejděte do Aplikace na stránce v Zero Trust. Vyberte Vytvořit novou aplikaci.

Vyberte Vlastní hosting a soukromé.

Self Hosted

Zobrazí se výzva k přidání subdomény, která bude zdroj reprezentovat. Musí jít o subdoménu domény ve vašem účtu Cloudflare. Pro tok webové aplikace a tok SSH budete potřebovat samostatné subdomény.

Tento příklad používá gitlab.widgetcorp.tech pro webovou aplikaci a gitlab-ssh.widgetcorp.tech pro připojení SSH.

Můžete rozhodnout, kteří poskytovatelé identity budou moci provádět ověřování. Ve výchozím nastavení jsou povoleni všichni nakonfigurovaní poskytovatelé. Přidejte pravidla, která určí, kdo se na stránku dostane.

Vyberte Vytvořit a publikovat aplikaci. Tyto kroky zopakujte pro druhou aplikaci, gitlab-ssh.widgetcorp.tech.

Cloudflare Tunnel

Cloudflare Tunnel vytváří zabezpečené odchozí spojení mezi tímto počítačem a sítí Cloudflare. Díky modelu pouze odchozích spojení můžete zamezit jakémukoli přímému přístupu k tomuto počítači a uzavřít veškeré externě vystavené vstupní body. Výsledkem jsou žádné otevřené porty firewallu.

Cloudflare Tunnel funguje díky odlehčenému daemonu od Cloudflare s názvem cloudflared. Stáhněte a nainstalujte cloudflared na počítači DigitalOcean podle pokynů uvedených na Ke stažení stránce.

Po instalaci ověřte instanci cloudflared s následujícím příkazem.

cloudflared login

Příkaz vypíše adresu URL, kterou musíte navštívit a přihlásit se pomocí svého účtu Cloudflare.

Zvolte web, který jste přidali do svého účtu.

Jakmile ve svém účtu vyberete jednu z poboček, Cloudflare stáhne soubor certifikátu k ověření této instance cloudflared. Nyní můžete použít cloudflared řídit připojení Cloudflare Tunnel ve vašem účtu Cloudflare.

Download Cert

Připojování ke Cloudflare

Nyní můžete připojit GitLab ke Cloudflare pomocí Cloudflare Tunnel.

  1. Vytvořte nový Tunnel spuštěním následujícího příkazu.
cloudflared tunnel create gitlab

cloudflared vygeneruje jedinečné ID pro tento Tunnel, například 6ff42ae2-765d-4adf-8112-31c55c1551ef. Tento Tunnel můžete použít jak pro provoz SSH, tak HTTP.

  1. Budete muset nakonfigurovat Cloudflare Tunnel tak, aby proxoval provoz do obou cílů. Níže uvedená konfigurace zachytí provoz směřující na DNS záznam vytvořený pro webovou aplikaci a na DNS záznam reprezentující provoz SSH na příslušný port.

Konfigurační soubor upravujete v textovém editoru dle vlastního výběru. Příklad vychází z Vi.

vim ~/.cloudflared/config.yml
  1. Nakonfigurujte Tunnel tak, aby obsluhoval provoz.
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. Správnost nastavení konfiguračního souboru můžete ověřit následujícím příkazem:
cloudflared tunnel ingress validate

cloudflared by měl ukazovat, že Tunnel je v pořádku. Nyní můžete Tunnel spustit.

cloudflared tunnel run
Tunnel Run

Nakonfigurujte záznamy DNS

Nyní můžete v Cloudflare dashboardu vytvořit DNS záznamy pro GitLab. Nezapomeňte, že stále potřebujete dva záznamy: jeden pro webovou aplikaci a jeden pro provoz SSH.

  1. Přihlaste se do Cloudflare dashboard a přejděte do DNS záznamy stránku vaší domény.

    Přejděte na Záznamy ↗
  2. Vyberte Přidat záznam. Vyberte CNAME jako typ záznamu.

  3. V Název pole zadejte gitlab.

  4. V Cíl pole zadejte ID vytvořeného tunelu následované cfargotunnel.com. V tomto příkladu je tato hodnota:

6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com
  1. Vyberte Save.
  2. Opakujte tento postup a vytvořte další CNAME záznam se stejným Cíl, ale zadejte gitlab-ssh pro Název. Poté by se měly zobrazit oba záznamy, které míří na stejný Tunnel. Ingress pravidla definovaná ve výše uvedeném konfiguračním souboru nasměrují provoz na příslušný port.
Zobrazit DNS

Připojování k webové aplikaci

Nyní můžete otestovat kompletní konfiguraci webové aplikace. Otevřete subdoménu vytvořenou pro tuto webovou aplikaci. Cloudflare Access vás vyzve k ověření. Přihlaste se u svého poskytovatele.

Po ověření byste měli vidět webovou aplikaci GitLab.

Web GitLab

Zaregistrujte si vlastní účet a v dalším kroku vytvořte projekt Blank pro otestování SSH.

Blank Project

GitLab vytvoří nový projekt a repozitář.

Konfigurace SSH

Chcete-li odesílat a stahovat kód přes SSH, budete muset nainstalovat cloudflared i na klientském počítači. Tento příklad používá notebook s macOS. Na macOS můžete nainstalovat cloudflared s následujícím příkazem.

brew install cloudflared

Zatímco je nutné nainstalovat cloudflared, nemusíte příkazy SSH nijak zvlášť zabalovat. Místo toho stačí provést jednorázovou změnu konfiguračního souboru SSH.

vim /Users/samrhea/.ssh/config

Zadejte následující hodnoty a nahraďte gitlab-ssh.widgetcorp.tech s hostname, který jste vytvořili.

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

Nyní můžete otestovat tok SSH tím, že se pokusíte naklonovat dříve vytvořený projekt.

git clone [email protected]:samrhea/demo

cloudflared vás vyzve k přihlášení pomocí mého poskytovatele identity a po úspěšném ověření vydá token vašemu zařízení, abyste se mohli ověřit.

Klonování GitLab

Zablokujte odkryté porty

Nyní můžete nakonfigurovat firewall DigitalOcean jediným pravidlem, které zablokuje veškerý příchozí provoz a zabrání přímému přístupu.

Nastavit pravidla

Cloudflare Tunnel bude i nadále provozovat pouze odchozí spojení, takže se tento počítač nemůže stát součástí těžby kryptoměn ani něčeho horšího.

Zobrazit protokoly

Můžete také zobrazit protokoly povolených a blokovaných událostí. Otevřete Access stránka Logs sekci v Zero Trust.

Řešení potíží

Pokud používáte Git Large File Storage (LFS), mějte na paměti, že Git LFS není automaticky podporován cloudflared. Chcete-li přistupovat k repozitářům chráněným Cloudflare Access, musíte se ověřit ručně spuštěním:

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

Nahraďte <your-git-access-url> s adresou URL chráněnou Cloudflare Access.