Korzen
Bot Protection

Kubernetes

Bot Protection aus einer App auf Kubernetes: der API key als Secret, die IP des Besuchers über Load Balancer und ingress-nginx, und Egress.

Kubernetes ändert drei Dinge am Aufruf von Ihrem Server: wo der API key liegt, wie die Adresse des Besuchers Load Balancer und Ingress übersteht, und ob der Pod korzen.dev überhaupt erreichen darf. Der Aufruf selbst gehört Ihrem Framework: Nehmen Sie ihn aus der Anleitung für Ihren Stack.

Der Schlüssel

Bewahren Sie den API key in einem Secret auf, nie im Image oder in einer ConfigMap, und übergeben Sie ihn dem Container als Umgebungsvariable:

kubectl create secret generic korzen --from-literal=api-key=ak_your_key
# deployment.yaml, in your app's container
env:
  - name: KORZEN_API_KEY
    valueFrom:
      secretKeyRef:
        name: korzen
        key: api-key

Die IP des Besuchers

Standardmäßig versteckt ein Cloud-Load-Balancer den Besucher hinter seiner eigenen Adresse, und der Ingress ebenso. Zwei Einstellungen bewahren sie: externalTrafficPolicy: Local am Service des Ingress-Controllers, und ingress-nginx, das dem Header vertraut, den der Load Balancer hinzufügt. Ihre Anwendung liest dann X-Real-IP oder den letzten Eintrag von X-Forwarded-For, die ingress-nginx setzt; hinter Cloudflare CF-Connecting-IP.

# The ingress controller's Service: keep the visitor's address on the way in.
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
# ingress-nginx's ConfigMap: trust the load balancer in front, pass the address on.
apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  use-forwarded-headers: "true"     # only if a load balancer you control is in front
  compute-full-forwarded-for: "true"
  # use-proxy-protocol: "true"      # instead, if your cloud's load balancer speaks PROXY protocol

Egress

Blockiert der Cluster standardmäßig ausgehenden Traffic aus einem Namespace, muss der Pod Port 443 erreichen dürfen:

# Only if your cluster blocks egress by default: let the app reach HTTPS.
# A plain NetworkPolicy matches addresses, not names, and korzen.dev answers from
# Cloudflare's ranges; with Cilium, an FQDN rule can name korzen.dev itself.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-egress-https
spec:
  podSelector:
    matchLabels:
      app: shop
  policyTypes: [Egress]
  egress:
    - ports:
        - port: 443
          protocol: TCP
    - ports:
        - port: 53
          protocol: UDP

Im Betrieb

  • Ein HTTP-Client pro Pod, offen gehalten; jede Replika öffnet ihre eigene Verbindung, und das ist in Ordnung.
  • Lassen Sie nie eine Readiness- oder Liveness-Probe von Bot Protection abhängen: Ist es langsam, müssen die Pods in Betrieb bleiben und fail-open sein.
  • Der Timeout Ihres SDK zählt von dort, wo der Cluster läuft: Ein Cluster in USA West braucht etwa 300 ms.

Häufige Fehler

  • Die eigene Adresse des Ingress als die des Besuchers gesendet: Jede Entscheidung teilt sich dann eine IP, und Bot Protection sieht einen sehr beschäftigten Besucher.
  • use-forwarded-headers eingeschaltet, ohne etwas davor, das Sie kontrollieren: Ein Besucher schreibt X-Forwarded-For und wählt seine Adresse.
  • Der Schlüssel in einer ConfigMap oder ins Image eingebacken, wo jeder mit Lesezugriff auf den Namespace oder die Registry ihn sieht.