← Cloudflare One / cloudflare-one / tutorials
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:
- Vytvořte pravidlo Cloudflare Access pro zabezpečení nasazení MongoDB
- Nakonfigurujte StatefulSet a definici služby pro nasazení
- Nakonfigurujte připojení Cloudflare Tunnel k edge síti Cloudflare
- Vytvořit konfigurační soubor SSH pro klienta
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.
-
V Cloudflare dashboard ↗, přejděte na Zero Trust > Řízení přístupu > Aplikace.
-
Vyberte Vytvořit novou aplikaci.
-
Vyberte Vlastní hosting a soukromé.
-
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). -
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ě.
-
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: 0400Odpoví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: 22Pod 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 loginPří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.
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.
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
cloudflared KonfiguraceapiVersion: 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:404Př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_rsaToto 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.