Welche bewährten und umfassenden Vorgehensweisen sollten beim Ausführen von Docker in der Produktion beachtet werden?

42

Schließlich lieben Sie Docker so sehr, dass Sie Ihre geschäftskritischen Online-Produktionssysteme mit vertraulichen Kundendaten auf einen Docker-Schwarm verlagern möchten. Einige hätten es vielleicht sogar schon getan. Die andere Organisation kann es sich nicht leisten, wenn eine Richtlinie verbietet, dass Produktionsprozesse im Root-Modus ausgeführt werden.

Was könnte eine Checkliste mit Bausteinen sein, die für eine Docker-Produktionsumgebung in Betracht gezogen werden sollten? Man braucht nicht alle, aber alle sollten wichtig sein, um beurteilt zu werden.

Haftungsausschluss: Ich weiß, dass es eine SE-Richtlinie gibt, um "große endlose Listen" zu vermeiden, aber ich denke, diese Checkliste kann nicht sehr groß sein ... und ist heutzutage endlos.

Also - was sind diese Bausteine?

  1. Wenn noch nicht implementiert, sollten Sie ein Linux-Hostsystem mit erweiterten Sicherheitseinstellungen (gehärteter Kernel, SELinux usw.) ausführen.
  2. Erwägen Sie die Verwendung eines winzigen Docker-Basisbilds, wie z. B. "Alpine", "Busybox" oder "Scratch". Beginnen Sie beispielsweise mit einem leeren Basisbild
  3. Verwenden Sie eine andere USER-Einstellung als root
  4. Prüfen Sie sorgfältig, ob die bereits eingeschränkten Kernelfunktionen, die dem Container gewährt werden, noch weiter reduziert werden können
  5. Erwägen Sie, nur eine ausführbare Binärdatei pro Container zu haben, um Ihren Prozess zu starten, idealerweise statisch verknüpft
  6. Diejenigen, die Ihr System unterbrechen möchten, um einen Shell-Zugriff zu erhalten, fragen sich möglicherweise, ob in Ihrem Container alle Shells deaktiviert sind
  7. Aktivieren Sie schreibgeschützte Volumes, wo dies nur möglich ist

Frage: was noch?

Peter
quelle
Ich finde das sehr breit. Gleichzeitig gefiel mir die Frage. Also werde ich die Community darüber entscheiden lassen :)
Dawny33
Was bedeutet der Tag devsecops?
030
Können Sie erklären, warum dies Consider using a tiny Docker base image, like alpine, busybox or even scratch e.g. start with an empty base imagedie Sicherheit erhöht?
030
3
@ 030 Je weniger Sie installiert haben, desto besser können Sie sich vor nicht benötigten Diensten / Software schützen, die nicht gewartet werden und / oder möglicherweise ausgenutzt werden können. Das Reduzieren auf das Nötigste wird immer besser funktionieren, da jeder Container dazu verwendet werden soll, eine einzelne Dienstleistung zu erbringen.
Leon

Antworten:

23

Der Host, auf dem die Container ausgeführt werden

Führen Sie die Docker-Sicherheitsbank auf jedem Knoten aus, auf dem Docker-Container ausgeführt werden: https://github.com/docker/docker-bench-security

Führen Sie den folgenden Befehl auf einem Knoten aus, auf dem Docker-Container ausgeführt werden:

docker run -it --net host --pid host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

gibt eine Liste von Schecks zurück:

[INFO] 1 - Host Configuration

[WARN] 1.1  - Ensure a separate partition for containers has been created

[NOTE] 4.2  - Ensure that containers use trusted base images

