Ich weiß nicht ob es noch andere gibt die es stört wenn man Docker Containern Zugriff auf den Docker Socket gibt und somit die Container quasi mit RootRechten laufen. Dabei benötigen sie oft nur ein paar Leserechte und keinen Vollzugriff.
Bei mir war Homarr der ausschlaggebende Punkt. Ich nutze es als Dashboard. Darin gibt es zum Beispiel eine schöne Übersicht über alle DockerContainer mit ihrem Status und noch ein paar anderen Dingen.
Aber dafür Homarr den socket-Zugriff einzubinden ???
Warum gibt es nicht so etwas wie einen Proxy dafür wie es ihn auch im normalen Netzwerk gibt. Also ging ich auf die Suche und ich fand etwas!
tecnativa/docker-socket-proxy
Statt solchen Containern direkt den mächtigen /var/run/docker.sock zu geben, verbindet man sie mit dem Socket-Proxy und gibt nur die API-Bereiche frei, die sie wirklich benötigen.
Vorteil: Sollte einer dieser Container eine Sicherheitslücke aufweisen, verhindert der Proxy, dass ein Angreifer über den Docker-Socket die volle Kontrolle über den Host übernimmt. Gerade wer sein NAS nach draußen geöffnet hat sollte vielleicht drüber nachdenken.
Die wichtigsten Vorteile auf einen Blick:
- Eingeschränkter API-Zugriff: Du bestimmst per Umgebungsvariablen exakt, welche Befehle (z. B. nur lesen/GET) ein Container an Docker senden darf.
- Schutz vor Manipulation: Gefährliche API-Endpunkte (wie das Starten/Löschen von Containern oder das Erstellen von Privileged-Containern) werden standardmäßig blockiert (HTTP 403 Forbidden).
- Minimales Rechtesystem: Selbs wenn ein Container über ein Sicherheitsloch gehackt wird, kann der Angreifer nicht über den Docker-Socket die Kontrolle über dein gesamtes System übernehmen.
- Einfache Konfiguration: Basiert auf HAProxy und lässt sich simpel über Environment-Variablen steuern.
Als kleines Beispiel hänge ich mal den Stack den ich für Homarr nutze an. Dann könnt ihr vielleicht sehen was ich damit meine:
Display Spoiler
services:
socket-proxy:
image: tecnativa/docker-socket-proxy:latest
container_name: homarr-socket-proxy
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:2375/_ping"]
interval: 10s
timeout: 3s
retries: 5
start_period: 10s
environment:
CONTAINERS: "1"
IMAGES: "1"
INFO: "1"
NETWORKS: "1"
SERVICES: "1"
TASKS: "1"
VERSION: "1"
POST: "0"
DELETE: "0"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- socket-proxy
homarr:
image: ghcr.io/homarr-labs/homarr:latest
container_name: homarr
restart: unless-stopped
depends_on:
socket-proxy:
condition: service_healthy
env_file:
- .env
environment:
TZ: Europe/Berlin
DOCKER_HOSTNAMES: socket-proxy
DOCKER_PORTS: "2375"
ports:
- "7575:7575"
volumes:
- ./appdata:/appdata
networks:
- default
- socket-proxy
networks:
socket-proxy:
internal: true
Display More
Das soll jetzt keine Anleitung sein, aber vielleicht nützt es ja jemandem. Mehr Infos findet ihr auf der Projektseite.