Task- und Containersicherheit - Amazon Elastic Container Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Task- und Containersicherheit

Sie sollten das Container-Abbild als erste Verteidigungslinie gegen einen Angriff betrachten. Ein unsicheres, schlecht konstruiertes Bild kann es einem Angreifer ermöglichen, den Grenzen des Containers zu entkommen und Zugriff auf den Host zu erlangen. Sie sollten Folgendes tun, um das Risiko zu verringern, dass dies geschieht.

Recommendations

Wir empfehlen, beim Einrichten Ihrer Aufgaben und Container wie folgt vorzugehen:

Erstellen Sie minimale Bilder oder verwenden Sie verteilungslose Bilder

Beginnen Sie, indem Sie alle fremden Binärdateien aus dem Containerabbild entfernen. Wenn Sie ein unbekanntes Bild aus Docker Hub verwenden, überprüfen Sie das Bild, um auf den Inhalt der einzelnen Layer des Containers zu verweisen. Sie können eine Anwendung wieTauchgangum dies zu tun.

Sie können aber auch die verwendenverteilungslos-Images, die nur Ihre Anwendung und ihre Laufzeitabhängigkeiten enthalten. Sie enthalten keine Paketmanager oder Shells. Distroless Bilder verbessern das „Signal zum Rauschen von Scannern und reduzieren die Belastung der Provenienz auf genau das, was Sie brauchen.“ Weitere Informationen finden Sie in der GitHub Dokumentation aufverteilungslos.

Docker verfügt über einen Mechanismus zum Erstellen von Bildern aus einem reservierten, minimalen Bild namenskratzer. Weitere Informationen finden Sie unterErstellen eines einfachen übergeordneten Images mitkratzerin der Docker-Dokumentation. Mit Langages wie Go können Sie eine statische verknüpfte Binärdatei erstellen und sie in Ihrer Dockerfile referenzieren. Das folgende Beispiel zeigt, wie Sie dies erreichen können.

############################ # STEP 1 build executable binary ############################ FROM golang:alpine AS builder # Install git. # Git is required for fetching the dependencies. RUN apk update && apk add --no-cache git WORKDIR $GOPATH/src/mypackage/myapp/ COPY . . # Fetch dependencies. # Using go get. RUN go get -d -v # Build the binary. RUN go build -o /go/bin/hello ############################ # STEP 2 build a small image ############################ FROM scratch # Copy our static executable. COPY --from=builder /go/bin/hello /go/bin/hello # Run the hello binary. ENTRYPOINT ["/go/bin/hello"] This creates a container image that consists of your application and nothing else, making it extremely secure.

Das vorherige Beispiel ist auch ein Beispiel für einen mehrstufigen Build. Diese Arten von Builds sind aus Sicherheitsaspekt attraktiv, da Sie sie verwenden können, um die Größe des endgültigen Abbilds zu minimieren, das an Ihre Containerregistrierung gesendet wird. Container-Images ohne Build-Tools und andere fremde Binärdateien verbessern Ihre Sicherheitslage, indem die Angriffsoberfläche des Bildes reduziert wird. Weitere Informationen zu mehrstufigen Builds finden Sie unterErstellen von mehrstufigen Builds.

Scannen Sie Ihre Bilder auf Schwachstellen

Ähnlich wie ihre Gegenstücke zu virtuellen Maschinen können Container-Images Binärdateien und Anwendungsbibliotheken mit Schwachstellen enthalten oder im Laufe der Zeit Schwachstellen entwickeln. Der beste Weg, um gegen Exploits zu schützen, ist das regelmäßige Scannen Ihrer Bilder mit einem Bildscanner. Bilder, die in Amazon ECR gespeichert sind, können per Push oder On-Demand (einmal alle 24 Stunden) gescannt werden. Amazon ECR verwendet derzeitClair, eine Open-Source-Lösung für Images Scannen. Nachdem ein Bild gescannt wurde, werden die Ergebnisse im Amazon ECR-Ereignisstream in Amazon EventBridge protokolliert. Sie können die Ergebnisse eines Scans auch über die Amazon ECR-Konsole oder über den Aufruf derDescribeImageScanFindings-API. Bilder mit einemHIGHoder .CRITICALSicherheitsanfälligkeit sollte gelöscht oder neu erstellt werden. Wenn ein bereitgestelltes Image eine Sicherheitsanfälligkeit entwickelt, sollte es so schnell wie möglich ersetzt werden.

