
kubeaudit helps you audit your Kubernetes clusters against common security controls
Es ist jetzt eine Voraussetzung für Cluster, Kubernetes >=1.19 auszuführen.
Überschreibungs-Labels mit nicht registrierten
kubernetes.io-Annotationen werden veraltet. Es wird bald erforderlich sein, stattdessenkubeaudit.iozu verwenden.
Siehe diese Diskussion für weiteren Kontext.
Kubeaudit ist für die Einstellung bis Oktober 2024 geplant.
Wir suchen aktiv nach Betreuern, die daran interessiert sind, die Verantwortung für dieses Projekt zu übernehmen. Wenn Sie Leidenschaft für die Weiterentwicklung und Wartung haben, kontaktieren Sie uns bitte.
Für Benutzer, die nach Alternativen suchen, empfehlen wir den Umstieg auf Kubebench, das ähnliche Funktionalitäten bietet und aktiv gewartet wird.
Vielen Dank an die Community für Ihre Beiträge und Unterstützung.
kubeaudit ist ein Kommandozeilenwerkzeug und ein Go-Paket zur Überprüfung von Kubernetes-Clustern auf verschiedene Sicherheitsbedenken, wie z. B.:
TL;DR. kubeaudit stellt sicher, dass Sie sichere Container bereitstellen!
Um kubeaudit als Go-Paket zu verwenden, siehe die Paketdokumentation.
Der Rest dieser README konzentriert sich darauf, wie man kubeaudit als Kommandozeilenwerkzeug verwendet.
brew install kubeaudit
Kubeaudit hat offizielle, stabile und geprüfte Veröffentlichungen: Offizielle Veröffentlichungen
Der Hauptzweig kann neuere Funktionen enthalten als die stabilen Veröffentlichungen. Wenn Sie eine neuere Funktion benötigen, die noch nicht in einer Veröffentlichung enthalten ist, stellen Sie sicher, dass Sie das aktuelle Go verwenden, und führen Sie Folgendes aus:
go get -v github.com/Shopify/kubeaudit
Beginnen Sie mit der Nutzung von kubeaudit mit dem Schnellstart oder sehen Sie sich alle unterstützten Befehle an.
Voraussetzung: kubectl v1.12.0 oder höher
Mit kubectl v1.12.0, das die einfache Pluginfähigkeit externer Funktionen einführte, kann kubeaudit als kubectl audit aufgerufen werden, indem
make plugin ausgeführt wird und $GOPATH/bin in Ihrem Pfad verfügbar ist.oder
kubectl-audit umbenannt wird und im Pfad verfügbar ist.Wir veröffentlichen keine Images mehr auf Docker Hub (seit Docker Hub die Free Team-Organisationen eingestellt hat). Vorläufig sind alte Images noch verfügbar, könnten aber jederzeit nicht mehr verfügbar sein. Wir werden bald damit beginnen, Images in der Github Container Registry zu veröffentlichen.
Um kubeaudit als Job in Ihrem Cluster auszuführen, siehe Ausführen von kubeaudit in einem Cluster.
kubeaudit hat drei Modi:
Wenn eine Kubernetes-Manifestdatei mit dem Flag -f/--manifest angegeben wird, überprüft kubeaudit die Manifestdatei.
Beispielbefehl:
kubeaudit all -f "/path/to/manifest.yml"
Beispielausgabe:
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- Results for ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [error] AppArmorAnnotationMissing
Message: AppArmor annotation missing. The annotation 'container.apparmor.security.beta.kubernetes.io/container' should be added.
Metadata:
Container: container
MissingAnnotation: container.apparmor.security.beta.kubernetes.io/container
-- [error] AutomountServiceAccountTokenTrueAndDefaultSA
Message: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
-- [error] CapabilityShouldDropAll
Message: Capability not set to ALL. Ideally, you should drop ALL capabilities and add the specific ones you need to the add list.
Metadata:
Container: container
Capability: AUDIT_WRITE
...
Wenn keine Fehler mit einer bestimmten Mindestschwere gefunden werden, wird Folgendes zurückgegeben:
All checks completed. 0 high-risk vulnerabilities found
Der Manifest-Modus unterstützt auch die automatische Behebung aller Sicherheitsprobleme mit dem Befehl autofix:
kubeaudit autofix -f "/path/to/manifest.yml"
Um das korrigierte Manifest in eine neue Datei zu schreiben, anstatt die Quelldatei zu ändern, verwenden Sie das Flag -o/--output.
kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"
Um ein Manifest basierend auf benutzerdefinierten Regeln zu korrigieren, die in einer kubeaudit-Konfigurationsdatei angegeben sind, verwenden Sie das Flag -k/--kconfig.
kubeaudit autofix -k "/path/to/kubeaudit-config.yml" -f "/path/to/manifest.yml" -o "/path/to/fixed"
Kubeaudit kann erkennen, ob es in einem Container in einem Cluster ausgeführt wird. Wenn ja, wird versucht, alle Kubernetes-Ressourcen in diesem Cluster zu überprüfen:
kubeaudit all
Kubeaudit versucht, mithilfe der lokalen Kubeconfig-Datei ($HOME/.kube/config) eine Verbindung zu einem Cluster herzustellen. Ein anderer Kubeconfig-Pfad kann mit dem Flag --kubeconfig angegeben werden. Um einen Kontext der Kubeconfig anzugeben, verwenden Sie das Flag -c/--context.
kubeaudit all --kubeconfig "/path/to/config" --context my_cluster
Für weitere Informationen zu Kubernetes-Konfigurationsdateien siehe https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
Kubeaudit erzeugt Ergebnisse mit drei Schweregraden:
Error: Ein Sicherheitsproblem oder eine ungültige Kubernetes-KonfigurationWarning: Eine Empfehlung zu Best PracticesInfo: Nur zur Information, kein Handlungsbedarf. Dazu gehören Ergebnisse, die überschrieben wurden.Der minimale Schweregrad kann mit dem Flag --minSeverity/-m festgelegt werden.
Standardmäßig gibt kubeaudit Ergebnisse in menschenlesbarer Form aus. Wenn die Ausgabe weiterverarbeitet werden soll, kann sie mit dem Flag --format json auf JSON gesetzt werden. Für die Ausgabe als Logs (der vorherige Standard) verwenden Sie --format logrus. Einige Ausgabeformate enthalten Farben, um die Ergebnisse im Terminal leichter lesbar zu machen. Um Farben zu deaktivieren (z. B. wenn Sie die Ausgabe in eine Textdatei senden), können Sie das Flag --no-color verwenden.
Sie können einen kubeaudit-Bericht im SARIF-Format mit dem Flag --format sarif erstellen. Um die SARIF-Ergebnisse in eine Datei zu schreiben, können Sie die Ausgabe mit > umleiten. Zum Beispiel:
kubeaudit all -f path-to-my-file.yaml --format="sarif" > example.sarif
Wenn es Ergebnisse mit dem Schweregrad error gibt, beendet sich kubeaudit mit dem Exit-Code 2. Dies kann mit dem Flag --exitcode/-e geändert werden.
Für alle Möglichkeiten, kubeaudit anzupassen, siehe Globale Flags.
Auditoren können auch einzeln ausgeführt werden.
Die kubeaudit-Konfiguration kann für zwei Dinge verwendet werden:
Jede Konfiguration, die mit Flags für die einzelnen Auditoren angegeben werden kann, kann auch mit der Konfiguration dargestellt werden.
Die Konfiguration hat das folgende Format:
enabledAuditors:
# Auditoren sind standardmäßig aktiviert, wenn sie nicht explizit auf "false" gesetzt werden
apparmor: false
asat: false
capabilities: true
deprecatedapis: true
hostns: true
image: true
limits: true
mounts: true
netpols: true
nonroot: true
privesc: true
privileged: true
rootfs: true
seccomp: true
auditors:
capabilities:
# Fügen Sie benötigte Capabilities zur Add-Liste hinzu, damit kubeaudit keine Fehler meldet
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# Wenn keine Versionen angegeben werden und der Auditor 'deprecatedapis' aktiviert ist, werden WARN-Ergebnisse für Ressourcen erzeugt, die mit einer veralteten API definiert sind.
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# Wenn kein Image angegeben wird und der Auditor 'image' aktiviert ist, werden WARN-Ergebnisse für Container erzeugt, die ein Image ohne Tag verwenden
image: 'myimage:mytag'
limits:
# Wenn keine Limits angegeben werden und der Auditor 'limits' aktiviert ist, werden WARN-Ergebnisse für Container erzeugt, die keine CPU- oder Speicherlimits haben
cpu: '750m'
memory: '500m'
Weitere Details zu jedem Auditor, einschließlich einer Beschreibung der auditorspezifischen Konfiguration in der Konfigurationsdatei, finden Sie in der Auditor-Dokumentation.
Hinweis: Die kubeaudit-Konfiguration ist nicht identisch mit der Kubeconfig-Datei, die mit dem Flag --kubeconfig angegeben wird. Letztere bezieht sich auf die Kubernetes-Konfigurationsdatei (siehe Lokaler Modus). Beachten Sie auch, dass nur die Befehle all und autofix die Verwendung einer kubeaudit-Konfiguration unterstützen. Sie funktioniert nicht mit anderen Befehlen.
Hinweis: Wenn Flags in Kombination mit der Konfigurationsdatei verwendet werden, haben die Flags Vorrang.
Sicherheitsprobleme können für bestimmte Container oder Pods durch das Hinzufügen von Überschreibungs-Labels ignoriert werden. Dadurch erzeugt der Auditor anstelle von error-Ergebnissen info-Ergebnisse, und der Ergebnisname erhält den Zusatz Allowed. Die Labels sind in der Dokumentation jedes Auditors beschrieben, aber das allgemeine Format für Auditoren, die Überschreibungen unterstützen, ist wie folgt:
Ein Überschreibungs-Label besteht aus einem key und einem value.
Der key ist eine Kombination aus dem Überschreibungstyp (Container oder Pod) und einer Überschreibungs-ID, die für jeden Auditor einzigartig ist (siehe die Dokumentation für den jeweiligen Auditor). Der key kann eine von zwei Formen annehmen, abhängig vom Überschreibungstyp:
container.kubeaudit.io/[containername].[Überschreibungs-ID]
kubeaudit.io/[Überschreibungs-ID]
Wenn der value auf einen nicht leeren String gesetzt wird, wird er im info-Ergebnis als OverrideReason angezeigt:
$ kubeaudit asat -f "auditors/asat/fixtures/service-account-token-true-allowed.yml"
---------------- Results for ---------------
apiVersion: v1
kind: ReplicationController
metadata:
name: replicationcontroller
namespace: service-account-token-true-allowed
--------------------------------------------
-- [info] AutomountServiceAccountTokenTrueAndDefaultSAAllowed
Message: Audit result overridden: Default service account with token mounted. automountServiceAccountToken should be set to 'false' or a non-default service account should be used.
Metadata:
OverrideReason: SomeReason
Gemäß der Kubernetes-Spezifikation muss value 63 Zeichen oder kürzer sein und entweder leer sein oder mit einem alphanumerischen Zeichen ([a-z0-9A-Z]) beginnen und enden, mit Bindestrichen (-), Unterstrichen (_), Punkten (.) und alphanumerischen Zeichen dazwischen.
Es können mehrere Überschreibungs-Labels (für mehrere Auditoren) zur gleichen Ressource hinzugefügt werden.
Siehe die spezifische Auditor-Dokumentation für den Auditor, den Sie überschreiben möchten, für Beispiele.
Um mehr über Labels zu erfahren, siehe https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
Wenn Sie einen Fehler beheben, eine Funktion beisteuern oder nur einen Tippfehler korrigieren möchten, können Sie dies gerne tun, solange Sie unseren Verhaltenskodex befolgen.
go get github.com/Shopify/kubeauditcd $GOPATH/src/github.com/Shopify/kubeauditgit remote add fork https://github.com/you-are-awesome/kubeauditgit checkout -b awesome-new-featureUSE_KIND=true make test (um Tests ohne Kind auszuführen: make test)git commit -am 'Fügt tolle Funktion hinzu'git push forkBeachten Sie, dass Sie, wenn Sie die CLA vor dem Öffnen Ihres PRs nicht unterschrieben haben, die Überprüfung erneut ausführen können, indem Sie einen Kommentar zum PR hinzufügen, der sagt: "I've signed the CLA!"!
| Befehl | Beschreibung | Dokumentation |
|---|
all | Führt alle verfügbaren Auditoren aus, oder diejenigen, die in einer kubeaudit-Konfiguration angegeben sind. | docs |
autofix | Korrigiert Sicherheitsprobleme automatisch. | docs |
version | Gibt die aktuelle Version von kubeaudit aus. |
| Befehl | Beschreibung | Dokumentation |
|---|
apparmor | Findet Container, die ohne AppArmor ausgeführt werden. | docs |
asat | Findet Pods, die ein automatisch gemountetes Standarddienstkonto verwenden. | docs |
capabilities | Findet Container, die die empfohlenen Capabilities nicht entfernen oder neue hinzufügen. | docs |
deprecatedapis | Findet Ressourcen, die mit einer veralteten API-Version definiert sind. | docs |
hostns | Findet Container, die HostPID, HostIPC oder HostNetwork aktiviert haben. | docs |
image | Findet Container, die nicht die gewünschte Version eines Images (über den Tag) verwenden oder ein Image ohne Tag verwenden. | docs |
limits | Findet Container, die die angegebenen CPU- und Speicherlimits überschreiten oder keine angeben. | docs |
mounts | Findet Container, die sensible Host-Pfade eingebunden haben. | docs |
netpols | Findet Namespaces, die keine Default-Deny-Netzwerkrichtlinie haben. | docs |
nonroot | Findet Container, die als Root ausgeführt werden. | docs |
privesc | Findet Container, die eine Privilegienausweitung erlauben. | docs |
privileged | Findet Container, die privilegiert ausgeführt werden. | docs |
rootfs | Findet Container, die kein schreibgeschütztes Dateisystem haben. | docs |
seccomp | Findet Container, die ohne Seccomp ausgeführt werden. | docs |
| Kurz | Lang | Beschreibung |
|---|
| --format | Das zu verwendende Ausgabeformat (eines von "sarif", "pretty", "logrus", "json") (Standard ist "pretty") | |
| --kubeconfig | Pfad zur lokalen Kubernetes-Konfigurationsdatei. Wird nur im lokalen Modus verwendet (Standard ist $HOME/.kube/config) | |
| -c | --context | Der Name des zu verwendenden Kubeconfig-Kontextes |
| -f | --manifest | Pfad zur zu überprüfenden YAML-Konfiguration. Wird nur im Manifest-Modus verwendet. Sie können - verwenden, um von der Standardeingabe zu lesen. |
| -n | --namespace | Nur Ressourcen im angegebenen Namespace überprüfen. Derzeit nicht im Manifest-Modus unterstützt. |
| -g | --includegenerated | Generierte Ressourcen in den Scan einbeziehen (z. B. Pods, die von Deployments erstellt wurden). Wenn Sie möchten, dass kubeaudit Ergebnisse für generierte Ressourcen erzeugt (z. B. bei benutzerdefinierten Ressourcen oder verwaisten Ressourcen, deren Besitzer-Ressource nicht mehr existiert), können Sie dieses Flag verwenden. |
| -m | --minseverity | Legt den niedrigsten zu meldenden Schweregrad fest (eines von "error", "warning", "info") (Standard ist "info") |
| -e | --exitcode | Exit-Code, der verwendet werden soll, wenn es Ergebnisse mit dem Schweregrad "error" gibt. Üblicherweise steht 0 für Erfolg und alle Null-Codes für einen Fehler. (Standard ist 2) |
| --no-color | Keine Farben in der Ausgabe verwenden (Standard ist false) |