INTEGRITY Dokumentace

MongoDB SSH

Pomocí Cloudflare Access a Cloudflare Tunnel můžete vytvořit pravidla Zero Trust pro zabezpečení připojení k nasazením MongoDB. Cloudflare Tunnel vyžaduje odlehčený démon, cloudflared, běží souběžně s nasazením a také na straně klienta.

V tomto tutoriálu klient se spuštěným cloudflared se připojuje přes SSH k nasazení MongoDB běžícímu na Kubernetes. Příklad nasazení je strukturován tak, aby připojoval Compass k instanci MongoDB. Nasazení MongoDB v Kubernetes spouští jak databázovou službu MongoDB, tak cloudflared jako ingress službu, která funguje jako jump host.

Tento návod se zabývá tím, jak:

Doba dokončení:

50 minut


Nakonfigurujte Cloudflare Access

V Cloudflare Access můžete vytvořit pravidlo, které určí, kdo se může připojit k vašemu nasazení MongoDB. Pravidla Cloudflare Access se vytvářejí kolem hostname; i když bude toto nasazení přístupné přes SSH, bude daný prostředek v Cloudflare reprezentován jako hostname. Pokud máte například web app.com ve vašem účtu Cloudflare můžete vytvořit pravidlo pro zabezpečení mongodb.app.com.

  1. V Cloudflare dashboard, přejděte na Zero Trust > Řízení přístupu > Aplikace.

  2. Vyberte Vytvořit novou aplikaci.

  3. Vyberte Vlastní hosting a soukromé.

  4. Vyberte Přidejte veřejný hostname a zadejte subdoménu, na které se uživatelé připojí k vašemu nasazení (například mongodb.app.com).

  5. Přidejte Zásady Access řídit, kdo se dostane k nasazení. Můžete vytvořit zásadu, která umožní připojení komukoli ve vaší organizaci, nebo vytvořit podrobnější zásady založené na signálech, jako jsou skupiny poskytovatele identity, vícefaktorová metoda, nebo země.

  6. Postupujte podle zbývajících kroky pro vytvoření aplikace s vlastním hostováním k publikování aplikace.

Konfigurace nasazení Kubernetes

Aby bylo možné se k němu připojit přes SSH, mělo by nasazení Kubernetes spravovat jak samostatnou (standalone) službu MongoDB, tak proxy službu SSH. Níže uvedená konfigurace nasadí 1 repliku databázové služby dostupnou na portu 27017 a proxy SSH dostupnou na portu 22.

Konfigurace StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb-standalone
  namespace: mongodb
spec:
  serviceName: database
  replicas: 1
  selector:
    matchLabels:
      app: database
  template:
    metadata:
      labels:
        app: database
        selector: mongodb-standalone
    spec:
      containers:
        - name: mongodb-standalone
          image: mongo
          command: ["mongod"]
          args: ["--config=/config/mongod.conf"]
          ports:
            - containerPort: 27017
              protocol: TCP
              name: mongod
          volumeMounts:
            - name: mongodb-conf
              mountPath: /config
              readOnly: true
            - name: mongodb-data
              mountPath: /data/db
            - name: tls
              mountPath: /etc/tls
            - name: mongodb-socket
              mountPath: /socket
        - name: ssh-proxy
          image: ubuntu:20.04
          command: ["/scripts/entrypoint.sh"]
          ports:
            - containerPort: 22
              protocol: TCP
              name: ssh-port
          volumeMounts:
            - name: mongodb-socket
              mountPath: /socket
            - name: scripts
              mountPath: /scripts
              readOnly: true
            - name: ssh-authorized-keys
              mountPath: /config/ssh
              readOnly: true
          resources:
            requests:
              cpu: 20m
              memory: 32Mi
      volumes:
        - name: mongodb-socket
          emptyDir: {}
        - name: mongodb-conf
          configMap:
            name: mongodb-standalone
            items:
              - key: mongod.conf
                path: mongod.conf
        - name: tls
          secret:
            secretName: tls
        - name: mongodb-data
          persistentVolumeClaim:
            claimName: mongodb-standalone
        - name: scripts
          configMap:
            name: scripts
            items:
              - key: entrypoint.sh
                path: entrypoint.sh
                mode: 0744
        - name: ssh-authorized-keys
          configMap:
            name: ssh-proxy-config
            items:
              - key: authorized_keys
                path: authorized_keys
                mode: 0400

Odpovídající definice služby by měla rovněž určovat porty a cílové porty kontejnerů (v tomto případě službu databáze a službu SSH proxy).

Definice služby

apiVersion: v1
kind: Service
metadata:
  name: database
  namespace: mongodb
  labels:
    app: database
spec:
  clusterIP: None
  selector:
    app: database
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017
---
apiVersion: v1
kind: Service
metadata:
  name: ssh-proxy
  namespace: mongodb
  labels:
    app: database
spec:
  selector:
    app: database
  ports:
    - protocol: TCP
      port: 22
      targetPort: 22

Pod MongoDB a jump host SSH budou sdílet socket Unix přes svazek s prázdným adresářem. entrypoint.sh soubor spuštěný jump hostem, příklad níže, spustí server OpenSSH.

#!/bin/sh
export TZ=America/Chicago
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
apt-get update -y && apt-get install -y openssh-server
mkdir /root/.ssh
cp /config/ssh/authorized_keys /root/.ssh/authorized_keys
chmod 400 /root/.ssh/authorized_keys
service ssh start
while true;
do sleep 30;
done;

Nakonfigurujte Cloudflare Tunnel

Dále můžete použít cloudflared připojit se k Cloudflare Edge pomocí Cloudflare Tunnel. Začněte tím, že stahování a instalace daemon Cloudflare Tunnel, cloudflared.