Docker Desktop Edge, Version 2.3.6.0oder höher könnenscanlokale Bilder. Die Scans werden vonSnyk, einem Anwendungssicherheitsdienst. Wenn Schwachstellen entdeckt werden, identifiziert Snyk die Layer und Abhängigkeiten mit der Sicherheitsanfälligkeit in der Dockerdatei. Es empfiehlt auch sichere Alternativen wie die Verwendung eines schlankeren Basis-Images mit weniger Sicherheitslücken oder das Upgrade eines bestimmten Pakets auf eine neuere Version. Mithilfe des Docker-Scans können Entwickler potenzielle Sicherheitsprobleme beheben, bevor sie ihre Images in die Registrierung übertragen.

Entfernen Sie spezielle Berechtigungen aus Ihren Bildern

Die Zugriffsrechte-Flagssetuidundsetgiderlauben das Ausführen einer ausführbaren Datei mit den Berechtigungen des Eigentümers oder der Gruppe der ausführbaren Datei. Entfernen Sie alle Binärdateien mit diesen Zugriffsrechten aus Ihrem Bild, da diese Binärdateien zum Eskalieren von Berechtigungen verwendet werden können. Ziehen Sie in Erwägung, alle Shells und Dienstprogramme wiencundcurl, die für böswillige Zwecke verwendet werden können. Sie finden die Dateien mitsetuidundsetgid-Zugriffsrechte mithilfe des folgenden Befehls.

find / -perm /6000 -type f -exec ls -ld {} \;

Um diese speziellen Berechtigungen aus diesen Dateien zu entfernen, fügen Sie die folgende Anweisung zu Ihrem Containerabbild hinzu.

RUN find / -xdev -perm /6000 -type f -exec chmod a-s {} \; || true

Erstellen einer Reihe von kuratierten Bildern

Anstatt Entwicklern die Erstellung eigener Images zu ermöglichen, erstellen Sie eine Reihe geprüfter Images für die verschiedenen Anwendungsstapel in Ihrer Organisation. Auf diese Weise können Entwickler auf das Erlernen von Dockerfiles verzichten und sich auf das Schreiben von Code konzentrieren. Wenn Änderungen in Ihrer Codebasis zusammengeführt werden, kann eine CI/CD-Pipeline das Asset automatisch kompilieren und dann in einem Artefakt-Repository speichern. Kopieren Sie das Artefakt zuletzt in das entsprechende Bild, bevor Sie es an eine Docker-Registrierung wie Amazon ECR übertragen. Zumindest sollten Sie eine Reihe von Basisbildern erstellen, aus denen Entwickler ihre eigenen Dockerfiles erstellen können. Sie sollten vermeiden, Bilder von Docker Hub zu ziehen. Sie wissen nicht immer, was sich im Bild befindet und etwa ein Fünftel der Top 1000 Bilder haben Schwachstellen. Eine Liste dieser Bilder und ihrer Schwachstellen finden Sie unterhttps://vulnerablecontainers.org/.

Anwendungspakete und Bibliotheken auf Schwachstellen durchsuchen

Die Verwendung von Open-Source-Bibliotheken ist jetzt üblich. Wie bei Betriebssystemen und Betriebssystempaketen können diese Bibliotheken Schwachstellen aufweisen. Im Rahmen des Entwicklungslebenszyklus sollten diese Bibliotheken gescannt und aktualisiert werden, wenn kritische Schwachstellen gefunden werden.

