ADMIN

2022

04

2022-03-31T12:00:00

Automatisierung

PRAXIS

044

Sicherheit

Container

Container-Sicherheit mit Aqua Security

Bitte verschlossen halten!

von Dr. Guido Söldner

Veröffentlicht in Ausgabe 04/2022 - PRAXIS

Der Betrieb von cloudnativen Anwendungen in Containern oder mit Serverless-Technologien bringt spezielle und neue Anforderungen in Sachen Sicherheit mit sich. Zwar integrieren die großen Wolkenbereitsteller wie AWS oder Azure viel Security in ihre Plattformen, doch meist nur mit internen Diensten. Wie sich der Schutz von Workloads in Containern mit Aqua Security realisieren lässt, zeigt dieser Workshop.

Für viele Firmen ist das Betreiben von cloudnativen Applikationen mittlerweile Standard. Dabei beschreibt "cloudnative" einen Ansatz der Softwareentwicklung, bei dem Applikationen von Anfang an für den Einsatz in der Cloud konzipiert werden. Derartige Anwendungen bestehen oft aus Microservices, die wiederum auf Basis von Containern oder Serverless-Technologien bereitgestellt sind. Neben der Eigenentwicklung von Applikationen kommt mittlerweile vermehrt auch Standardsoftware auf Basis solcher Technologien zur Auslieferung.
Neue Anforderungen an die Sicherheit
Solche Anwendungen benötigen einen neuen Ansatz in Sachen Security. Zwar bringen die großen Hyperscaler mittlerweile eine Reihe von Sicherheitsfunktionen mit, jedoch unterscheiden sich diese je nach Anbieter und sind zudem auf die eigene Plattform beschränkt. IT-Verantwortliche, die sich einen starken Rundumschutz wünschen, der sich zugleich über mehrere Cloudanbieter sowie lokale Systeme erstreckt, sind somit auf Drittanbietersoftware angewiesen. Die benötigten Funktionen lassen sich dabei wie folgt aufzählen:
- Runtime Detection soll Sicherheitslücken und verdächtiges Verhalten in Microservices und Containern zur Laufzeit erkennen und automatisiert auf derartige Bedrohungen reagieren.
Für viele Firmen ist das Betreiben von cloudnativen Applikationen mittlerweile Standard. Dabei beschreibt "cloudnative" einen Ansatz der Softwareentwicklung, bei dem Applikationen von Anfang an für den Einsatz in der Cloud konzipiert werden. Derartige Anwendungen bestehen oft aus Microservices, die wiederum auf Basis von Containern oder Serverless-Technologien bereitgestellt sind. Neben der Eigenentwicklung von Applikationen kommt mittlerweile vermehrt auch Standardsoftware auf Basis solcher Technologien zur Auslieferung.
Neue Anforderungen an die Sicherheit
Solche Anwendungen benötigen einen neuen Ansatz in Sachen Security. Zwar bringen die großen Hyperscaler mittlerweile eine Reihe von Sicherheitsfunktionen mit, jedoch unterscheiden sich diese je nach Anbieter und sind zudem auf die eigene Plattform beschränkt. IT-Verantwortliche, die sich einen starken Rundumschutz wünschen, der sich zugleich über mehrere Cloudanbieter sowie lokale Systeme erstreckt, sind somit auf Drittanbietersoftware angewiesen. Die benötigten Funktionen lassen sich dabei wie folgt aufzählen:
- Runtime Detection soll Sicherheitslücken und verdächtiges Verhalten in Microservices und Containern zur Laufzeit erkennen und automatisiert auf derartige Bedrohungen reagieren.
- System Hardening ermöglicht das Erkennen von verdächtigem Verhalten auf Ebene von virtuellen Maschinen.
- Network Security überwacht den Netzwerkverkehr von Containern und Microservices und erzeugt daraus Firewall-Regeln. Deren Einhaltung wird mit Policies überprüft.
- Mit speziellen Compliance-Settings lässt sich erlaubtes Verhalten von Containern definieren und validieren.
- Incident Response: Erlaubt bei Sicherheitsproblemen, mittels Forensiktechniken das Problem zu analysieren und eine entsprechende Antwort zu definieren.
- Drift Prevention ermöglicht das Blocken von ausführbarem Code, der nicht im Image enthalten ist. Eine solche Lösung kann beispielsweise die Auswirkungen der Log4j-Attacke verhindern.
Ein entsprechendes Werkzeug bietet die Firma Aquasec mit ihrer Aqua-Plattform [1]. Dabei deckt diese Software den ganzen Software-Lifecycle ab: Von der Entwicklung der Anwendung über das Schützen der Infrastruktur bis hin zur Sicherung der Work-loads. Als Anwednungsfälle nennt der Hersteller darüber hinaus DevSecOps, Security-Modernisierung, Compliance und die hybride sowie die Multicloud.
Die Architektur von Aqua Security
Die Aqua-Plattform besteht aus einer Reihe von Komponenten: Der Aqua-Server beziehungsweise dessen Konsole stellt das Herzstück des Produkts dar. Als solches koordiniert er alle sicherheitsrelevanten Prozesse und stellt einen integrierten Container-Scanner bereit, wobei sich eine Reihe zusätzlicher Scanner parallel dazu installieren lassen. Der Aqua-Server liefert auch das grafische Frontend und ermöglicht die Integration mit Drittanbieterkomponenten. Die Datenhaltung erfolgt in der Aqua-Datenbank, die entweder als Container mit einem bereitgestellten Image läuft oder Sie greifen auf eine externe Datenbank auf Basis von PostgreSQL zurück.
Für die Runtime Security sind die "Enforcer" zuständig. Je nach Zielsystem kann ein Enforcer als Dienst auf einer VM, als Service in einem Kubernetes-Cluster, als zusätzlicher Container in einem Deployment oder als Komponente zur Überprüfung von Serverless-Funktionen laufen. Die "Gateways" sorgen für die Kommunikation zwischen dem Aqua-Server und Enforcern. Auch zusätzlich betriebene SIEM-Systeme kommunizieren mit dem Gateway. Die "Scanner" überprüfen Images und finden sicherheitsrelevante Belange wie zum Beispiel Schwachstellen, sensitive Daten oder Malware. Das "CyberCenter" wird von Aqua Security selbst betrieben und dient als Cyber-Intelligence Knowledge Base. Als solche veröffentlicht sie aktuelle Informationen zu Schwachstellen, Malware, Software-Informationen und Lizenzen. Diese Informationen kann der Aqua-Server ähnlich wie Virensignaturen bei einem Virenscanner abrufen. In regulierten Umgebungen ist es möglich, das CyberCenter in der eigenen Umgebung zu betreiben.
Installation mit Helmcharts
Die Software lässt sich auf einer Reihe unterschiedlicher Systeme installieren. Zum einen ist eine Installation in einen Kubernetes-Cluster möglich, zum anderen wird darüber hinaus Docker, Docker Swarm, Amazon Elastic Container Service (ECS), Mesosphere und VMware Tanzu Application Service (TAS) unterstützt. Die Installation auf Kubernetes kann wahlweise mit einem Installer oder per Helmchart erfolgen. Die Liste unterstützter Kubernetes-Distributionen ist dabei ansehnlich: Neben reinem Kubernetes sind dies Microsoft Azure Kubernetes Service (AKS), Amazon Elastic Kubernetes Service (EKS), Google Kubernetes Engine (GKE), IBM Cloud Private (ICP), Lightweight Kubernetes (K3s), OpenShift, Rancher, VMware Tanzu Kubernetes Grid (TKG) und VMware Tanzu Kubernetes Grid Integrated Edition.
Die Installation mit Helmcharts ist diejenige, die sich am meisten an den Standard hält. So hält Aquasec auf seiner Github-Seite auch die notwendigen Helmcharts [1] für die Installation der Komponenten bereit, die separat voneinander auszuführen sind. Bevor es mit der Installation losgehen kann, müssen Sie aber einen Ingress-Controller wie zum Beispiel Nginx oder Contour bereitstellen.
Die lokalen Konfigurationseinstellungen definieren Sie anschließend in einer YAML-Datei. Ein minimalistisches Beispiel für eine Proof-of-Concept-Umgebung schaut in etwa aus wie in Listing 1. Eine Beschreibung aller konfigurierbaren Einstellungen findet sich auf der Github-Seite.
Listing 1: YAML-Datei zur Installation
# Specifies the secret data for imagePullSecrets needed to fetch the private docker images imageCredentials:     create: true     name: aqua-registry-secret # example     repositoryUriPrefix: "registry.aquasec.com" # for dockerhub – "docker.io"     registry: "registry.aquasec.com" #REQUIRED only if create is true, for dockerhub - "index.docker.io/v1/"     username: ""     password: "" global:     #Please specify k8s platform acronym. Allowed values are aks, eks, gke, openshift, tkg, tkgi, k8s     # aks = Azure Kubernetes Service     # gke = Google kubernetes Engine     # openshift = RedHat Openshift/OCP     # tkg = VMware Tanzu kubernetes Grid     # tkgi = VMware Tanzu kubernetes Grid Integrated Edition     # k8s = Plain/on-prem Vanilla Kubernetes     # rancher = Rancher Kubernetes Platform     # gs = GaintSwarm platform     # k3s = k3s kubernetes platform     platform: "tkg" j     db:          persistence:               storageClass: "k8s-policy" web:     replicaCount: 1     logLevel:     image:          repository: console          tag: "6.5"          pullPolicy: Always     service:          type: ClusterIP          loadbalancerIP: "" # Specify LoadBalancerIP address for aqua-gateway in AKS platform          annotations: {}          ports:             - name: aqua-web               port: 8080               targetPort: 8080               nodePort:               protocol: TCP             - name: aqua-web-ssl               port: 443               targetPort: 8443               nodePort:               protocol: TCP          #As 443, 8443 already occupied in k3s kubernetes by traefik ingress. below are the console ports     ingress:          enabled: true          externalPort: 443          annotations:               kubernetes.io/ingress.class: nginx               kubernetes.io/ingress.allow-http: "true"          hosts: #REQUIRED               - aquasec.sclabs.net          path: /          tls:               - secretName: generic aqua-lb-tls                 hosts:                    - aquasec.sclabs.net
Für die Installation müssen Sie neben "kubectl" lokal noch das helm-Tool installieren. Anschließend fügen Sie wie folgt das "Aqua Helm Repository" zu der Liste der lokalen Helm-Repositories hinzu:
helm repo add aqua-helm https://helm.aquasec.com
Daraufhin können Sie sich die aktuell verfügbaren Chart-Versionen anzeigen lassen:
helm search repo aqua-helm/server --versions
Anschließend beginnt die Installation:
helm upgrade --install --namespace aqua aqua aqua-helm/server -f  <Name der YAML-Datei>
Sobald die Installation abgeschlossen ist, öffnen Sie einen Webbrowser und starten die Aqua-Konsole. Je nachdem, ob Sie die GUI mit SSL oder HTTP konfiguriert haben, öffnen Sie die Konsole mit Port 443 beziehungsweise 8080. Bei der ersten Anmeldung geben Sie ein Passwort für den "administrator"-Benutzer an. Sobald Sie den Aqua-Lizenz-Token eingegeben haben, gelangen Sie auch auf das Dashboard (siehe Bild 1).
Bild 1: Mit dem Abschluss der Installation steht dem Admin die Aqua-Konsole mit einer ersten Übersicht zur Verfügung.
Zentrale Sicherheitsfunktionen
Die meisten Sicherheitsfunktionen in Aqua lassen sich in die Kategorien "Assurance" und "Enforcement" klassifizieren. Dabei findet die Assurance vor dem Deployment der Workloads in die Umgebung statt. Als solches umfasst die Funktion unter anderem:
- Scannen der Applikation und Infrastruktur hinsichtlich Sicherheitslücken.
- Überprüfen der Compliance mithilfe von Assurance Policies.
- Mitigation der Risiken aus gefundenen Sicherheitslücken.
- Reporting und Logging von Audit Events.
Besonders interessant ist dabei die Integration in externe Systeme wie zum Beispiel eine CI/CD-Pipeline. In solchen Fällen ist es möglich, beim Finden von Sicherheitslücken das Deployment zu verhindern.
Enforcement wirkt dagegen zur Runtime und umfasst, das Ausführen von Work-loads auf Basis definierter Compliance zu erlauben oder zu unterbinden. Auch lassen sich Workload-Aktivitäten monitoren, einschränken oder blockieren. Zudem findet hier das Reporting und Logging von Audit Events statt.
Verschiedene Enforcer
Für das Durchsetzen der Runtime-Security sind wie bereits erwähnt die Enforcer zuständig. Je nach zu nutzender Technologie stehen dabei unterschiedliche Arten zur Verfügung: "Aqua Enforcer" laufen auf Linux- oder Windows-Nodes in einem Kubernetes-Cluster. Zu deren Aufgaben gehört es, Images, die nicht compliant oder registriert sind, zu blockieren. Falls Schwachstellen wie zum Beispiel Malware auftaucht, ist es möglich, darauf zu reagieren und die Container-Ausführung zu blockieren. Darüber hinaus können Aqua Enforcer unter anderem Firewallregeln anwenden, Host-Runtime-Policies überprüfen und durchsetzen sowie Secrets injizieren.
Die "Micro Enforcer" gibt es nur für Linux und unterstützen bei der Ausführung von Containern innerhalb einer Container-as-a-Service-(CaaS)-Umgebung wie zum Beispiel AWS Fargate und Azure Container Instances (ACI). Ihr Funktionsumfang orientiert sich an dem der Aqua Enforcer – da sie allerdings keinen Host-Zugriff erhalten, fallen die entsprechenden Möglichkeiten auf dieser Ebene natürlich weg.
Auch "Pod Enforcer" gibt es nur für Linux. Sie werden zusammen mit dem Workload-Container in einem Pod zur Ausführung gebracht und wirken somit auf Pod-Ebene. Ähnlich wie Micro Enforcer sind sie deshalb in ihren Fähigkeiten limitiert. "Kube Enforcer" installieren Sie in einem Kubernetes-Cluster. Sie bieten neben dem erwähnten Container-Enforcement eine Reihe weiterer Funktionalitäten: Mit "Kubernetes Assurance" steht ein Policy-Framework zur Verfügung, mit dem Sie Regeln zur Ausführung von Containern setzen. Die Unterstützung von kube-bench ermöglicht das Überprüfen der Cluster hinsichtlich CIS-Benchmarks. Kube-hunter erlaubt das Aufspüren von Sicherheitslücken. Des Weiteren gibt es ein Autodiscovery der Cluster-Infrastruktur.
Images überprüfen
Das Image Scanning prüft auf Softwareschwachstellen, sensitive Daten wie zum Beispiel private RSA-Schlüssel und Malware. Um eine Registry in Aqua anzubinden, wechseln Sie in der GUI zu "Administration / Integrations / Image Registries" und klicken auf "Add Registry". Dort konfigurieren Sie die "Registration Details", wobei Sie angeben, ob der Scan regelmäßig oder auf manueller Basis stattfinden soll. Bild 3 zeigt die ansehnliche Liste weiterer Konfigurationsmöglichkeiten.
Nach dem Einbinden der Registry beginnt der Scanvorgang, der ja nach Anzahl der Images unterschiedlich lang dauern kann. Das Ergebnis zeigt Aqua in einem Dash-board an. Falls eine Schwachstelle auftaucht, weißt Aqua dieser einen Schweregrad (Severity) zu: Dieser kann vernachlässigbar (negligible), niedrig (low), mittel (middle), hoch (high) oder kritisch (critical) sein. Zusätzlich wird ein numerischer Wert zwischen 0 (niedrig) und 10 (hoch) bestimmt. Als Grundlage dienen dabei die Werte des jeweiligen Herstellers und der National Vulnerability Database des amerikanischen NIST-Instituts. Das Scannen der Images ist auch in CI/CD-Tools integrierbar. Dabei unterstützt Aqua Azure DevOps, Bamboo, GitLab, GoCD und Jenkins.
Regeln definieren
Basierend auf den Scanvorgängen bietet die Software die Möglichkeit, eine Image-Compliance mithilfe von "Image Assurance Policies" zu definieren. Standardmäßig ist dazu eine Default-Regel vorgegeben, die einen Audit-Message-Eintrag generiert, wenn ein Image-Vorgang fehlschlägt. Zudem lässt die Regel in angebundenen CI/CD-Systemen anschließend den Überprüfungsschritt fehlschlagen, und das markiert das Image als nicht-compliant. Eine Image Assurance Policy besteht dabei aus den folgenden Komponenten:
- Application Scope: Hier definieren Sie, ob die Policy global oder auf eine Untermenge von Elementen wirken soll. Dazu zählen beispielsweise Namespaces, Labels, Images oder Hosts.
- Actions: Wie bereits erwähnt, sind Sie in der Lage, bei einem Scan-Fehlschlag eine Audit-Message zu erzeugen.
- Exceptions: Hier legen Sie fest, ob Sie Vulnerabilities zulassen wollen, für die es noch keinen Fix gibt. Auch lassen sich ausgewählte Schwachstellen ignorieren.
- Controls: Diese bestimmen die Überprüfungen, die auf das Scan-Ergebnis angewandt werden sollen. Darunter konfigurieren Sie beispielsweise, welche Base- Images erlaubt sind, ob diese hinsichtlich Malware überprüft werden sollen oder welche Packages blockiert sein sollen.
In der Liste der auszuwählenden Controls findet sich auch die Möglichkeit, "Custom Compliance Checks" zu verwenden. Auch hier gibt es eine vordefinierte Liste an Checks, die sich bei Bedarf erweitern lässt. Die entsprechenden Skripte können Sie in unterschiedlichen Sprachen verfassen, unter anderem PowerShell, Bash oder OVAL – viele Skripte sind jedoch in der Rego-Sprache gehalten. Rego selbst kommt aus dem Cloudnative-Umfeld und stellt eine deklarative Programmiersprache zum Verfassen von Policies dar.
Die Liste an vordefinierten Regeln umfassen unter anderem die aus dem Open-Source-Tool Kube-Bench bekannten Policies zum Überprüfen von Kubernetes-Clustern nach den Vorgaben des Center for Internet Security. Aber auch Aqua liefert fertige Regeln, die beispielsweise nach dem Vorhandensein gewisser Tools oder nach zu viel vergebenen Privilegien Ausschau halten. Das Implementieren eigener Regeln ist auch nicht schwer. Listing 2 zeigt beispielsweise, wie Sie überprüfen, ob alle Images aus einer vertrauenswürdigen Image-Registry entstammen.
Listing 2: Eigene Regel zur Prüfung einer Image-Registry
package kubernetes.admission deny[msg] {            input.request.kind.kind == "Pod"            some i            image := input.request.object.spec.containers[i].image            not startswith(image, "hooli.com/")            msg := sprintf("image '%v' comes from untrusted registry", [image]) }
Neben dem Definieren von Assurance Policies erlaubt Aqua auch solche, die sich auf die Runtime auswirken. In der GUI sind diese unter "Policies / Runtime Policies" erreichbar. Solche Regeln können Sie ähnlich wie Assurance Policies auf Hosts und Funktionen, aber auch auf Container anwenden:
- Container Policies können Container vollständig blockieren oder die Ausführung einzelner Elemente wie zum Beispiel Executables verhindern.
- Function Runtime Policies sind zum jetzigen Zeitpunkt für AWS Lambda verfügbar. Dabei stehen Function Runtime Policies für Java, .NET Core, Node.js und Python bereit.
- Host Runtime Policies helfen beim Monitoring von Betriebssystemen und der Restriktion von Host-Aktivitäten.
Bild 2: Assurance-Policies stellen feingranulare Controls für die Image-Auswertung zur Verfügung.
Exploits verhindern
In vielen Fällen, in denen eine Schwachstelle auftaucht, für die auch schon ein Fix vorliegt, gelingt es nicht schnell genug, diesen Fix auch in die Produktion einzuspielen. In solchen Fällen kann Aqua mit seiner vShield-Technologie helfen. Dabei handelt es sich um eine Art nicht-invasive Runtime-Security-Policy, die verhindert, dass der Exploit ausgeführt wird.
Die Konfiguration ist dabei relativ einfach: Bei der Identifizierung eines Exploits findet Aqua die zugehörige CVE heraus. Diese wird dann im Programm angezeigt. Administratoren haben anschließend die Möglichkeit, für die entsprechenden CVEs die vShields zu aktivieren.
Ein weiteres interessantes Feature, das aber eine weitergehende Lizenz benötigt, ist Dynamic Threat Analysis. Diese scannt Images nicht nur statisch, sondern führt sie vielmehr in einer isolierten Sandbox-Umgebung aus. So finden IT-Verantwortliche zum Beispiel spezielle Malware-Gefahren, die sich mit statischen Scannern nicht aufspüren lassen. Klassische Beispiele sind dabei unter anderem das Löschen von Executables, Benutzen von versteckten Dateien, Verbinden zu IP-Adressen ohne DNS, Verbindung zu C&C-Servern, das Scannen von Netzwerken oder Privilege Escalation.
Fazit
Mit der Aqua-Plattform steht ein Security-Tool der neuesten Generation zur Verfügung, das sich speziell auf cloudnative Umgebungen konzentriert. Das Produkt überzeugt mit seiner einfachen Bedienung und umfangreichen Features. Für die Installation ist zwar Container-Wissen gefragt, aber aufgrund der guten Dokumentation klappt diese in der Regel schnell. Gerade die jüngsten Sicherheitslücken wie zum Beispiel Log4j zeigen den Wert zentralisierter Sicherheitswerkzeuge.
(jp)
Link-Codes