Po instalaci spusťte následující příkaz k ověření instance cloudflared do vašeho účtu Cloudflare.

cloudflared login

Příkaz otevře okno prohlížeče a vyzve vás k přihlášení k vašemu účtu Cloudflare. Vyberte web, který jste do svého účtu přidali.

Jakmile ve svém účtu vyberete jednu z poboček, Cloudflare stáhne soubor certifikátu s názvem cert.pem a ověřte tuto instanci cloudflared. cert.pem soubor používá certifikát k ověření vaší instance cloudflared a obsahuje klíč API pro váš účet, který umožňuje provádět akce, jako jsou změny záznamů DNS.

Nyní můžete použít cloudflared řídit připojení Cloudflare Tunnel ve vašem účtu Cloudflare.

Download Certificate

Vytvořte Tunnel

Nyní můžete vytvořit Tunnel který připojí cloudflared k edge Cloudflare. Podrobnosti daného tunelu nakonfigurujete v dalším kroku.

Spusťte následující příkaz pro vytvoření Tunnelu. Můžete nahradit mongodb s libovolným názvem dle vlastního výběru. Tento příkaz vyžaduje cert.pem .

cloudflared tunnel create mongodb

Cloudflare pod tímto názvem vytvoří tunel a vygeneruje pro něj ID a soubor s přihlašovacími údaji.

Nový tunel

Odstraňte cert.pem soubor

Soubor s přihlašovacími údaji je oddělený od cert.pem soubor. Na rozdíl od cert.pem soubor, soubor s přihlašovacími údaji obsahuje token, který ověřuje pouze Named Tunnel, který jste právě vytvořili. Formátováno jako JSON, tento soubor nemůže provádět změny ve vašem účtu Cloudflare ani vytvářet další Tunnels.

Pokud jste dokončili vytváření tunelů, můžete odstranit cert.pem soubor, ponechte pouze soubor s přihlašovacími údaji a nadále spravujte záznamy DNS přímo v Cloudflare dashboardu nebo přes API. Další informace o rozdílných funkcích obou souborů najdete v seznamu užitečné pojmy.

Uložte JSON soubor jako Kubernetes secret.

Nakonfigurujte Cloudflare Tunnel

Předchozí kroky použily cloudflared a vygenerovat soubor s přihlašovacími údaji pro váš účet Cloudflare. Pokud jej spouštíte jako službu společně s nasazením MongoDB Kubernetes, budete muset použít obraz Dockeru cloudflared. Cloudflare vytváří dostupný oficiální image v DockerHub.

Následující konfigurace spustí jednu repliku cloudflared jako vstupní bod (ingress) vedle služeb MongoDB a SSH proxy. cloudflared bude proxovat provoz na proxy službu SSH. cloudflared instance poběží jako samostatné nasazení v jiném namespace a v případě, že to síťová politika umožňuje, bude mít ingress k libovolné službě v uzlu Kubernetes.

cloudflared Konfigurace

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dashboard-tunnel
  namespace: argotunnel
  labels:
    app: dashboard-tunnel
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dashboard-tunnel
  template:
    metadata:
      labels:
        app: dashboard-tunnel
    spec:
      containers:
        - name: dashboard-tunnel
          # Image from https://hub.docker.com/r/cloudflare/cloudflared
          image: cloudflare/cloudflared:2020.11.11
          command: ["cloudflared", "tunnel"]
          args: ["--config", "/etc/tunnel/config.yaml", "run"]
          ports:
            - containerPort: 5000
          livenessProbe:
            tcpSocket:
              port: 5000
            initialDelaySeconds: 60
            periodSeconds: 60
          volumeMounts:
            - name: dashboard-tunnel-config
              mountPath: /etc/tunnel
            - name: tunnel-credentials
              mountPath: /etc/credentials
      volumes:
        - name: dashboard-tunnel-config
          configMap:
            name: dashboard-tunnel-config
        - name: tunnel-credentials
          secret:
            secretName: tunnel-credentials
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: dashboard-tunnel-config
  namespace: argotunnel
data:
  config.yaml: |
    tunnel: 9a00ef26-4997-4de2-83db-631efc74245c
    credentials-file: /etc/credentials/k8s-dashboard.json
    metrics: :5000
    protocol: http2
    no-autoupdate: true
    ingress:
    - hostname: mongodb.widgetcorp.tech
      originRequest:
        bastionMode: true
    - service: http_status:404

Připojení z klienta

Po nasazení můžete spustit cloudflared na straně klienta pro připojení k nasazení MongoDB. Do konfiguračního souboru SSH přidejte následující řádky a nahraďte příklady svým hostname a údaji. --destination hodnota by měla odpovídat adrese URL dříve nakonfigurované služby SSH Proxy.

Host mongodb
  ProxyCommand /usr/local/bin/cloudflared access ssh --hostname mongodb.widgetcorp.tech --destination ssh-proxy.mongodb.svc.cluster.local:22
  LocalForward 27000 /socket/mongodb-27017.sock
  User root
  IdentityFile /Users/username/.ssh/id_rsa

Toto je jednorázový krok. Při dalším pokusu o navázání SSH připojení k nasazení cloudflared otevře okno prohlížeče a vyzve vás k ověření. Po úspěšném ověření budete připojeni, pokud máte platnou relaci. Jakmile bude tunel navázán, všechny požadavky na localhost:27000 na vašem počítači bude přesměrován na /socket/mongodb-27017.sock na kontejneru SSH proxy.

Poté můžete nastavit MongoDB Compass tak, aby se připojoval k localhost:27000.