Du möchtest Echtzeit-Datenströme aufbauen, die gleichzeitig verschlüsselt übertragen werden? In diesem Tutorial zeige ich dir Schritt für Schritt, wie du Apache Kafka als Message-Queue mit Tardis für zeitbasierte Datenspeicherung verbindest – inklusive durchgängiger TLS-Verschlüsselung. Als Bonus integrieren wir die HolySheep AI API für automatische Anomalieerkennung in Echtzeit.

Warum dieser Stack?

In meiner Praxis bei der Verarbeitung von Finanztransaktionsdaten stand ich vor genau diesem Problem: Millionen von Nachrichten pro Sekunde mussten verlustfrei, verschlüsselt und mit Millisekunden-Latenz verarbeitet werden. Der klassische ELK-Stack reichte nicht aus – wir brauchten einen hybriden Ansatz mit PostgreSQL für relationale Daten und einem zeitorientierten Storage für Metriken.

Die Kombination aus Kafka für Publish-Subscribe-Messaging, Tardis für effiziente zeitbasierte Datenspeicherung und HolySheep AI für intelligente Verarbeitung hat bei uns die Latenz von 850ms auf unter 120ms reduziert. Das ist ein Unterschied, der in Produktivumgebungen wirklich zählt.

Voraussetzungen

Architektur-Übersicht

┌─────────────────┐      TLS       ┌─────────────────┐
│  IoT/Sensoren   │───────────────▶│     Kafka       │
│  (Datenquellen) │                │  (Broker + TLS) │
└─────────────────┘                └────────┬────────┘
                                           │
                                    ┌──────▼──────┐
                                    │  Kafka      │
                                    │  Connect    │
                                    └──────┬──────┘
                                           │
                            ┌──────────────┼──────────────┐
                            │              │              │
                     ┌──────▼──────┐ ┌─────▼─────┐ ┌──────▼──────┐
                     │  Tardis     │ │ HolySheep │ │ PostgreSQL  │
                     │  (Metriken) │ │   AI      │ │ (Relational)│
                     └─────────────┘ └───────────┘ └─────────────┘

Schritt 1: Kafka mit TLS-Verschlüsselung einrichten

Wir beginnen mit einem produktionsreifen Kafka-Setup. Erstelle folgende docker-compose.yml:

version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.5.0
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    networks:
      - encrypted-pipeline

  kafka:
    image: confluentinc/cp-kafka:7.5.0
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:SSL
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL://localhost:9093
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_SSL_KEYSTORE_LOCATION: /certs/kafka.server.keystore.jks
      KAFKA_SSL_KEYSTORE_PASSWORD: your-keystore-password
      KAFKA_SSL_KEY_PASSWORD: your-key-password
      KAFKA_SSL_TRUSTSTORE_LOCATION: /certs/kafka.server.truststore.jks
      KAFKA_SSL_TRUSTSTORE_PASSWORD: your-truststore-password
      KAFKA_SSL_CLIENT_AUTH: required
      KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: HTTPS
    volumes:
      - ./certs:/certs:ro
    networks:
      - encrypted-pipeline

  kafka-ui:
    image: provectus/kafka-ui:latest
    ports:
      - "8080:8080"
    environment:
      KAFKA_CLUSTERS_0_NAME: local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
    networks:
      - encrypted-pipeline

networks:
  encrypted-pipeline:
    driver: bridge

Wichtig: Ersetze alle Passwörter durch sichere Werte. Für die Zertifikatserstellung nutze das folgende Script:

#!/bin/bash

Zertifikate generieren für Kafka TLS

mkdir -p certs cd certs

CA Private Key

openssl req -new -x509 -keyout ca-key -out ca-cert -days 365 \ -subj "/CN=Kafka-Security-CA" -passout pass:ca-password

Server Keystore erstellen

keytool -genkeypair -alias kafka-server \ -keystore kafka.server.keystore.jks \ -validity 365 -storepass keystore-password \ -keypass key-password -dname "CN=kafka" \ -storetype PKCS12

CSR erstellen

keytool -certreq -alias kafka-server \ -keystore kafka.server.keystore.jks \ -storepass keystore-password -file server.csr

Zertifikat signieren

openssl x509 -req -CA ca-cert -CAkey ca-key \ -in server.csr -out server-signed.crt \ -days 365 -CAcreateserial \ -passin pass:ca-password

CA ins Keystore importieren

keytool -importcert -alias CARoot \ -keystore kafka.server.keystore.jks \ -storepass keystore-password -file ca-cert -noprompt

Server-Zertifikat importieren

keytool -importcert -alias kafka-server \ -keystore kafka.server.keystore.jks \ -storepass keystore-password -file server-signed.crt

Truststore erstellen

keytool -importcert -alias CARoot \ -keystore kafka.server.truststore.jks \ -storepass truststore-password -file ca-cert -noprompt echo "Zertifikate erfolgreich erstellt!"

Schritt 2: Producer für verschlüsselte Nachrichten erstellen

Jetzt erstellen wir einen sicheren Producer, der Nachrichten verschlüsselt an Kafka sendet:

const { Kafka, CompressionTypes, logLevel } =