Docker Desktop führt lokale Scans mit Snyk durch. Es kann auch verwendet werden, um Schwachstellen und potenzielle Lizenzierungsprobleme in Open-Source-Bibliotheken zu finden. Es kann direkt in Entwickler-Workflows integriert werden und gibt Ihnen die Möglichkeit, Risiken durch Open-Source-Bibliotheken zu minimieren. Weitere Informationen finden Sie in den folgenden Themen:

Statische Codeanalyse durchführen

Sie sollten eine statische Code-Analyse durchführen, bevor Sie ein Container-Image erstellen. Es wird gegen Ihren Quellcode durchgeführt und wird verwendet, um Codierungsfehler und Code zu identifizieren, die von einem böswilligen Akteur ausgenutzt werden könnten, wie z.B. Fehlerinjektionen. SonarQubeist eine beliebte Option für statische Anwendungssicherheitstests (SAST) mit Unterstützung für eine Vielzahl verschiedener Programmiersprachen.

Ausführen von Containern als Nicht-Root-Benutzer

Sie sollten Container als nicht als Stammbenutzer ausführen. Standardmäßig werden Container alsroot-Benutzer, es sei dennUSER-Direktive in Ihrer Dockerfile enthalten ist. Die standardmäßigen Linux-Funktionen, die von Docker zugewiesen werden, beschränken die Aktionen, die alsroot, aber nur marginal. Beispiel: Ein Container, der alsrootist immer noch nicht auf Geräte zuzugreifen erlaubt.

Als Teil Ihrer CI/CD-Pipeline sollten Sie Dockerfiles lint, um nach demUSER-Direktive und schlagen den Build fehl, wenn er fehlt. Weitere Informationen finden Sie in den folgenden Themen:

  • Docker-File-Lintist ein Open-Source-Tool von RedHat, mit dem überprüft werden kann, ob die Datei den Best Practices entspricht.

  • Hadolintist ein weiteres Werkzeug zum Erstellen von Docker-Images, die den Best Practices entsprechen.

Verwenden eines schreibgeschützten Root-Dateisystems

Sie sollten ein schreibgeschütztes Root-Dateisystem verwenden. Standardmäßig ist das Stammdateisystem eines Containers schreibbar. Wenn Sie einen Container mit einemRO(schreibgeschütztes) Root-Dateisystem zwingt es Sie, explizit zu definieren, wo Daten gespeichert werden können. Dadurch wird die Angriffsoberfläche reduziert, da das Dateisystem des Containers nur geschrieben werden kann, wenn Berechtigungen ausdrücklich erteilt werden.

Anmerkung

Ein schreibgeschütztes Root-Dateisystem kann Probleme mit bestimmten Betriebssystem-Paketen verursachen, die erwarten, dass sie in das Dateisystem schreiben können. Wenn Sie vorhaben, schreibgeschützte Root-Dateisysteme zu verwenden, testen Sie vorher gründlich.

Konfigurieren von Aufgaben mit CPU- und Speicherlimits (Amazon EC2)

Sie sollten Aufgaben mit CPU- und Speicherbeschränkungen konfigurieren, um das folgende Risiko zu minimieren. Die Ressourcenbeschränkungen eines Vorgangs legen eine Obergrenze für die Menge an CPU und Arbeitsspeicher fest, die von allen Containern innerhalb eines Vorgangs reserviert werden können. Wenn keine Limits festgelegt sind, haben Aufgaben Zugriff auf die CPU und den Arbeitsspeicher des Hosts. Dies kann zu Problemen führen, bei denen Aufgaben, die auf einem gemeinsam genutzten Host bereitgestellt werden, andere Aufgaben von Systemressourcen verhungern können.

Anmerkung

Amazon ECS aufAWS Fargate-Aufgaben müssen Sie CPU- und Speicherlimits angeben, da diese Werte für Abrechnungszwecke verwendet werden. Eine Aufgabe, bei der alle Systemressourcen erfasst werden, ist kein Problem für Amazon ECS Fargate, da jede Aufgabe auf einer eigenen dedizierten Instance ausgeführt wird. Wenn Sie kein Speicherlimit angeben, weist Amazon ECS jedem Container mindestens 4 MB zu. Wenn für die Aufgabe kein CPU-Limit festgelegt ist, weist der Amazon ECS-Container-Agent ihr mindestens 2 CPUs zu.

