Offene Ports und ungeschützte Instanzen sind die häufigsten Einfallstore, wenn es um redis security geht. Ich zeige klar, wie ich Ports schließe, Instanzen absichere und mit wenigen Änderungen in redis.conf das Risiko massiv senke.
Zentrale Punkte
Damit du schnell loslegst, fasse ich die wichtigsten Aspekte kompakt zusammen und priorisiere, was zuerst passieren sollte. Ich adressiere typische Fehlkonfigurationen, die zu offenen Ports führen, und liefere praktikable Einstellungen für eine sichere Produktion. Außerdem setze ich auf Authentifizierung, Verschlüsselung und strenge Netzwerkgrenzen, damit Angriffe ins Leere laufen. Die folgenden Stichpunkte bilden deinen schnellen Startplan, bevor ich tiefer in Details und Beispiele einsteige.
- Netzwerk isolieren: Redis niemals öffentlich exposen, Zugriff nur aus privaten Netzen.
- Konfiguration härten: bind, protected-mode, Ports, Rename-Commands sauber setzen.
- Auth erzwingen: requirepass plus ACLs für feine Rechtevergabe.
- Verschlüsselung aktivieren: TLS für Transport, OS-Encryption für Persistenz.
- Monitoring & Updates: Logs, Alerts, Backups, regelmäßige Versionen einspielen.
Ich priorisiere zuerst die Schließung offener Ports, dann Authentifizierung und anschließend Verschlüsselung. Danach kümmere ich mich um Logging, Backups und Updates, damit Sicherheitsarbeit dauerhaft wirkt. So bleibt die Angriffsfläche klein und die Instanz bleibt unter deiner Kontrolle.
Offene Ports: Risiko und typische Angriffswege
Ein offener Standardport 6379 wirkt wie ein Schild mit der Aufschrift „Bitte hier prüfen“. Angreifer scannen das Internet automatisiert und testen ungeschützte Instanzen in Sekunden. Ohne Authentifizierung lesen sie Daten, setzen Schlüssel oder laden Module nach. In der Praxis folgt daraus oft Datenabfluss oder der Start von Kryptomining. Ich eliminiere dieses Risiko, indem ich die Erreichbarkeit strikt einschränke und nur definierte Quell-Adressen zulasse.
Netzwerktrennung und Bindings sauber setzen
Ich binde Redis an localhost oder an eine private IP im internen Subnetz. So verhindert die Netzarchitektur, dass der Dienst direkt am öffentlichen Internet hängt. In verteilten Setups packe ich die Knoten in ein privates VLAN oder VPC und stelle den Zugriff nur über VPN oder interne Peering-Verbindungen bereit. Dadurch bleibt jedes Paket innerhalb kontrollierter Segmente. Diese einfache Trennung senkt das Risiko deutlich.
Konfiguration in redis.conf: bind, Port, protected-mode
Ich starte bei der redis.conf, weil wenige Zeilen oft den entscheidenden Unterschied machen. Mit bind 127.0.0.1 oder bind 127.0.0.1 10.0.x.y beschränke ich die Schnittstellen. Den Standardport ändere ich, um triviale Scans zu erschweren, und ich lasse protected-mode yes aktiviert. Zusätzlich benenne ich gefährliche Befehle um oder deaktiviere sie. Für häufige Fehlkonfigurationen hilft mir die folgende Tabelle.
| Einstellung | Risiko bei Fehlkonfig | Empfohlene Aktion | Beispiel |
|---|---|---|---|
| bind | Öffentliche Erreichbarkeit für jeden Host | Nur localhost/private IP binden | bind 127.0.0.1 10.0.1.50 |
| port | Einfaches Scannen auf 6379 | Alternativen Port setzen | port 6389 |
| protected-mode | Unlimitierter Zugriff bei offener IP | Aktiv lassen | protected-mode yes |
| rename-command | Missbrauch kritischer Befehle | Umtaufen oder abschalten | rename-command CONFIG „“ |
| tls-port/port | Klartext-Traffic abgreifbar | Nur TLS-Port nutzen | tls-port 6379 / port 0 |
Für tiefergehende Hintergründe zu Fehlkonfigurationen verweise ich auf diesen Überblick zu Konfigurationsfehlern vermeiden. Ich halte die Datei zusätzlich mit Kommentaren nachvollziehbar, damit spätere Audits schneller gehen. Eine saubere Konfiguration spart Zeit und verhindert Ausfälle. Kleine Härtungen bringen hier großen Effekt. Das lohnt sich sofort.
Authentifizierung und ACLs konsequent nutzen
Ich setze eine starke Authentifizierung immer durch, selbst in internen Netzen. Mit requirepass erzwinge ich den AUTH-Handshake, und ich rotiere Passwörter regelmäßig. Seit Redis 6 baue ich auf Access Control Lists: So kann ich Nutzer anlegen, nur benötigte Befehle erlauben und Schlüsselbereiche einschränken. Das trennt Produktions-, Admin- und Analysezugriffe sauber. Weniger Rechte bedeuten weniger Schaden im Ernstfall.
Gefährliche Befehle entschärfen
Viele Angriffe starten über mächtige Commands wie CONFIG, MODULE LOAD oder SLAVEOF/REPLICAOF. Ich entziehe Standardnutzern den Zugriff per ACL und deaktiviere heikle Befehle mit rename-command, indem ich sie auf einen leeren String setze. Damit entferne ich ganze Angriffswege. Wo ich Funktionen wirklich brauche, dokumentiere ich sie und beschränke sie auf Admin-Konten. So bleibt die Instanz handhabbar und sicher.
Transportverschlüsselung mit TLS aktivieren
Ich aktiviere TLS, damit niemand den Traffic mitlesen oder manipulieren kann. In der Konfiguration setze ich tls-port, deaktiviere den Klartext-Port mit port 0 und hinterlege Zertifikat, Schlüssel und CA. Optional prüfe ich Client-Zertifikate, um Maschinenzugriffe zusätzlich zu legitimieren. Moderne Clients sprechen TLS ohne großen Aufwand. Danach laufen alle Verbindungen über einen sicheren Kanal.
Daten im Ruhezustand entschlüsseln unmöglich machen
Für Persistenzdateien setze ich auf Verschlüsselung des Dateisystems. RDB und AOF liegen dann geschützt auf der Platte, selbst wenn jemand das Storage ausliest. Sensible Werte verschlüssele ich zusätzlich in der Anwendung, bevor ich sie an Redis übergebe. Dadurch brauche ich keinen Klartext im Cache. Das senkt das Risiko bei Diebstahl oder unsauberen Backups.
Netzwerk-Sicherheit und Firewalls in der Praxis
Ich aktiviere die Host-Firewall und lasse den Redis-Port nur für definierte IP-Bereiche zu. In der Cloud ergänze ich das durch Security Groups, die Protokolle, Ports und Quellnetze exakt festlegen. Zusätzlich fahre ich regelmäßige Port-Scans, um vergessene Öffnungen zu finden. Unnötige Dienste schalte ich ab, damit keine Schatten-Ports offen bleiben. Eine Anleitung mit Praxisbezug findest du hier: Firewall-Konfigurationen.
Monitoring, Protokollierung und Updates verankern
Ich werte Redis-Logs zentral aus und setze Alerts auf fehlgeschlagene Logins oder auffällige Befehle. Anomalien erkenne ich früh, wenn ich Metriken wie Connections, Commands pro Sekunde oder Latenzen im Blick behalte. Backups plane ich regelmäßig ein und teste die Wiederherstellung. Sicherheitsupdates spiele ich zügig ein, weil sie oft kritische Lücken schließen. Zusätzlich prüfe ich Konfigurationen in Intervallen und dokumentiere Abweichungen.
Rollen, Rechte und Betriebsabläufe
Ich starte Redis mit einem Service-User ohne Root-Rechte, damit ein Einbruch nicht das ganze System trifft. Rollen trenne ich strikt: Admins, Entwickler und Operatoren bekommen nur die Rechte, die sie benötigen. Applikationskonten liegen in eigenen ACL-Profilen und sehen nur ihre Schlüsselpräfixe. Änderungen dokumentiere ich nachvollziehbar, damit Audits leicht fallen. Dieser Rahmen hält Ordnung und senkt das Fehlbedienungsrisiko.
Gehostete Umgebungen sicher auswählen
Bei Managed-Angeboten prüfe ich, ob Firewalling, Netzwerkisolierung, TLS und ACLs standardmäßig aktiv sind. Außerdem achte ich auf konsistente Updates und verlässliches Monitoring. Wer mehr Leistung und Kontrolle braucht, sollte sich Optionen wie Shared vs. Dedicated Redis ansehen. Die passende Plattform reduziert Aufwand und schließt typische Lücken. So bleibt der Fokus auf Anwendung und Daten.
Replikation, Cluster und Sentinel sicher betreiben
Ich sichere Replikation und Cluster-Kommunikation genauso strikt ab wie Client-Zugriffe. Dazu gehören Authentifizierung, Verschlüsselung und saubere Ankündigungen der Endpunkte.
- Replikation: Ich setze replica-read-only yes, damit Replikas keine schreibenden Zugriffe erlauben. Für die Authentifizierung hinterlege ich masteruser und masterauth auf den Replikas und verwende dafür eigene ACL-User mit minimalen Rechten.
- Stale Data: Mit replica-serve-stale-data no verhindere ich, dass eine isolierte Replica veraltete Daten ausliefert. Das schützt Integrität und reduziert Angriffsoberfläche in Partitionen.
- Cluster: Ich aktiviere tls-cluster yes, damit der Gossip-Bus verschlüsselt läuft. Außerdem setze ich cluster-announce-ip, cluster-announce-port und cluster-announce-bus-port auf interne Adressen/Ports. So vermeide ich, dass Knoten ihre öffentlichen IPs announcen.
- Sentinel: Auch Sentinel läuft nur in privaten Netzen. Für überwachte Master setze ich sentinel auth-user und sentinel auth-pass. Die Admin-Oberfläche exponiere ich nicht nach außen und lasse nur definierte Operator-IP-Bereiche zu.
- Verfügbarkeit vs. Sicherheit: Ich kalibriere min-replicas-to-write und min-replicas-max-lag, damit Schreibzugriffe bei teilweisem Ausfall vorsichtig gedrosselt werden. Das ist zwar primär Konsistenzschutz, verhindert aber auch Missbrauch bei Netzwerkfehlern.
DoS- und Ressourcen-Schutz in der Konfiguration
Neben Auth und Netzwerkgrenzen härte ich Redis gegen Überlastung und Speicherangriffe. So bleibt der Dienst stabil, auch wenn Clients sich fehlerhaft oder bösartig verhalten.
- maxclients: Ich begrenze gleichzeitige Verbindungen auf einen realistischen Wert mit Puffer. So verhindere ich, dass das System durch Connection-Spam erschöpft.
- client-output-buffer-limit: Für normal, pubsub und replica setze ich enge Grenzen. Das schützt vor ungebremstem Speicherwachstum durch langsame Konsumenten.
- timeout und tcp-keepalive: Inaktive Verbindungen trenne ich automatisch, damit keine Zombie-Connections Ressourcen binden.
- latency-monitor-threshold und slowlog: Ich aktiviere Messpunkte, um Missbrauchsmuster (z. B. KEYS-Scans) früh zu erkennen. Alerts auf ungewöhnlich lange Kommandolaufzeiten helfen bei der Früherkennung.
- maxmemory und Policy: Ich setze eine maxmemory-Grenze und eine geeignete Eviction-Policy. Das ist kein Security-Feature per se, schützt aber die Gesamtumgebung vor OOM und Notfall-Restarts.
ACL-Design: Praktikable Muster und sichere Ablage
Ich halte ACLs einfach, reproduzierbar und versionierbar. Die Regeln lege ich nicht nur zur Laufzeit fest, sondern speichere sie in einer Datei und gebe ihr restriktive Dateirechte.
- Basis: Ich schalte den Default-User ab (user default off). Für Applikationen lege ich dedizierte User an, die nur die wirklich benötigten Kommandokategorien erhalten (+@read, +@write, -@dangerous).
- Scopes: Ich beschränke Schlüsselbereiche mit Präfixen, z. B. ~app:*. So kann eine Anwendung nicht versehentlich in fremde Namespaces greifen.
- Beispiel: user app on >S3cur3P@ss ~app:* +@read +@write -@dangerous -config -module -eval -evalsha und ein separater Admin-User mit +@all, der nur über Bastion-Hosts erreichbar ist.
- Persistenz: Ich nutze aclfile /etc/redis/users.acl und sichere die Datei mit 600-Rechten. Änderungen speichere ich mit ACL SAVE und dokumentiere sie im Change-Log.
- Rotation: Passwörter rotiere ich regelmäßig und versioniere ACL-Änderungen, damit ich im Incident-Fall schnell zurückrollen kann.
Skripte und Module kontrollieren
Ich beschneide die Angriffsoberfläche von Lua-Skripten und Modulen konsequent. Unnötige Fähigkeiten fliegen raus, gefährliche Kommandos sind für App-User tabu.
- EVAL nur bei Bedarf: Ich entziehe Nicht-Admin-Usern den Zugriff auf EVAL und EVALSHA. Skripte laufen sonst mit der Macht des aufrufenden Users und können massenhaft Daten bewegen.
- Lua-Limits: Mit lua-time-limit verhindere ich, dass fehlerhafte Skripte den Server lange blockieren. Notfalls breche ich mit SCRIPT KILL ab.
- Module härten: MODULE LOAD deaktiviere ich per rename-command oder erlaube es nur Admins. Module lade ich ausschließlich beim Start aus einem vertrauenswürdigen, schreibgeschützten Pfad.
- Gefährliche Kategorien: Statt einzelne Befehle zu sperren, entziehe ich mit -@dangerous ganze Risikogruppen (z. B. DEBUG, CONFIG, MODULE, SHUTDOWN). Das ist übersichtlich und robust.
Container- und Kubernetes-Betrieb sicher aufsetzen
In Containern und auf Kubernetes gelten die gleichen Prinzipien – ergänzt um Plattformkontrollen. Ich verhindere Public Exposure, minimiere Rechte und reguliere Datenpfade.
- Netzwerk-Policies: Ich erlaube Pod-zu-Pod-Verkehr nur zwischen freigegebenen Namespaces/Deployments. Services für Redis laufen intern; kein NodePort/LoadBalancer ins Internet.
- Pod-Sicherheit: Redis läuft runAsNonRoot, mit readOnlyRootFilesystem und minimalen Linux-Capabilities. Ich aktiviere Seccomp/AppArmor-Profile und setze Ressourcengrenzen.
- Secrets: Kennwörter und Zertifikate landen als Secret-Volume mit restriktiven Rechten – nicht im Container-Image und nicht in Logs. Rotation ist automatisiert.
- Volumes: Daten und Konfiguration trenne ich sauber. Nur das Daten-Volume ist beschreibbar, Konfigurationsmounts bleiben read-only.
- Liveness/Readiness: Health-Checks authentifiziere ich (z. B. via ACL-User mit Nur-Lese-Rechten), damit Probes nicht zur Hintertür werden.
Automatisierung, Systemd-Sandboxing und sichere Auslieferung
Ich gieße Sicherheit in Automatisierung, damit jede Instanz identisch und sicher ausgerollt wird. Abweichungen fallen dann sofort auf.
- Templates: redis.conf, ACL-Datei und Systemd-Unit sind als Code versioniert. Vor jedem Rollout prüfe ich bind, Ports, TLS und ACLs automatisiert.
- Systemd-Härtung: In der Unit aktiviere ich NoNewPrivileges=yes, PrivateTmp=yes, ProtectSystem=strict, ProtectHome=yes und setze UMask=027. Das beschränkt Dateizugriffe und Laufzeitrechte wirksam.
- CICD-Gates: Pipelines brechen ab, wenn ein Port öffentlich exponiert wäre, Zertifikate fehlen oder riskante Befehle nicht umbenannt sind. So verhindere ich Regressionen.
- Images & Pakete: Container-Images und OS-Pakete scanne ich auf Schwachstellen. Updates rolle ich gestaffelt aus und messe dabei Metriken sowie Fehlerbudgets.
Vorbereitung auf Vorfälle: strukturierter Reaktionsplan
Ich plane den Ernstfall, bevor er eintritt. So reagiere ich schnell, begrenze Schaden und stelle den Betrieb sauber wieder her.
- Eindämmen: Ich sperre sofort die Netzwerkpfade (Security Groups, Firewall), stoppe Public Exposure und friere verdächtige Instanzen ein, um Beweise zu sichern.
- Identifizieren: Mit INFO clients, ACL LIST, ROLE, CONFIG GET und MODULE LIST prüfe ich Zustand, aktive Nutzer, Replikation und geladene Module.
- Credentials rotieren: Ich setze neue Passwörter/ACL-Schlüssel, sperre auffällige User (ACL SETUSER user off) und entziehe Rechte bis zur Klärung.
- Bereinigung: Unerlaubte Schlüsselräume identifiziere ich per Präfixstrategie, entferne bösartige Module offline und vergleiche die Konfiguration mit dem Sollzustand.
- Wiederherstellung: Aus geprüften Backups stelle ich wieder her, führe Updates ein und rolle gehärtete Konfigurationen aus. Danach folgt ein Post-Mortem mit klaren Maßnahmen.
Praktische Umsetzung: Checkliste in Worten
Ich beginne mit einem Scan auf offene Ports und schränke den Zugriff sofort ein, wenn 6379 öffentlich sichtbar ist. Danach binde ich Redis an localhost oder eine private IP und setze die Host- sowie Cloud-Firewall durch. Im nächsten Schritt aktiviere ich requirepass, rotiere das Kennwort und richte ACLs für Nutzer und Workloads ein. Anschließend deaktiviere oder benenne ich heikle Befehle um, aktiviere TLS und stelle den Klartext-Port ab. Zum Abschluss etabliere ich Logging, Alerts, Backups, regelmäßige Updates und wiederkehrende Konfigurationsprüfungen.
Kurz zusammengefasst
Redis bleibt sicher, wenn ich die Angriffsfläche klein halte, Zugriffe begrenze und Kommunikation verschlüssele. Die Kombination aus Netzwerktrennung, starker Authentifizierung und restriktiven Befehlsrechten stoppt gängige Angriffe effektiv. Mit TLS schütze ich den Transport, mit OS-Verschlüsselung die Persistenz. Monitoring, Backups und Updates sichern den Betrieb im Alltag. Wer diese Schritte konsequent umsetzt, vermeidet offene Ports, schützt sensible Daten und hält die Instanzen verlässlich unter Kontrolle.


