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).
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.
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.