[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image

Zitat aus dem Repository README:

Die Docker Bench for Security ist ein Skript, das nach Dutzenden gängiger Best Practices zum Bereitstellen von Docker-Containern in der Produktion sucht. Die Tests sind alle automatisiert und basieren auf dem CIS Docker Community Edition Benchmark v1.1.0 .

Einige der Probleme, die von der Sicherheitsbank gemeldet werden, können behoben werden, indem der offizielle Docker-Sicherheitsartikel gelesen und mit den in der Frage definierten Aufzählungszeichen verglichen wird. Die folgenden Dinge sind ebenfalls wichtig:

  • Schützen Sie den Docker-Daemon-Socket, indem Sie ssl implementieren
  • Inhaltsvertrauen mit Notar und DOCKER_CONTENT_TRUSTVariable
030
quelle
7

Docker befindet sich noch in der Entwicklung.

Wie bei allen anderen Software-In-Dev-Fehlern können unsichere Funktionen hinzugefügt werden, und es kann zu Architekturfehlern kommen, die zu Sicherheitsverletzungen führen. Unterschätze das nicht! Ihr System ist heute vielleicht völlig sicher, aber mit dem Patch von nächster Woche findet jemand einen Fehler, schreibt einen Exploit und plötzlich ist Ihr System weit offen.

Aktualisieren Sie nicht auf die neueste Version, es sei denn, Sie müssen. Verwenden Sie stattdessen die neueste, gut getestete Version.

Docker ist keine Virtualisierung

Wenn jemand aus einem Docker-Container entkommt, befindet sich dieser Angreifer sofort auf dem realen Computer. Es gibt kein zweites Tor wie die Virtualisierung, das einen Verstoß verhindert.

Behandeln Sie einen Docker-Container wie jedes andere Programm. Führen Sie das Programm mit den niedrigstmöglichen Benutzerrechten aus, blockieren Sie den gesamten Netzwerkverkehr, der nicht erforderlich ist, und virtualisieren Sie den gesamten Docker-Host, wenn die Leistung dies zulässt.

Docker ist kein Schutz

Der Code, der in Docker-Containern ausgeführt wird, wird ohne Frage von Docker ausgeführt. Jeder Angreifer kann einfach seine Software im Container installieren, und Docker führt diese wie jeden anderen Code aus.

Abgesehen von den Dingen, die Sie in der Frage erwähnt haben, sollten Sie Metriken und Warnungen verwenden, um benachrichtigt zu werden, wenn ein Docker-Image seltsame Dinge tut. Gibt es einen plötzlichen, andauernden CPU-Anstieg? Überprüft das Programm plötzlich die Netzwerkports? Gibt es verdächtigen Festplattenzugriff? Sie sollten eine Benachrichtigung erhalten, wenn dies passiert. Es gibt viele Tools, mit denen Sie diese Dinge messen können. Sie sollten sie verwenden.

TwoThe
quelle
7

Docker-Images selbst

Eine zusätzliche Option ist die Verwendung von Clair .

Clair ist ein Open-Source-Projekt zur statischen Analyse von Schwachstellen in Anwendungscontainern (derzeit einschließlich appc und docker).

In regelmäßigen Abständen erfasst Clair Schwachstellen-Metadaten aus einem konfigurierten Satz von Quellen und speichert sie in der Datenbank.

Clients verwenden die Clair-API, um ihre Container-Images zu indizieren. Dadurch wird eine Liste der im Bild vorhandenen Features erstellt und in der Datenbank gespeichert.

Clients verwenden die Clair-API, um die Datenbank nach Schwachstellen eines bestimmten Bildes abzufragen. Das Korrelieren von Schwachstellen und Funktionen erfolgt für jede Anforderung, sodass keine Bilder erneut gescannt werden müssen.

Wenn Aktualisierungen von Schwachstellen-Metadaten erfolgen, kann eine Benachrichtigung an Warnsysteme gesendet werden, dass eine Änderung stattgefunden hat.

Unser Ziel ist es, eine transparentere Sicht auf die Sicherheit von Container-basierten Infrastrukturen zu ermöglichen. So wurde das Projekt nach dem französischen Begriff Clair benannt, was klar, hell und transparent bedeutet.

030
quelle
5

Zusätzlich zu den Punkten in diesem Thread; Folgendes wäre meine Empfehlung:

  • Übernehmen Sie mit dumb-init die Kontrolle über Docker PID1
  • Führen Sie docker nicht in der Produktion ohne ein Container-Orchestrierungssystem aus
    • Treffen Sie Ihre Wahl aus Kubernetes, Mesos, Swarm usw.
  • Verwenden Sie gosu zur Benutzersteuerung in einem Docker-Bild
  • Befolgen Sie das 12-Faktor-App-Paradigma. Wenn Sie stateful-Apps in Containern ausführen, ändern Sie es.
    • Wenn Sie wirklich Stateful-Apps (MySQL, Zookeeper, Elasticsearch) in Containern ausführen müssen, nutzen Sie Orchestrator-Paradigmen wie Kubernetes Statefulsets
  • Erledige ein robustes Secret / Config Management mit Tools wie Hashicorp Vault / Consul
  • Versenden Sie den gleichen Container, den die Entwickler gebaut haben, um ihn durch eine CI-Pipeline zu transportieren, die ihn durch Staging- und Integrationstests führt.
  • Erstellen Sie Benachrichtigungen rund um CVEs und Patches, lösen Sie Builds auf Patch-Benachrichtigungen aus
  • Umfassende Protokollierung, um einen Einblick in den laufenden Container zu erhalten. Sie möchten den devs-SSH-Zugriff weder auf den Host noch auf die Container gewähren
    • Empfehlung: fließend
  • Haben Sie sowohl Container- als auch Host-Metriken
    • empfehlung: prometheus + node-exporter
Hashfyre
quelle
2

Wenn Sie Ihren Docker-Eintrittspunkt mit sedBefehlen füllen , beachten Sie diese Vorgehensweise:

  • Verwenden Sie ein Tool wie confd , um die Konfigurationsdateien Ihrer Docker-Images zu verwalten und auf dem neuesten Stand zu halten

Confd liest Daten aus vielen unterstützten Schlüsselwertspeichern und rendert Konfigurationsvorlagen dynamisch.

Vincenzo Pii
quelle
0

Man könnte A2D verwenden , um eine App in ein Docker-Image zu backen, wobei bestimmte Dinge berücksichtigt werden, z. B. Nicht-Root-Berechtigungen, Position der App:

docker run -v $PWD:/projectName utrecht/a2d:1.0.0 \
       -projectName someProjectName -dockerfile /projectName/Dockerfile

kehrt zurück:

FROM golang:1.12.4-alpine as builder
COPY . ./someProjectName/
WORKDIR someProjectName
RUN adduser -D -g '' someProjectName && \
    apk add git && \
    CGO_ENABLED=0 go build && \
    cp someProjectName /someProjectName && \
    chmod 100 /someProjectName

FROM scratch
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder --chown=someProjectName:someProjectName /someProjectName /usr/local/someProjectName
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER someProjectName
ENTRYPOINT ["/usr/local/someProjectName"]
030
quelle