Verwenden von unveränderlichen Tags mit Amazon ECR

Mit Amazon ECR können und sollten Sie Bilder mit unveränderlichen Tags konfigurieren. Dadurch wird verhindert, dass eine geänderte oder aktualisierte Version eines Bildes mit einem identischen Tag in Ihr Bild-Repository verschoben wird. Dies schützt vor einem Angreifer, der eine kompromittierte Version eines Images mit demselben Tag über Ihr Image schiebt. Indem Sie unveränderliche Tags verwenden, zwingen Sie sich effektiv, ein neues Bild mit einem anderen Tag für jede Änderung zu schieben.

Vermeiden Sie das Ausführen von Containern als privilegiert (Amazon EC2)

Sie sollten vermeiden, Container als privilegiert auszuführen. Für den Hintergrund werden Container alsprivilegedwerden mit erweiterten Berechtigungen auf dem Host ausgeführt. Dies bedeutet, dass der Container alle Linux-Funktionen erbt, dierootauf dem Host. Die Verwendung sollte streng eingeschränkt oder verboten sein. Wir empfehlen, die Amazon ECS-Container-Agenten-Umgebungsvariable festzulegenECS_DISABLE_PRIVILEGEDauftrue, um zu verhindern, dass Container alsprivilegedauf bestimmten Hosts, wennprivilegedwird nicht benötigt. Sie können aber auch die verwendenAWS Lambda, um Ihre Aufgabendefinitionen für die Verwendung desprivileged-Parameter.

Anmerkung

Ausführen eines Containers alsprivilegedwird auf Amazon ECS nicht unterstütztAWS Fargate.

Entfernen Sie unnötige Linux-Funktionen aus dem Container

Im Folgenden finden Sie eine Liste der Standard-Linux-Funktionen, die Docker-Containern zugewiesen sind. Weitere Informationen zu den einzelnen Funktionen finden Sie unterÜbersicht über Linux-Funktionen.

CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER, CAP_FSETID, CAP_KILL, CAP_SETGID, CAP_SETUID, CAP_SETPCAP, CAP_NET_BIND_SERVICE, CAP_NET_RAW, CAP_SYS_CHROOT, CAP_MKNOD, CAP_AUDIT_WRITE, CAP_SETFCAP

Wenn für einen Container nicht alle oben aufgeführten Docker-Kernfunktionen erforderlich sind, sollten Sie diese aus dem Container löschen. Weitere Informationen zu den einzelnen Docker-Funktionen finden Sie unterKernalCapabilities. Sie können herausfinden, welche Funktionen verwendet werden, indem Sie Folgendes tun:

  • Installieren Sie das Betriebssystem-Paketlibcap-ngführen Sie das aus:pscap, um die Funktionen aufzulisten, die jeder Prozess verwendet.

  • Sie können auchcapsh, um zu entschlüsseln, welche Funktionen ein Prozess verwendet.

  • Weitere Informationen finden SieLinux-Funktionen 101Weitere Informationen finden Sie unter.

Verwenden eines Customer Managed Key (CMK), um Bilder zu verschlüsseln, die an Amazon ECR gesendet wurden.

Sie sollten einen vom Kunden verwalteten Schlüssel (CMK) verwenden, um Bilder zu verkörpern, die an Amazon ECR gesendet werden. Bilder, die an Amazon ECR übertragen werden, werden im Ruhezustand automatisch mit einemAWS Key Management Service(AWS KMS-verwalteter Schlüssel. Wenn Sie lieber Ihren eigenen Schlüssel verwenden möchten, unterstützt Amazon ECR jetztAWS KMSVerschlüsselung mit vom Kunden verwalteten Schlüsseln (CMK). Bevor Sie die serverseitige Verschlüsselung mit einem CMK aktivieren, lesen Sie die Überlegungen, die in der Dokumentation zuVerschlüsselung im Ruhezustand.