Wichtige Docker-Sicherheitstipps für Self-Hosting
Sichern Sie Ihre selbstgehosteten Dienste – von der Abwehr bis zum Monitoring!
Inhalt
- 🧗♀️ Für die Mutigen
- 🔄 Der
:latest-Tanz - 🔐 Geheimnisverwaltung: Die richtige Art
- 🌐 Netzwerkgefahr
- 🛡️ Zugriffssteuerung
- 🔍 Überwachung & Verifikation
- ⏰ Oft übersehene Tipps
- 🚀 Produktionscheckliste
- 📚 Weitere Lektüre
🧗♀️ Für die Mutigen
Wenn Sie Docker-Dienste selbst hosten, ist die Sicherheit Ihre Verantwortung von oben bis unten – kein Cloud-Anbieter schützt Sie vor Portscans oder schlampiger Konfiguration. Ob Sie Apps in Ihrem Heimnetzwerk starten oder VPS von Anbietern wie Vultr, DigitalOcean, Linode, AWS, Azure oder Google Cloud mieten – Sie müssen Dinge absichern und prüfen, ob Sie es richtig gemacht haben.
In diesem Leitfaden durchlaufen wir Docker-Sicherheit – von einigen weniger bekannten bis hin zu anderen schwierig umzusetzenden Techniken; wir werden Kanarische Tokens, schreibgeschützte Volumes, Firewall-Regeln, Netzwerktrennung und -verstärkung sowie authentifizierte Proxies und mehr untersuchen.
Wir vergleichen auch Heimnetzwerke mit öffentlichen Cloud-Infrastrukturen und zeigen Ihnen, wie Sie einen einfachen Authentifizierungs-Proxy mit Nginx einrichten. Am Ende werden Sie mehrere Optionen haben, um die Unwissenden (Freunde, Familie und manchmal sogar sich selbst…) auszusperren.
Das sind viele Themen! Aber vieles davon hängt zusammen, und Sie können auswählen, was für Ihre Infrastruktur am relevantesten ist. 🍀
🔄 Der :latest-Tanz
Das Aktualisieren von Images ist für die Sicherheit entscheidend. Allerdings können Abhängigkeiten von :latest brüchige Änderungen oder veraltete Builds ohne Review-Schritt einführen.
Die sichere Art zu aktualisieren
Kombinieren Sie Update-Befehle mit pull oder build, um Images bewusst zu aktualisieren und anschließend in einem Zeitfenster Neustarten, in dem Sie Brüche bemerken können.
#!/bin/bashdocker compose pull && \ docker compose up -dVersionspinnung vs. latest
Die Wahl der richtigen Version, an die Sie anheften, ist ein Kompromiss zwischen Stabilität und Sicherheit. Hier sind einige gängige Strategien:
# ... # Exakte Versionspinnung, am besten für kritische Dienste image: postgres:17.2
# Patch-Versionpinnung, gut für nicht-kritische Dienste image: postgres:17.2
# Major-Versionpinnung, perfekt für Hobbyprojekte image: postgres:17
# Yolo, möglichst vermeiden image: postgres:latestNutzen Sie Dependabot oder Renovate, um überprüfbare Update-PRs zu öffnen. Für alles, was Ihnen bei der Neubauung um 2 Uhr morgens leid tun würde, heften Sie sich an eine spezifische Version oder Digest an und lassen Sie Automatisierung Ihnen sagen, wann Sie weiterziehen sollen.
Teilen Sie mir Ihre Lieblingstools für die Aufrechterhaltung aktueller Docker-Images mit!
🔐 Geheimnisanwaltung
Es gibt viele Wege, Geheimnisse zu verwalten, aber eine der wichtigsten Regeln ist: Verhärten Sie niemals Geheimnisse in Ihren Docker-Images oder committen Sie sie in Git. Es ist einer der häufigsten Sicherheitsfehler, birgt langfristige Risiken und ist ärgerlich zu beheben.
Die sichere Speicherung von Geheimnissen ist ein umfangreiches Thema mit vielen Optionen, von .env-Dateien, Docker secrets, 1Password/Bitwarden, bis hin zu Geheimnis-Verwaltungs-Tools wie HashiCorp Vault oder AWS Secrets Manager.
Sie müssen die „richtige“ Balance aus Aufwand & Sicherheit für Ihren Use-Case wählen.
Beispiel Docker Compose
Hier ist eine Beispiel-Datei docker-compose.yml, die den app-Dienst an 127.0.0.1:8080 bindet und beide Container an das backend-Netzwerk anschließt.
networks: backend:
services: app: networks: - backend ports: # Bind an localhost, falls möglich - "127.0.0.1:8080:8080" # ... andere Einstellungen database: image: postgres:17.1 # Keine Ports notwendig; innerhalb des backend-Netzwerks zugänglich. networks: - backendNetzwerk-Best Practices
- 🏆 Veröffentlichen Sie KEINE Ports Vor Kurzem habe ich gelernt, dass dies nützlicher ist, als Sie erwarten könnten! Bei der Verwendung eines benannten (Bridge-)Netzwerks haben Container uneingeschränkten Zugriff aufeinander. Sie verhalten sich, als wären sie hinter einem lokalen Netzwerk (NAT-Gateway).
- Obwohl dies in einigen Use-Cases nicht möglich ist, kann dies nützlich sein für Container, die Batch-Jobs ausführen oder hauptsächlich über
attachoderexeczugänglich sind.
- Obwohl dies in einigen Use-Cases nicht möglich ist, kann dies nützlich sein für Container, die Batch-Jobs ausführen oder hauptsächlich über
- 🥇 Verwenden Sie Docker-Netzwerke, um zu isolieren und zu kontrollieren, welche Container miteinander kommunizieren dürfen.
- 🥉 Verwenden Sie Localhost-Binding: Während fehleranfällig, sind Sie in den meisten Fällen besser dran, Ports an eine Loopback-Adresse (z. B.
127.0.0.1:8080:80) zu binden. Stellen Sie einfach sicher, dass Sie Ihre Konfiguration überprüfen.
🛡️ Zugriffssteuerung
Zugriffssteuerungen sind ein entscheidender Bestandteil der Sicherung Ihrer Docker-Dienste. Dazu gehören die Begrenzung von Container-Berechtigungen und -Fähigkeiten, die Einschränkung des Zugriffs auf den Docker-Socket und mehr.
- Begrenzung von Container-Berechtigungen
- Zugriff auf Docker-Socket
- Landesblockierung!
- Hardening eines CloudFlare-Proxy-Hosts
Begrenzung von Container-Berechtigungen
Ein weiteres solides Zugriffssteuerungskonzept ist die Begrenzung der Fähigkeiten Ihrer Container. Dies reduziert den Blast Radius zahlreicher Bedrohungen, von Privilegien-Ausweitung bis hin zu Traffic-Hijacking. Es handelt sich nicht um eine unüberwindbare Barriere, entfernt aber Berechtigungen, die die meisten Container ohnehin nicht benötigen.
Was sind Fähigkeiten? Linux-kerneltypisierte, benannte Berechtigungen oder Fähigkeiten. (Die capabilities Manpage enthält eine vollständige Liste.) Dazu gehören z. B. CAP_CHOWN (Dateibesitz ändern), CAP_NET_ADMIN (Netzwerkschnittstellen konfigurieren), CAP_KILL (jeden Prozess beenden) und viele mehr.
Die beiden Methoden, um benötigte Fähigkeiten zu bestimmen, sind:
- Versuch und Irrtum: Diese langsame, aber effektive Methode beginnt mit keiner Berechtigung und fügt sie schrittweise hinzu, bis Ihre App funktioniert.
- Suche nach Vorbildern: Suchen Sie nach “
project-namecap_dropDockerfile” oder “project-namecap_dropdocker-compose.yml”, um zu sehen, ob andere bereits die Arbeit erledigt haben. Ein LLM kann einen Ausgangspunkt vorschlagen, behandeln Sie dies jedoch wie eine Schätzung, bis Sie den Container testen und die Image-Dokumentation lesen.
Best Practices zu Fähigkeiten
- Entfernen Sie alle Berechtigungen: Verwenden Sie
cap_drop: [ ALL ], um alle Linux-Berechtigungen aus dem Container zu entfernen. - Keine neuen Privilegien: Verwenden Sie
security_opt: [ no-new-privileges=true ], um zu verhindern, dass der Container neue Privilegien erhält.
services: database: image: postgres:17.1 networks: [ db-network ] security_opt: - no-new-privileges:true cap_drop: - ALL cap_add: - CHOWN - DAC_READ_SEARCH - FOWNER - SETGID - SETUID db-admin: image: dpage/pgadmin4:4.1 networks: [ db-network ] ports: - "8081:80" # ... andere Einstellungennetworks: db-network:Jetzt können Ihre Dienste über das db-network-Netzwerk miteinander kommunizieren. Docker Compose erstellt dieses Netzwerk automatisch.
Verwenden Sie die Option --external/external: für die Verbindung zu einem vorab erstellten Netzwerk. Lassen Sie sie weg, um ein neues Netzwerk zu erstellen.
Docker-Socket-Zugriff
⚠️ Warnung: docker.sock ist im Grunde Root-Zugriff auf den Host
⚠️ Die Option :ro wirkt sich nicht auf die über das Socket gesendeten I/O-Daten aus!
Sie stellt lediglich sicher, dass der Socket-Pfad selbst schreibgeschützt gemountet wird. Die über dieses Socket gesendeten API-Aufrufe können dennoch Container erstellen, Host-Pfade mounten und andere sehr spannende Dinge ausführen, die Sie wahrscheinlich nicht delegieren wollten.
Best Practice für Sockets
- 🥇 Vermeiden Sie das Mounten des Docker-Sockets, es gibt wahrscheinlich eine bessere Alternative.
- 🫣 Falls unumgänglich, setzen Sie eine enge Proxy-Schicht voran und erlauben Sie nur die API-Endpunkte, die die App tatsächlich benötigt. Schauen Sie sich das Projekt
docker-socket-proxyvon Tecnativa an: docker-socket-proxy. Stellen Sie anschließend sicher, dass die abgelehnten Aufrufe tatsächlich blockiert werden. - 🤢 Okay, vielleicht ist das Teilen in einem sehr hochvertrauenswürdigen, niedrigrisikobehafteten Testumfeld akzeptabel.
Länder sperren!
Manchmal nützlich, aber keine echte Sicherheitsgrenze.
Es geht um die geopolitische Einheit, nicht um die Musik…
Wenn Sie Apps hauptsächlich für Ihre lokale Familie & Freunde hosten, können Sie Traffic aus Ländern sperren, von denen Sie keine Anfragen erwarten. Oder umgekehrt: Nur Traffic aus erwarteten Ländern zulassen. Das reduziert Rauschen; es stoppt aber weder VPNs, Proxies, Botnetze noch Geduldige.
Schauen Sie sich dieses Skript an, um alle IPs aus China zu blocken:
curl -fsSL https://www.ipdeny.com/ipblocks/data/countries/cn.zone | \ while read line; do ufw deny from $line to any; doneÄhnlich können Sie auch nur Traffic aus den USA zulassen:
curl -fsSL https://www.ipdeny.com/ipblocks/data/countries/us.zone | \ while read line; do ufw allow from $line to any; doneSicherheit für CloudFlare-Proxy-Host stärken
Wenn Ihr Heimserver hinter einer CloudFlare-IP (Proxy) geschützt ist, können Sie den Zugriff auf nur CloudFlare-IPs und Ihr lokales Netzwerk beschränken.
Dies ist etwas ähnlich wie die Länderblockierung weiter oben, bietet aber eine viel engere Kontrolle.
ufw default deny incoming # Alle eingehenden Verbindungen sperren!!!ufw default allow outgoing # Alle ausgehenden Verbindungen erlaubenufw allow ssh # SSH erlauben
# Zugriff für lokales Subnetz erlauben (am besten dedizierter DMZ/VLAN für gehostete Dienste)ufw allow from 10.0.0.0/8 to any port 443Erlaube CloudFlare-IPs
curl -fsSL https://www.cloudflare.com/ips-v4 |
while read line; do ufw allow from $line to any port 443; done
IPv6-Unterstützung hinzufügen
curl -fsSL https://www.cloudflare.com/ips-v6 | \
while read line; do ufw allow from $line to any port 443; done
Um geobasierte Änderungen zu testen, kann ein VPN mit Standorten im gewünschten Land nützlich sein. Weitere Informationen finden Sie im Abschnitt [Überwachung & Verifikation](#-monitoring--verification).
### Anwendungsschicht-Sicherheit
Wenn Ihr [Netzwerk und Host sicherheitstechnisch abgesichert sind,](#-network-hazard) stellt sich heraus, dass es noch mehr zu tun gibt.
Jetzt müssen wir uns mit der 'Anwendung'sschicht unserer eigenen Dienste beschäftigen.
```markdown<p class="inset">Hat diese Datenbank ein gültiges Passwort? Automatisiert dieser Container HTTPS/Zertifikate? Enthält die App eine integrierte Authentifizierung? Gibt es Grenzen, welche E-Mails sich registrieren können? Gibt es Standardanmeldeinformationen oder Umgebungsvariablen, die geändert werden müssen?</p>
Die einzige Möglichkeit, dies zu _wissen_, ist, es zu überprüfen. In diesem Fall beginnen Sie mit der `README`-Datei und anderen Schlüsseldateien wie `docker-compose.yml`, `Dockerfile` und `.env.*`. Sowohl im Projekt selbst als auch idealerweise auch in seinen unterstützenden Diensten (z. B. Postgres, Redis usw.).
#### Reverse Proxy
Eine weitere Schicht der Verteidigung ist die Basic-Authentifizierung. Verwenden Sie sie nicht ohne HTTPS. Für alte Dienste ist es oft ausreichend, Basic-Authentifizierung vor einer Admin-Route zu platzieren, um Drive-by-Anfragen und unauthentifizierte Crawler daran zu hindern, den Dienst direkt zu bedienen.
```nginx# /etc/nginx/conf.d/secure-admin.conflocation /admin { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://internal_admin:80; proxy_set_header X-Real-IP $remote_addr;}Anmeldeinformationen generieren:
htpasswd -c /etc/nginx/.htpasswd adminMit einer Basic-Authentifizierungs-Proxy-Schicht haben Angreifer eine zusätzliche Hürde – Benutzername und Passwort – vor der internen Dienstinstanz.
Eine weitere Option ist die Verwendung eines Dienstes wie Traefik oder Caddy, der HTTPS und Basic-Authentifizierung für Sie automatisieren kann.
Wenn Sie viele Domains und Dienste mit einer Benutzeroberfläche verwalten möchten, empfehle ich Ihnen [Nginx Proxy Manager](https://nginxproxymanager.com/).
## 🔍 Überwachung & Verifikation
- [Überprüfen Sie Ihre Ports](#check-your-ports)- [Anzeige offener Ports](#view-open-ports)- [Dateiüberwachung](#file-monitoring)
Dies ist **der wichtigste und am meisten übersehene Schritt.** Sie können die beste Firewall, das beste Netzwerk und die besten Praktiken haben, aber wenn Sie es nicht überprüfen, wissen Sie nicht, ob es funktioniert.
Außerdem kann das Wissen über einige Befehle oder wo man sie nachschlagen kann den Unterschied bei der Verhinderung eines Sicherheitsvorfalls ausmachen. Das Gefühl, ein Hacker zu sein, ist nur ein Bonus. (Für Details und Beispiele springen Sie vor zur [Überwachung & Verifikation](#-monitoring--verification)-Sektion.)
<p class="inset">Vertrauen Sie nicht, überprüfen Sie zweimal</p>
### Überprüfen Sie Ihre Ports
<p class="inset">⚠️ Wichtig: Scannen Sie keine Hosts, die Sie nicht besitzen.</p>
Ob Sie sich in einem Heimnetzwerk oder einem VPS befinden – Sie werden wissen wollen, welche Ports für die Öffentlichkeit geöffnet sind.
Es gibt zwei Möglichkeiten, dies zu überprüfen:
- Netzwerk prüfen (`nmap`, `masscan`)- Betriebssystem befragen (`lsof`, `netstat`, `ss`)
#### Netzwerkaußenprüfung
Sie benötigen Ihre aktuelle (öffentliche) IP-Adresse, leicht erreichbar über Dienste wie `ifconfig.me`: `curl https://ifconfig.me`. Alternativ können Sie sie in der Konsole Ihres Hosting-Anbieters nachschlagen.
```bash title="Öffentliche IP abrufen"curl -fsSL https://ifconfig.me# --> AKTUELLE ÖFFENTLICHE IPSobald Sie Ihre öffentliche IP haben, müssen Sie eine externe Netzwerkverbindung herstellen. Dazu können Sie einen Freundes-Computer, ein Mobiltelefon/5G-Handy oder einen dedizierten Server-Host nutzen.
target_host="$(curl -fsSL https://ifconfig.me)"
# Hinweis: Stellen Sie sicher, dass `$target_host` die gewünschte IP ist
# Spezifische Ports scannen:nmap -A -p 80,443,8080 --open --reason $target_host# Top 100 Ports:nmap -A --top-ports 100 --open --reason $target_host# Alle Ports:nmap -A -p1-65535 --open --reason $target_hostTest in Ihrem Netzwerk
Üben Sie mit nmap, scannen Sie Ihr lokales Netzwerk oder einen Ihrer Server, prüfen Sie Ihren Router, Drucker, Smart-Kühlschrank.
Beispiel-Scan-Befehle
# Scannen Sie Ihren localhost nach allen offenen Portsnmap -sT localhost
# Scannen Sie die private IP Ihres Computers nach Dienstennmap -sV 192.168.1.10
# Finden Sie Dienstdetails in Ihrem Netzwerknmap -sn 192.168.0.0/24nmap -sn 10.0.0.0/24# Oder bei Docker 172.18.0.1/16nmap -sn 172.18.0.1/16% nmap -A --open --reason 192.168.0.87
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-06 13:51 MSTNmap scan report for dev02.local (192.168.0.87)Host is up, received syn-ack (0.0067s latency).Not shown: 995 closed tcp ports (conn-refused)PORT STATE SERVICE REASON VERSION22/tcp open ssh syn-ack OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)| ssh-hostkey:|_ 256 {FINGERPRINT} (ED25519)80/tcp open http syn-ack Caddy httpd|_http-server-header: Caddy|_http-title: Dev02.DanLevy.net443/tcp open ssl/https syn-ack|_http-title: Dev02.DanLevy.net1234/tcp open http syn-ack Node.js Express framework|_http-cors: GET POST PUT DELETE PATCH|_http-title: Dev02.DanLevy.net (application/json; charset=utf-8).Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 13.36 secondsOffene Ports anzeigen
Lernen Sie lsof kennen – es ist unter MacOS und Linux verfügbar. Es zeigt detaillierte Netzwerk- und Scheibenaktivität an.
# Überwachen Sie einen spezifischen Portsudo lsof -i:80 -Pn# ETABLIERTE Verbindungen überwachensudo lsof -i -Pn | grep ESTABLISHED# LISTEN anzeigensudo lsof -i -Pn | grep LISTEN
# Netzwerknamen anstelle von IP-Adressen anzeigen (Umkehrung von DNS-Lookups kann sehr langsam sein)sudo lsof -i -P | grep LISTEN
# Alle Netzwerkverbindungen überwachensudo watch -n1 "lsof -i -Pn"Beispiel Ausgabe

Dateiüberwachung
Um zu ermitteln, welche Prozesse die meisten Festplattenbandbreiten nutzen, können Sie iotop verwenden:
sudo iotopUm Einzeldateiveränderungen zu beobachten, können Sie inotifywait unter Linux oder fswatch unter MacOS verwenden:
Dies kann nützlich sein, um unbefugtes oder ungewöhnliches Verhalten pro Ordner oder systemweit zu erkennen.
# Alle Dateiveränderungen in einem Verzeichnis überwachensudo inotifywait -m /pfad/zum/verzeichnisUnter MacOS können Sie fswatch verwenden:
Installieren mit brew install fswatch
fswatch -r /pfad/zum/verzeichnis⏰ Oft übersehene Tipps
-
Rate Limiting für Authentifizierungsversuche und andere kritische Endpunkte. Ob über das Nginx-Modul
limit_reqoderfail2banfür SSH-Zugriffe – das Drosseln von Brute-Force-Angriffen ist wahrscheinlich eine gute Idee. Ich sage wahrscheinlich, weil in der Ära von IPv6 und günstigen Botnetzen das nicht mehr ganz so aussieht wie früher. -
Read-Only Volumes einsetzen, soweit möglich:
services: webapp: volumes:
- ./config:/config:ro
Kombiniert mit anderen Best Practices (nicht-root-Benutzer, minimale Ordnerberechtigungen) bietet die `:ro`-Volume-Mount-Option zusätzliche Schutzmaßnahmen gegen versehentliche Änderungen und einige Schreibversuche aus dem Container heraus. Es schützt den Host jedoch nicht vor Prozessen, die bereits umfassende Rechte besitzen.
3. **Container-Zugriffsrechte regelmäßig prüfen**. Wenn ein Container ein Geheimnis, einen Port oder eine Mount-Datei nicht benötigt – entfernen!
4. **Achtung bei WiFi-Abenteurern** Sicher, Sie würden niemals Ihren WiFi-Code an irgendwelche seltsamen Typen weitergeben, oder? Außer vielleicht an einige Freunde... Okay, vielleicht auch an Familienmitglieder. Man weiß nie, welche Apps sie installiert haben und ob diese Ihren SSID & Passwort an die Welt weitergeben.
### Heimnetzwerk vs. Öffentlicher Anbieter vs. Tunneling
1. **Virtuelle Isolation/DMZ**: Für Heimserverszenarien sie in eine separate VLAN oder DMZ legen, falls möglich. Dies schützt interne Geräte vor potenziellen Compromisen durch den Server. - Nutzen Sie einen separaten Router oder VLAN für Ihren Heimserver. - Nutzen Sie ein separates WiFi-Netzwerk für Ihren Heimserver. - Nutzen Sie ein separates Subnetz für Ihren Heimserver.
2. **Cloud-Anbieter**: Hetzner, Vultr, DigitalOcean, Linode, AWS, Azure und Google Cloud bieten alle unterschiedliche Firewall-Funktionen. - Einige Anbieter & Dienste schließen Ports standardmäßig. Andere bieten Optionen oder Zusatzdienste. Prüfen Sie die Dokumentation Ihres Anbieters. - Viele Anbieter bieten erweiterte Überwachung und Bedrohungserkennungsdienste an.
3. **VPNs & Tunneling**: Nutzen Sie eine VPN-ähnliche Option oder Tunneling-Dienst, um Dienste sicher über das Internet zu verbinden, ohne sie dem öffentlichen Internet auszusetzen. - TailScale, ngrok, ZeroTier. - WireGuard, OpenVPN.
{/* 3. **Schutz vor internen/lateralen Angriffen**: Ein infiziertes Gerät kann ein gesamtes Netzwerk kompromittieren. Das Segmentieren von Docker-Diensten auf benutzerdefinierten Netzwerken, die Nutzung von Hardware, UFW-Regeln und das Blockieren unnötiger Ports können das Risiko reduzieren (wenn ordnungsgemäß konfiguriert). */}
## 🚀 Produktions-Checkliste
- [ ] **Geheimnisse**: Alle Geheimnisse zufällig generiert und sicher gespeichert- [ ] **Updates**: Container-Update-Strategie dokumentiert und automatisiert. (Okay, wenn es nur ein paar Befehle in einer Textdatei sind.)- [ ] **Netzwerk**: Nur notwendige Ports freigegeben, interne Netzwerke eingerichtet.- [ ] **Firewall-Regeln**: Standard-Verweigerung, explizite Erlaubnisse, Länderblockierungen bei Bedarf.- [ ] **Reverse Proxy**: Nginx, Caddy oder Traefik können eine Schicht Basis-Authentifizierung hinzufügen- [ ] **Canary Tokens**: Platzieren Sie sie in der Nähe der sensiblen Dateien und Anmeldeinformationen, die Sie tatsächlich untersuchen würden, wenn sie angefasst werden.- [ ] **Überwachung**: Nutzen Sie `nmap`, `lsof`, `inotifywait`, `glances`, usw., um Ihre Systeme zu kennen.- [ ] **Backup-Strategie**: Getestet, idealerweise automatisiert und extern gespeichert.- [ ] **Minimales Privileg**: Nicht-root-Container-Benutzer, schreibgeschützte Volumes.
## 📚 Weitere Lektüre
- [Docker Security Best Practices](https://docs.docker.com/develop/security-best-practices/)- [OWASP Docker Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html)- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker)- [Canarytokens.org für Canary Tokens](https://canarytokens.org/)
## Dank
Ein Lob an einige aufmerksame Redditer:
- <em className="cite">[u/JCBird1012](https://www.reddit.com/user/JCBird1012/) - [thread](https://www.reddit.com/r/selfhosted/comments/1hv8jn6/comment/m5rvlzi/).</em>- <em className="cite">[u/Salzig](https://www.reddit.com/user/Salzig/)</em>- <em className="cite">[u/Myelrond](https://www.reddit.com/user/myelrond/)</em>- <em className="cite">[u/shrimpdiddle](https://www.reddit.com/user/shrimpdiddle/)</em>- <em className="cite">[u/troeberry](https://www.reddit.com/user/troeberry/)</em>
Vielen Dank fürs Lesen! Ich hoffe, Sie haben diese Anleitung hilfreich gefunden. Haben Sie Fragen oder Vorschläge? Kontaktieren Sie mich gerne über meine Social-Media-Kanäle unten, oder klicken Sie auf den Link `Edit on GitHub`, um einen Pull Request zu erstellen! ❤️