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.
Netzwerksicherheit
Tipp
Lernen Sie in Amazon
Netzwerksicherheit hat mehrere Facetten. Die erste beinhaltet die Anwendung von Regeln, die den Fluss des Netzwerkverkehrs zwischen Diensten einschränken. Die zweite beinhaltet die Verschlüsselung des Datenverkehrs während der Übertragung. Die Mechanismen zur Umsetzung dieser Sicherheitsmaßnahmen auf EKS sind vielfältig, umfassen jedoch häufig die folgenden Elemente:
Steuerung des Verkehrs
-
Netzwerkrichtlinien
-
Sicherheitsgruppen
Netzwerkverschlüsselung
-
Service Mesh
-
Ingress-Controller und Load Balancer
-
Nitro-Instanzen
-
ACM Private CA mit Zertifikatsmanager
Netzwerkrichtlinie
In einem Kubernetes-Cluster ist die gesamte Pod-to-Pod-Kommunikation standardmäßig zulässig. Diese Flexibilität kann zwar dazu beitragen, Experimente zu fördern, wird aber nicht als sicher angesehen. Kubernetes-Netzwerkrichtlinien bieten Ihnen einen Mechanismus, um den Netzwerkverkehr zwischen Pods (oft als East/West Verkehr bezeichnet) sowie zwischen Pods und externen Diensten einzuschränken. Die Kubernetes-Netzwerkrichtlinien funktionieren auf den Ebenen 3 und 4 des OSI-Modells. Netzwerkrichtlinien verwenden Pod-, Namespace-Selektoren und Labels, um Quell- und Ziel-Pods zu identifizieren, können aber auch IP-Adressen, Portnummern, Protokolle oder eine Kombination davon enthalten. Netzwerkrichtlinien können sowohl auf eingehende als auch auf ausgehende Verbindungen zum Pod angewendet werden. Sie werden häufig als Eingangs- und Ausgangsregeln bezeichnet.
Mit der nativen Netzwerkrichtlinien-Unterstützung des Amazon VPC CNI Plug-ins können Sie Netzwerkrichtlinien implementieren, um den Netzwerkverkehr in Kubernetes-Clustern abzusichern. Dies ist in die Upstream-Kubernetes-Netzwerkrichtlinien-API integriert und gewährleistet so die Kompatibilität und Einhaltung der Kubernetes-Standards. Sie können Richtlinien mithilfe verschiedener Identifikatoren definieren, die von der Upstream-API
Wichtig
Wenn Sie zum ersten Mal einen EKS-Cluster bereitstellen, ist die VPC CNI Network Policy-Funktion standardmäßig nicht aktiviert. Stellen Sie sicher, dass Sie die unterstützte Add-on VPC-CNI-Version bereitgestellt haben, und setzen Sie das ENABLE_NETWORK_POLICY Flag auf dem true vpc-cni-Add-on, um dies zu aktivieren. Detaillierte Anweisungen finden Sie im Amazon EKS-Benutzerhandbuch.
Empfehlungen
Erste Schritte mit Netzwerkrichtlinien — Folgen Sie dem Prinzip der geringsten Zugriffsrechte
Erstellen Sie eine Standard-Ablehnungsrichtlinie
Wie bei RBAC-Richtlinien wird empfohlen, bei Netzwerkrichtlinien die Prinzipien des geringsten Privilegierten Zugriffs zu befolgen. Erstellen Sie zunächst eine Deny-All-Richtlinie, die den gesamten eingehenden und ausgehenden Datenverkehr in einem Namespace einschränkt.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress
Standardmäßige Ablehnung
Anmerkung
Das Bild oben wurde mit dem Network Policy Viewer von Tufin erstellt. https://orca.tufin.io/netpol/
Erstellen Sie eine Regel, um DNS-Abfragen zuzulassen
Sobald Sie die Standard-Deny-All-Regel eingerichtet haben, können Sie zusätzliche Regeln hinzufügen, z. B. eine Regel, die es Pods ermöglicht, CoreDNS zur Namensauflösung abzufragen.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53
allow-dns-access
Fügen Sie schrittweise Regeln hinzu, um den Verkehrsfluss zwischen namespaces/pods
Machen Sie sich mit den Anwendungsanforderungen vertraut und erstellen Sie nach Bedarf detaillierte Regeln für den Ein- und Ausgang. Das folgende Beispiel zeigt, wie der eingehende Verkehr über Port 80 auf von beschränkt wird. app-one client-one Dies hilft, die Angriffsfläche zu minimieren und das Risiko eines unbefugten Zugriffs zu verringern.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-app-one namespace: default spec: podSelector: matchLabels: k8s-app: app-one policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: k8s-app: client-one ports: - protocol: TCP port: 80
Allow-Ingress-App-One
Überwachung der Durchsetzung von Netzwerkrichtlinien
-
Verwenden Sie den Editor für Netzwerkrichtlinien
-
Der Netzwerkrichtlinien-Editor
hilft bei der Visualisierung, der Sicherheitsbewertung und der automatischen Generierung aus Netzwerkflussprotokollen -
Erstellen Sie Netzwerkrichtlinien auf interaktive Weise
-
-
Audit-Protokolle
-
Überprüfen Sie regelmäßig die Auditprotokolle Ihres EKS-Clusters
-
Auditprotokolle bieten eine Fülle von Informationen darüber, welche Aktionen auf Ihrem Cluster ausgeführt wurden, einschließlich Änderungen der Netzwerkrichtlinien
-
Verwenden Sie diese Informationen, um Änderungen an Ihren Netzwerkrichtlinien im Laufe der Zeit nachzuverfolgen und unautorisierte oder unerwartete Änderungen zu erkennen
-
-
Automatisiertes Testen
-
Implementieren Sie automatisierte Tests, indem Sie eine Testumgebung erstellen, die Ihre Produktionsumgebung widerspiegelt, und stellen Sie regelmäßig Workloads bereit, die versuchen, Ihre Netzwerkrichtlinien zu verletzen.
-
-
Messwerte überwachen
-
Konfigurieren Sie Ihre Observability-Agents so, dass sie die Prometheus-Metriken von den VPC-CNI-Knotenagenten entfernen, sodass Sie den Zustand der Agenten und SDK-Fehler überwachen können.
-
-
Überprüfen Sie die Netzwerkrichtlinien regelmäßig
-
Überprüfen Sie Ihre Netzwerkrichtlinien regelmäßig, um sicherzustellen, dass sie Ihren aktuellen Anwendungsanforderungen entsprechen. Während sich Ihre Anwendung weiterentwickelt, bietet Ihnen ein Audit die Möglichkeit, redundante Regeln für den Ein- und Ausgang zu entfernen und sicherzustellen, dass Ihre Anwendungen nicht über übermäßige Berechtigungen verfügen.
-
-
Stellen Sie mithilfe von Open Policy Agent (OPA) sicher, dass Netzwerkrichtlinien vorhanden sind
-
Verwenden Sie die OPA-Richtlinie wie unten gezeigt, um sicherzustellen, dass die Netzwerkrichtlinie immer vorhanden ist, bevor Sie Anwendungs-Pods integrieren. Diese Richtlinie verweigert das Onboarding von k8s-Pods mit einem Label,
k8s-app: sample-appwenn keine entsprechende Netzwerkrichtlinie existiert.
-
package kubernetes.admission import data.kubernetes.networkpolicies deny[msg] { input.request.kind.kind == "Pod" pod_label_value := {v["k8s-app"] | v := input.request.object.metadata.labels} contains_label(pod_label_value, "sample-app") np_label_value := {v["k8s-app"] | v := networkpolicies[_].spec.podSelector.matchLabels} not contains_label(np_label_value, "sample-app") msg:= sprintf("The Pod %v could not be created because it is missing an associated Network Policy.", [input.request.object.metadata.name]) } contains_label(arr, val) { arr[_] == val }
Fehlerbehebung
Überwachen Sie die Protokolle vpc-network-policy-controller und node-Agent
Aktivieren Sie die EKS Control Plane Controller Manager-Protokolle, um die Funktionalität der Netzwerkrichtlinien zu diagnostizieren. Sie können die Protokolle der Kontrollebene in eine CloudWatch Protokollgruppe streamen und CloudWatch Log Insights verwenden, um erweiterte Abfragen durchzuführen. In den Protokollen können Sie sehen, welche Pod-Endpunktobjekte in eine Netzwerkrichtlinie aufgelöst wurden, den Abstimmungsstatus der Richtlinien und debuggen, ob die Richtlinie erwartungsgemäß funktioniert.
Darüber hinaus ermöglicht Ihnen Amazon VPC CNI, die Erfassung und den Export von Protokollen zur Richtliniendurchsetzung von den EKS-Worker-Knoten aus zu
Amazon VPC CNI liefert auch ein SDK, das eine Schnittstelle für die Interaktion mit eBPF-Programmen auf dem Knoten bietet. Das SDK wird installiert, wenn es auf den aws-node Knoten bereitgestellt wird. Sie finden die installierte SDK-Binärdatei im /opt/cni/bin Verzeichnis auf dem Knoten. Beim Start unterstützt das SDK grundlegende Funktionen wie die Überprüfung von eBPF-Programmen und -Maps.
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
Protokollieren Sie die Metadaten des Netzwerkverkehrs
AWS VPC Flow Logs erfasst Metadaten über den Datenverkehr, der durch eine VPC fließt, wie Quell- und Ziel-IP-Adresse und Port sowie Pakete. accepted/dropped Diese Informationen könnten analysiert werden, um nach verdächtigen oder ungewöhnlichen Aktivitäten zwischen Ressourcen innerhalb der VPC, einschließlich Pods, zu suchen. Da sich die IP-Adressen von Pods jedoch häufig ändern, wenn sie ersetzt werden, reichen Flow Logs allein möglicherweise nicht aus. Calico Enterprise erweitert die Flow Logs um Pod-Labels und andere Metadaten, wodurch es einfacher wird, die Verkehrsflüsse zwischen den Pods zu entschlüsseln.
Sicherheitsgruppen
EKS verwendet AWS VPC Security Groups (SGs), um den Verkehr zwischen der Kubernetes-Steuerungsebene und den Worker-Knoten des Clusters zu steuern. Sicherheitsgruppen werden auch verwendet, um den Verkehr zwischen Worker-Knoten und anderen VPC-Ressourcen sowie externen IP-Adressen zu steuern. Wenn Sie einen EKS-Cluster (mit Kubernetes-Version 1.14-eks.3 oder höher) bereitstellen, wird automatisch eine Cluster-Sicherheitsgruppe für Sie erstellt. Diese Sicherheitsgruppe ermöglicht die uneingeschränkte Kommunikation zwischen der EKS-Steuerungsebene und den Knoten aus verwalteten Knotengruppen. Der Einfachheit halber wird empfohlen, den Cluster SG allen Knotengruppen hinzuzufügen, einschließlich nicht verwalteter Knotengruppen.
Vor Kubernetes-Version 1.14 und EKS-Version eks.3 wurden separate Sicherheitsgruppen für die EKS-Steuerungsebene und die Knotengruppen konfiguriert. Die Mindestregeln und die empfohlenen Regeln für die Sicherheitsgruppen der Steuerungsebene und der Knotengruppe finden Sie unter https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html. Die Mindestregeln für die Sicherheitsgruppe der Steuerungsebene erlauben den vom Worker-Knoten SG eingehenden Port 443. Diese Regel ermöglicht es den Kubelets, mit dem Kubernetes-API-Server zu kommunizieren. Es enthält auch Port 10250 für ausgehenden Verkehr zum Worker Node SG; 10250 ist der Port, auf dem die Kubelets lauschen. In ähnlicher Weise erlauben die Mindestregeln für Knotengruppen den Port 10250, der von der Steuerungsebene SG eingeht, und 443, der von der Steuerungsebene SG ausgeht. Schließlich gibt es eine Regel, die eine uneingeschränkte Kommunikation zwischen Knoten innerhalb einer Knotengruppe ermöglicht.
Wenn Sie die Kommunikation zwischen Diensten, die innerhalb des Clusters ausgeführt werden, und Diensten, die außerhalb des Clusters ausgeführt werden, wie z. B. einer RDS-Datenbank, kontrollieren müssen, sollten Sie Sicherheitsgruppen für Pods in Betracht ziehen. Mit Sicherheitsgruppen für Pods können Sie einer Sammlung von Pods eine vorhandene Sicherheitsgruppe zuweisen.
Warnung
Wenn Sie auf eine Sicherheitsgruppe verweisen, die vor der Erstellung der Pods nicht existierte, werden die Pods nicht geplant.
Sie können steuern, welche Pods einer Sicherheitsgruppe zugewiesen werden, indem Sie ein SecurityGroupPolicy Objekt erstellen und a PodSelector oder a angebenServiceAccountSelector. Wenn Sie die Selektoren auf setzen, {} werden die SGs, auf die in der verwiesen wirdSecurityGroupPolicy, allen Pods in einem Namespace oder allen Dienstkonten in einem Namespace zugewiesen. Stellen Sie sicher, dass Sie sich mit allen Überlegungen vertraut gemacht haben, bevor Sie Sicherheitsgruppen für Pods implementieren.
Wichtig
Wenn Sie SGs für Pods verwenden, müssen Sie SGs erstellen, die Port 53 für ausgehende Verbindungen zur Cluster-Sicherheitsgruppe zulassen. Ebenso müssen Sie die Cluster-Sicherheitsgruppe aktualisieren, um den eingehenden Port 53-Verkehr von der Pod-Sicherheitsgruppe zu akzeptieren.
Wichtig
Die Grenzwerte für Sicherheitsgruppen gelten weiterhin, wenn Sicherheitsgruppen für Pods verwendet werden. Verwenden Sie sie daher mit Bedacht.
Wichtig
Sie müssen Regeln für den eingehenden Datenverkehr aus der Cluster-Sicherheitsgruppe (Kubelet) für alle für den Pod konfigurierten Probes erstellen.
Wichtig
Sicherheitsgruppen für Pods basieren auf einer Funktion namens ENI-Trunking, die entwickelt wurde, um die ENI-Dichte einer EC2-Instance zu erhöhen. Wenn ein Pod einem SG zugewiesen wird, ordnet ein VPC-Controller dem Pod eine Branch-ENI aus der Knotengruppe zu. Wenn zum Zeitpunkt der Planung des Pods nicht genügend Branch-ENIs in einer Knotengruppe verfügbar sind, verbleibt der Pod im Status Ausstehend. Die Anzahl der Branch-ENIs, die eine Instance unterstützen kann, ist je nach Instance unterschiedlich. type/family Weitere Informationen finden Sie unter https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html #supported -instance-types.
Sicherheitsgruppen für Pods bieten zwar eine AWS-native Möglichkeit, den Netzwerkverkehr innerhalb und außerhalb Ihres Clusters ohne den Overhead eines Policy-Daemons zu kontrollieren, aber es sind auch andere Optionen verfügbar. Mit der Cilium Policy Engine können Sie beispielsweise in einer Netzwerkrichtlinie auf einen DNS-Namen verweisen. Calico Enterprise beinhaltet eine Option für die Zuordnung von Netzwerkrichtlinien zu AWS-Sicherheitsgruppen. Wenn Sie ein Service Mesh wie Istio implementiert haben, können Sie ein Egress-Gateway verwenden, um den Netzwerkausgang auf bestimmte, vollständig qualifizierte Domänen oder IP-Adressen zu beschränken. Weitere Informationen zu dieser Option finden Sie in der dreiteiligen Serie zur Steuerung des ausgehenden Datenverkehrs in Istio.
Wann sollte man Network Policy im Vergleich zu Security Group für Pods verwenden?
Wann sollte die Kubernetes-Netzwerkrichtlinie verwendet werden
-
Steuerung des Pod-zu-Pod-Datenverkehrs
-
Geeignet für die Steuerung des Netzwerkverkehrs zwischen Pods innerhalb eines Clusters (Ost-West-Verkehr)
-
-
Steuern Sie den Verkehr auf IP-Adresse- oder Portebene (OSI-Schicht 3 oder 4)
Wann sollten AWS-Sicherheitsgruppen für Pods (SGP) verwendet werden
-
Nutzen Sie vorhandene AWS-Konfigurationen
-
Wenn Sie bereits über einen komplexen Satz von EC2-Sicherheitsgruppen verfügen, die den Zugriff auf AWS-Services verwalten, und Sie Anwendungen von EC2-Instances zu EKS migrieren, können SGPs eine sehr gute Wahl sein, da Sie Sicherheitsgruppenressourcen wiederverwenden und auf Ihre Pods anwenden können.
-
-
Kontrollieren Sie den Zugriff auf AWS-Services
-
Ihre Anwendungen, die in einem EKS-Cluster ausgeführt werden, möchten mit anderen AWS-Services (RDS-Datenbank) kommunizieren. Verwenden Sie SGPs als effizienten Mechanismus zur Steuerung des Datenverkehrs von den Pods zu den AWS-Services.
-
-
Isolierung des Pod- und Node-Datenverkehrs
-
Wenn Sie den Pod-Verkehr vollständig vom Rest des Knotenverkehrs trennen möchten, verwenden Sie SGP im
POD_SECURITY_GROUP_ENFORCING_MODE=strictModus.
-
Bewährte Methoden zur Verwendung von Sicherheitsgruppen für Pods und Netzwerkrichtlinien
-
Mehrschichtige Sicherheit
-
Verwenden Sie eine Kombination aus SGP- und Kubernetes-Netzwerkrichtlinien für einen mehrschichtigen Sicherheitsansatz
-
Verwenden Sie SGPs, um den Zugriff auf AWS-Services auf Netzwerkebene zu beschränken, die nicht Teil eines Clusters sind, während Kubernetes-Netzwerkrichtlinien den Netzwerkverkehr zwischen Pods innerhalb des Clusters einschränken können
-
-
Prinzip der geringsten Rechte
-
Erlauben Sie nur den notwendigen Verkehr zwischen Pods oder Namespaces
-
-
Segmentieren Sie Ihre Anwendungen
-
Segmentieren Sie Anwendungen wo immer möglich anhand der Netzwerkrichtlinie, um den Explosionsradius zu verringern, falls eine Anwendung kompromittiert wird
-
-
Halten Sie die Richtlinien einfach und klar
-
Kubernetes-Netzwerkrichtlinien können sehr detailliert und komplex sein. Es ist am besten, sie so einfach wie möglich zu halten, um das Risiko einer Fehlkonfiguration zu reduzieren und den Verwaltungsaufwand zu verringern
-
-
Reduzieren Sie die Angriffsfläche
-
Minimieren Sie die Angriffsfläche, indem Sie die Gefährdung Ihrer Anwendungen einschränken
-
Wichtig
Sicherheitsgruppen für Pods bieten zwei Erzwingungsmodi: strict undstandard. Sie müssen standard den Modus verwenden, wenn Sie sowohl Netzwerkrichtlinien als auch Sicherheitsgruppen für Pod-Funktionen in einem EKS-Cluster verwenden.
Wenn es um Netzwerksicherheit geht, ist ein mehrstufiger Ansatz oft die effektivste Lösung. Die Kombination von Kubernetes-Netzwerkrichtlinien und SGP kann eine robuste, tiefgreifende Verteidigungsstrategie für Ihre in EKS ausgeführten Anwendungen bieten.
Durchsetzung der Service Mesh-Richtlinien oder Kubernetes-Netzwerkrichtlinie
A service mesh ist eine dedizierte Infrastrukturebene, die Sie Ihren Anwendungen hinzufügen können. Sie ermöglicht es Ihnen, Funktionen wie Beobachtbarkeit, Verkehrsmanagement und Sicherheit transparent hinzuzufügen, ohne sie Ihrem eigenen Code hinzufügen zu müssen.
Service Mesh setzt Richtlinien auf Ebene 7 (Anwendung) des OSI-Modells durch, wohingegen Kubernetes-Netzwerkrichtlinien auf Layer 3 (Netzwerk) und Layer 4 (Transport) operieren. In diesem Bereich gibt es viele Angebote wie AWSAppMesh, Istio, Linkerd usw.
Wann sollte Service Mesh zur Durchsetzung von Richtlinien verwendet werden
-
Haben Sie bereits in ein Service Mesh investiert
-
Benötigen Sie erweiterte Funktionen wie Verkehrsmanagement, Beobachtbarkeit und Sicherheit
-
Verkehrssteuerung, Lastausgleich, Stromunterbrechung, Geschwindigkeitsbegrenzung, Zeitüberschreitungen usw.
-
Detaillierte Einblicke in die Leistung Ihrer Dienste (Latenz, Fehlerraten, Anfragen pro Sekunde, Anforderungsvolumen usw.)
-
Sie möchten Service Mesh für Sicherheitsfunktionen wie mTLS implementieren und nutzen
-
Wählen Sie die Kubernetes-Netzwerkrichtlinie für einfachere Anwendungsfälle
-
Beschränken Sie, welche Pods miteinander kommunizieren können
-
Netzwerkrichtlinien benötigen weniger Ressourcen als ein Service Mesh und eignen sich daher gut für einfachere Anwendungsfälle oder für kleinere Cluster, bei denen der Aufwand für den Betrieb und die Verwaltung eines Service Mesh möglicherweise nicht gerechtfertigt ist
Anmerkung
Netzwerkrichtlinien und Service Mesh können auch zusammen verwendet werden. Verwenden Sie Netzwerkrichtlinien, um ein grundlegendes Maß an Sicherheit und Isolierung zwischen Ihren Pods bereitzustellen. Verwenden Sie dann ein Service Mesh, um zusätzliche Funktionen wie Verkehrsmanagement, Beobachtbarkeit und Sicherheit hinzuzufügen.
ThirdParty Engines für Netzwerkrichtlinien
Ziehen Sie eine Network Policy Engine eines Drittanbieters in Betracht, wenn Sie erweiterte Richtlinienanforderungen wie globale Netzwerkrichtlinien, Unterstützung für DNS-Hostnamen, Layer-7-Regeln, ServiceAccount basierte Regeln und explizite deny/log Aktionen usw. haben. Calico ist eine Open-Source-Policy-Engine von Tigera
Eine Liste gängiger Kubernetes-Netzwerkrichtlinien finden Sie unter. Ähnliche Regeln für https://github.com/ahmetb/kubernetes-network-policy-recipes. Calico finden Sie unter https://docs.projectcalico.org/security/calico-network-policy.
Migration zur Amazon VPC CNI Network Policy Engine
Um die Konsistenz aufrechtzuerhalten und ein unerwartetes Pod-Kommunikationsverhalten zu vermeiden, wird empfohlen, nur eine Network Policy Engine in Ihrem Cluster bereitzustellen. Wenn Sie von 3P zur VPC CNI Network Policy Engine migrieren möchten, empfehlen wir, Ihre vorhandenen NetworkPolicy 3P-CRDs in die NetworkPolicy Kubernetes-Ressourcen zu konvertieren, bevor Sie die VPC CNI-Netzwerkrichtlinienunterstützung aktivieren. Testen Sie die migrierten Richtlinien außerdem in einem separaten Testcluster, bevor Sie sie in Ihrer Produktionsumgebung anwenden. Auf diese Weise können Sie potenzielle Probleme oder Inkonsistenzen im Pod-Kommunikationsverhalten identifizieren und beheben.
Tool zur Migration
Um Ihren Migrationsprozess zu unterstützen, haben wir ein Tool namens K8s Network Policy Migrator entwickelt,
Wichtig
Das Migrationstool konvertiert nur 3P-Richtlinien, die mit der nativen Kubernetes-Netzwerkrichtlinien-API kompatibel sind. Wenn Sie die erweiterten Netzwerkrichtlinienfunktionen verwenden, die von 3P-Plugins angeboten werden, überspringt das Migrationstool diese und meldet sie.
Bitte beachten Sie, dass das Migrationstool derzeit vom AWS VPC CNI Network Policy Engineering-Team nicht unterstützt wird. Es wird den Kunden nach bestem Bemühen zur Verfügung gestellt. Wir empfehlen Ihnen, dieses Tool zu verwenden, um Ihren Migrationsprozess zu vereinfachen. Für den Fall, dass Sie Probleme oder Bugs mit dem Tool haben, bitten wir Sie, ein GitHub Problem zu erstellen
Weitere Ressourcen
-
Kubernetes & Tigera: Netzwerkrichtlinien, Sicherheit und Audit
-
NetworkPolicyHerausgeber,
ein interaktiver Richtlinieneditor von Cilium
Verschlüsselung während der Übertragung
Anwendungen, die PCI-, HIPAA- oder anderen Vorschriften entsprechen müssen, müssen möglicherweise Daten während der Übertragung verschlüsseln. Heutzutage ist TLS de facto die erste Wahl für die Verschlüsselung von drahtgebundenem Datenverkehr. TLS bietet, wie sein Vorgänger SSL, sichere Kommunikation über ein Netzwerk mithilfe kryptografischer Protokolle. TLS verwendet eine symmetrische Verschlüsselung, bei der die Schlüssel zur Verschlüsselung der Daten auf der Grundlage eines gemeinsamen Geheimnisses generiert werden, das zu Beginn der Sitzung ausgehandelt wird. Im Folgenden finden Sie einige Möglichkeiten, wie Sie Daten in einer Kubernetes-Umgebung verschlüsseln können.
Nitro-Instanzen
Der zwischen den folgenden Nitro-Instance-Typen ausgetauschte Datenverkehr, z. B. C5n, G4, I3en, M5dn, M5n, P3dn, R5dn und R5n, wird standardmäßig automatisch verschlüsselt. Wenn es einen Zwischensprung gibt, z. B. ein Transit-Gateway oder einen Load Balancer, wird der Datenverkehr nicht verschlüsselt. Weitere Informationen zur Verschlüsselung bei der Übertragung sowie eine vollständige Liste der Instance-Typen, die standardmäßig Netzwerkverschlüsselung unterstützen, finden Sie unter Verschlüsselung bei der Übertragung.
Service Mesh
Die Verschlüsselung bei der Übertragung kann auch mit einem Service Mesh wie App Mesh, Linkerd v2 und Istio implementiert werden. AppMesh unterstützt mTLS mit X.509 Zertifikaten oder den Secret Discovery Service (SDS) von Envoy. Linkerd und Istio unterstützen beide mTLS.
Das aws-app-mesh-examples
App Mesh unterstützt auch die TLS-Verschlüsselung mit einem privaten Zertifikat, das von AWS Certificate Manager (ACM) ausgestellt wurde, oder einem Zertifikat, das im lokalen Dateisystem des virtuellen Knotens gespeichert ist.
Das GitHub Repository
Ingress-Controller und Load Balancer
Mit Ingress-Controllern können Sie den HTTP/S Datenverkehr, der von außerhalb des Clusters ausgeht, intelligent an Dienste weiterleiten, die innerhalb des Clusters ausgeführt werden. Oft werden diese Ingresses von einem Layer-4-Load Balancer wie dem Classic Load Balancer oder dem Network Load Balancer (NLB) unterstützt. Verschlüsselter Verkehr kann an verschiedenen Stellen im Netzwerk beendet werden, z. B. am Load Balancer, an der Eingangsressource oder am Pod. Wie und wo Sie Ihre SSL-Verbindung beenden, hängt letztlich von den Netzwerksicherheitsrichtlinien Ihres Unternehmens ab. Wenn Sie beispielsweise eine Richtlinie haben, die eine Ende-zu-Ende-Verschlüsselung erfordert, müssen Sie den Datenverkehr auf dem Pod entschlüsseln. Dies wird Ihren Pod zusätzlich belasten, da er Zyklen damit verbringen muss, den ersten Handshake herzustellen. SSL/TLS Die gesamte Verarbeitung ist sehr CPU-intensiv. Wenn Sie also die Flexibilität haben, versuchen Sie, den SSL-Offload am Ingress oder am Load Balancer durchzuführen.
Verwenden Sie Verschlüsselung mit AWS Elastic Load Balancern
Der AWS Application Load Balancer (ALB) und der Network Load Balancer (NLB) unterstützen beide die Transportverschlüsselung (SSL und TLS). Mit der alb.ingress.kubernetes.io/certificate-arn Anmerkung für das ALB können Sie angeben, welche Zertifikate dem ALB hinzugefügt werden sollen. Wenn Sie die Anmerkung weglassen, versucht der Controller, den Listenern, die sie benötigen, Zertifikate hinzuzufügen, indem er die verfügbaren AWS Certificate Manager (ACM) -Zertifikate mithilfe des Host-Felds abgleicht. Ab EKS v1.15 können Sie die service.beta.kubernetes.io/aws-load-balancer-ssl-cert Annotation mit dem NLB verwenden, wie im folgenden Beispiel gezeigt.
apiVersion: v1 kind: Service metadata: name: demo-app namespace: default labels: app: demo-app annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "<certificate ARN>" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" spec: type: LoadBalancer ports: - port: 443 targetPort: 80 protocol: TCP selector: app: demo-app //--- kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: app: demo-app spec: replicas: 1 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: nginx image: nginx ports: - containerPort: 443 protocol: TCP - containerPort: 80 protocol: TCP
Im Folgenden finden Sie weitere Beispiele für die SSL/TLS Kündigung.
Wichtig
Einige Ingresses, wie der AWS LB-Controller, implementieren die SSL/TLS Verwendung von Annotations statt als Teil der Ingress-Spezifikation.
ACM Private CA mit Zertifikatsmanager
Sie können TLS und mTLS aktivieren, um Ihre EKS-Anwendungsworkloads am Eingang, auf dem Pod und zwischen Pods zu sichern. Verwenden Sie dazu ACM Private Certificate Authority (CA) und cert-manager, ein beliebtes Kubernetes-Add-on zum Verteilen
Short-Lived CA-Modus für gegenseitiges TLS zwischen Workloads
Wenn Sie ACM Private CA for mTLS in EKS verwenden, wird empfohlen, kurzlebige Zertifikate im kurzlebigen CA-Modus zu verwenden. Obwohl es möglich ist, kurzlebige Zertifikate im allgemeinen CA-Modus auszustellen, ist der kurzlebige CA-Modus kostengünstiger (~ 75% günstiger als der allgemeine Modus) für Anwendungsfälle, in denen häufig neue Zertifikate ausgestellt werden müssen. Darüber hinaus sollten Sie versuchen, die Gültigkeitsdauer der privaten Zertifikate an die Lebensdauer der Pods in Ihrem EKS-Cluster anzupassen. Erfahren Sie hier mehr über ACM Private CA und seine Vorteile.
Anweisungen zur Einrichtung von ACM
Erstellen Sie zunächst eine private CA, indem Sie die in der technischen Dokumentation von ACM Private CA beschriebenen Verfahren befolgen. Sobald Sie eine private CA haben, installieren Sie cert-manager mithilfe der regulären Installationsanweisungen.
Jetzt, da Sie eine private CA und einen EKS-Cluster mit installiertem Cert-Manager und dem Plugin haben, ist es an der Zeit, die Berechtigungen festzulegen und den Aussteller zu erstellen. Aktualisieren Sie die IAM-Berechtigungen der EKS-Knotenrolle, um den Zugriff auf ACM Private CA zu ermöglichen. Ersetzen Sie das <CA_ARN> durch den Wert aus Ihrer privaten CA:
{ "Version":"2012-10-17", "Statement": [ { "Sid": "awspcaissuer", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:GetCertificate", "acm-pca:IssueCertificate" ], "Effect": "Allow", "Resource": "arn:aws:acm-pca:us-west-2:123456789012:certificate-authority/12345678-1234-1234-1234-123456789012" } ] }
Servicerollen für IAM-Konten oder IRSA können ebenfalls verwendet werden. Vollständige Beispiele finden Sie im Abschnitt „Zusätzliche Ressourcen“ weiter unten.
Erstellen Sie einen Aussteller in Amazon EKS, indem Sie eine benutzerdefinierte Ressourcendefinitionsdatei mit dem Namen cluster-issuer.yaml erstellen, die den folgenden Text enthält <CA_ARN> und <Region> die Informationen durch Ihre private CA ersetzt.
apiVersion: awspca.cert-manager.io/v1beta1 kind: AWSPCAClusterIssuer metadata: name: demo-test-root-ca spec: arn: <CA_ARN> region: <Region>
Stellen Sie den von Ihnen erstellten Issuer bereit.
kubectl apply -f cluster-issuer.yaml
Ihr EKS-Cluster ist so konfiguriert, dass Zertifikate von Private CA angefordert werden. Sie können jetzt die Certificate Ressource von cert-manager verwenden, um Zertifikate auszustellen, indem Sie die issuerRef Feldwerte auf den oben erstellten Private CA Issuer ändern. Weitere Informationen zum Angeben und Anfordern von Zertifikatsressourcen finden Sie im Leitfaden für Zertifikatsressourcen von cert-manager. https://cert-manager.io/docs/usage/certificate/
ACM Private CA mit Istio und Cert-Manager
Wenn Sie Istio in Ihrem EKS-Cluster ausführen, können Sie (insbesondereistiod) die Istio-Steuerungsebene daran hindern, als Root-Zertifizierungsstelle (CA) zu fungieren, und ACM Private CA als Root-CA für MTLs zwischen Workloads konfigurieren. Wenn Sie diesen Ansatz wählen, sollten Sie erwägen, den kurzlebigen CA-Modus in ACM Private CA zu verwenden. Weitere Informationen finden Sie im vorherigen Abschnitt und in diesem Blogbeitrag
So funktioniert das Signieren von Zertifikaten in Istio (Standard)
Workloads in Kubernetes werden mithilfe von Dienstkonten identifiziert. Wenn Sie kein Dienstkonto angeben, weist Kubernetes Ihrem Workload automatisch eines zu. Außerdem mounten Dienstkonten automatisch ein zugehöriges Token. Dieses Token wird vom Dienstkonto für Workloads verwendet, um sich gegenüber der Kubernetes-API zu authentifizieren. Das Dienstkonto mag als Identität für Kubernetes ausreichen, aber Istio hat ein eigenes Identitätsverwaltungssystem und eine eigene CA. Wenn ein Workload mit seinem Envoy-Sidecar-Proxy gestartet wird, benötigt er eine von Istio zugewiesene Identität, damit er als vertrauenswürdig eingestuft wird und mit anderen Diensten im Mesh kommunizieren darf.
Um diese Identität von Istio zu erhalten, istio-agent sendet der eine Anfrage, die als Certificate Signing Request (oder CSR) bezeichnet wird, an die Istio-Steuerebene. Diese CSR enthält das Dienstkonto-Token, sodass die Identität des Workloads vor der Verarbeitung überprüft werden kann. Dieser Überprüfungsprozess wird von einer Behörde durchgeführtistiod, die sowohl als Registration Authority (oder RA) als auch als CA fungiert. Die RA dient als Gatekeeper, der sicherstellt, dass nur verifizierte CSR die CA erreicht. Sobald der CSR verifiziert ist, wird er an die CA weitergeleitet, die dann ein Zertifikat ausstellt, das eine https://spiffe.io/
Standardablauf für Istio-Anfragen zum Signieren von Zertifikaten:
So funktioniert das Signieren von Zertifikaten in Istio mit ACM Private CA
Sie können ein Cert-Manager-Add-on namens Istio Certificate Signing Request Agent (istio-csr
Immer wenn ein CSR von einem Workload eingeht, wird dieser an istio-csr weitergeleitet, das dann Zertifikate von ACM Private CA anfordert. Diese Kommunikation zwischen istio-csr und ACM Private CA wird durch das AWS Private CA Issuer Plugin ermöglicht. https://github.com/cert-manager/aws-privateca-issuer
Ablauf für Anfragen zum Signieren von Istio-Zertifikaten mit istio-csr
image: :istio-csr-with-acm-private-ca.png [Ablauf für Anfragen zur Signierung von Istio-Zertifikaten mit istio-csr]
Anweisungen zur Einrichtung von Istio mit einer privaten Zertifizierungsstelle
-
Folgen Sie zunächst den gleichen Einrichtungsanweisungen in diesem Abschnitt, um die folgenden Schritte abzuschließen:
-
Erstellen einer privaten CA
-
Installieren Sie cert-manager
-
Installieren Sie das Issuer-Plugin
-
Legen Sie Berechtigungen fest und erstellen Sie einen Aussteller. Der Aussteller repräsentiert die CA und wird zum Signieren
istiodund Verknüpfen von Workload-Zertifikaten verwendet. Er wird mit ACM Private CA kommunizieren. -
Erstellen Sie einen
istio-systemNamespace. Hier werden dieistiod certificateund andere Istio-Ressourcen bereitgestellt. -
Installieren Sie Istio CSR, das mit dem AWS Private CA Issuer Plugin konfiguriert ist. Sie können die Anfragen zur Zertifikatsignierung für Workloads beibehalten, um sicherzustellen, dass sie genehmigt und signiert werden ().
preserveCertificateRequests=truehelm install -n cert-manager cert-manager-istio-csr jetstack/cert-manager-istio-csr \ --set "app.certmanager.issuer.group=awspca.cert-manager.io" \ --set "app.certmanager.issuer.kind=AWSPCAClusterIssuer" \ --set "app.certmanager.issuer.name=<the-name-of-the-issuer-you-created>" \ --set "app.certmanager.preserveCertificateRequests=true" \ --set "app.server.maxCertificateDuration=48h" \ --set "app.tls.certificateDuration=24h" \ --set "app.tls.istiodCertificateDuration=24h" \ --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \ --set "volumeMounts[0].name=root-ca" \ --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \ --set "volumes[0].name=root-ca" \ --set "volumes[0].secret.secretName=istio-root-ca" -
Installieren Sie Istio mit benutzerdefinierten Konfigurationen, um es durch den Zertifikatanbieter für das Mesh zu ersetzen
istiod.cert-manager istio-csrDieser Vorgang kann mit dem Istio-Operator ausgeführt werden.apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio namespace: istio-system spec: profile: "demo" hub: gcr.io/istio-release values: global: # Change certificate provider to cert-manager istio agent for istio agent caAddress: cert-manager-istio-csr.cert-manager.svc:443 components: pilot: k8s: env: # Disable istiod CA Sever functionality - name: ENABLE_CA_SERVER value: "false" overlays: - apiVersion: apps/v1 kind: Deployment name: istiod patches: # Mount istiod serving and webhook certificate from Secret mount - path: spec.template.spec.containers.[name:discovery].args[7] value: "--tlsCertFile=/etc/cert-manager/tls/tls.crt" - path: spec.template.spec.containers.[name:discovery].args[8] value: "--tlsKeyFile=/etc/cert-manager/tls/tls.key" - path: spec.template.spec.containers.[name:discovery].args[9] value: "--caCertFile=/etc/cert-manager/ca/root-cert.pem" - path: spec.template.spec.containers.[name:discovery].volumeMounts[6] value: name: cert-manager mountPath: "/etc/cert-manager/tls" readOnly: true - path: spec.template.spec.containers.[name:discovery].volumeMounts[7] value: name: ca-root-cert mountPath: "/etc/cert-manager/ca" readOnly: true - path: spec.template.spec.volumes[6] value: name: cert-manager secret: secretName: istiod-tls - path: spec.template.spec.volumes[7] value: name: ca-root-cert configMap: defaultMode: 420 name: istio-ca-root-cert -
Stellen Sie die oben angegebene benutzerdefinierte Ressource bereit, die Sie erstellt haben.
istioctl operator init kubectl apply -f istio-custom-config.yaml -
Jetzt können Sie eine Arbeitslast für das Mesh in Ihrem EKS-Cluster bereitstellen und mTLs erzwingen
.
Anfragen zum Signieren von Istio-Zertifikaten
image: :istio-csr-requests.png [Anfragen zum Signieren von Istio-Zertifikaten]
Tools und Ressourcen
-
So implementieren Sie Cert-Manager und das ACM Private CA-Plugin, um TLS in EKS zu aktivieren.
-
Privates CA Kubernetes Cert-Manager-Plug-In aktiviert. GitHub
-
Privates CA Kubernetes Cert-Manager-Plug-in-Benutzerhandbuch.
-
Wie verwende ich den kurzlebigen Zertifikatsmodus von AWS Private Certificate Authority
-
Egress-operator
Ein Operator und ein DNS-Plugin zur Steuerung des ausgehenden Datenverkehrs aus Ihrem Cluster ohne Protokollprüfung -
NeuVector von SUSE
Open Source, eine Zero-Trust-Container-Sicherheitsplattform, die Richtlinien für Netzwerkregeln, Schutz vor Datenverlust (DLP), Web Application Firewall (WAF) und Signaturen für Netzwerkbedrohungen bietet.