Sicherheitsrisikoanalyse für Kubernetes-Ressourcen
[![Testing Workflow][testing_workflow_badge]][testing_workflow_badge] [![Security Analysis Workflow][security_workflow_badge]][security_workflow_badge] [![Release Workflow][release_workflow_badge]][release_workflow_badge]
[![Go Report Card][goreportcard_badge]][goreportcard] [![PkgGoDev][go_dev_badge]][go_dev]
Weitere Beispiele finden Sie auf Kubesec.io, das die gehostete API von ControlPlane unter v2.kubesec.io/scan verwendet.
Erstellen Sie eine Kubernetes-Ressourcendatei (z. B. kubesec-test.yaml), die gescannt werden soll. Für einen schnellen Test können Sie das folgende Pod-Manifest speichern:
$ cat <<EOF > kubesec-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubesec-demo
spec:
containers:
- name: kubesec-demo
image: gcr.io/google-samples/node-hello:1.0
securityContext:
readOnlyRootFilesystem: true
EOF
Führen Sie einen Scan gegen Ihre Manifestdatei aus:
# Mit dem lokalen Binary
kubesec scan kubesec-test.yaml
# Oder mit Docker
docker run -i kubesec/kubesec:v2 scan /dev/stdin < kubesec-test.yaml
# Mit dem lokalen Binary und einer menschenlesbaren Tabellenausgabe
kubesec scan kubesec-test.yaml --format table
[!TIP] Um die Ergebnisse in einer menschenlesbaren Tabelle statt im standardmäßigen JSON-Format anzuzeigen, verwenden Sie das Flag
--format table
kubesec gibt einen Sicherheits-Score und eine detaillierte Analyse Ihrer Ressource aus.
Kubesec ist verfügbar als:
docker.io/kubesec/kubesec:v2Oder installieren Sie den neuesten Commit von GitHub mit:
$ go install github.com/controlplaneio/kubesec/v2@latest
$ GO111MODULE="on" go get github.com/controlplaneio/kubesec/v2
Scannen Sie Kubernetes-Ressourcen aus lokalen Dateien oder der Standardeingabe.
Kubesec kann mehrere YAML-Dokumente in einer einzigen Eingabedatei scannen oder Dokumente aus mehreren Dateien gleichzeitig scannen, sofern sie korrekt als mehrere, durch --- getrennte Dokumente formatiert sind.
# Eine bestimmte lokale YAML-Datei scannen
kubesec scan ./deployment.yaml
# Aus der Standardeingabe scannen (JSON oder YAML)
cat file.json | kubesec scan -
# Ein gerendertes Helm-Chart scannen
helm template -f values.yaml ./chart | kubesec scan /dev/stdin
# Mehrere YAML-Dokumente scannen, getrennt durch '---'
{ cat test/asset/multi.yml; echo "---"; cat test/asset/critical.yml; } | kubesec scan -
Sie können dieselben Scan-Befehle mit dem offiziellen Docker-Image ausführen:
# Eine Datei über Docker mit der Standardeingabe scannen
docker run -i kubesec/kubesec:v2 scan /dev/stdin < kubesec-test.yaml
Kubesec unterstützt drei verschiedene Ausgabeformate, die über das Flag --format / -f angegeben werden: json (Standard), table und template. Außerdem können mehrere YAML-Dokumente in einer einzigen Eingabedatei gescannt werden.
# JSON-Array-Ausgabe (Standardverhalten)
kubesec scan ./deployment.yaml --format json
# Menschenlesbare Tabellenausgabe
kubesec scan ./deployment.yaml --format table
# Ein benutzerdefiniertes Template für die Ausgabe verwenden
kubesec scan ./deployment.yaml --format template --template report-template.tmpl
# Eine Regel
kubesec scan --rules CapSysAdmin kubesec-test.yaml
# Mehrere Regeln
kubesec scan --rules RunAsNonRoot,SeccompAny,ApparmorAny kubesec-test.yaml
[
{
"object": "Pod/security-context-demo.default",
"valid": true,
"message": "Failed with a score of -30 points",
"score": -30,
"scoring": {
"critical": [
{
"selector": "containers[] .securityContext .capabilities .add == SYS_ADMIN",
"reason": "CAP_SYS_ADMIN is the most privileged capability and should always be avoided",
"points": -30
}
],
"advise": [
{
"selector": "containers[] .securityContext .runAsNonRoot == true",
"reason": "Force the running image to run as a non-root user to ensure least privilege",
"points": 1
},
{
// ...
}
]
}
}
]

# Alle Scan-Regeln mit ihren zugehörigen Punktzahlen anzeigen
kubesec print-rules
# Alle Scan-Regeln mit ihren zugehörigen Punktzahlen als Tabelle anzeigen
kubesec print-rules --format table
[
{
"id": "AllowPrivilegeEscalation",
"selector": "containers[] .securityContext .allowPrivilegeEscalation == true",
"reason": "Ensure a non-root process can not gain more privileges",
"kinds": [
"Pod",
"Deployment",
"StatefulSet",
"DaemonSet"
],
"points": -7,
"advise": 0
},
...
]
Kubesec nutzt kubeconform (Dank an @yannh), um die zu scannenden Manifeste zu validieren. Das bedeutet, dass die Angabe anderer Schema-Speicherorte den Regeln folgt, die im kubeconform-README beschrieben sind.
# Verwendet das neueste Schema von upstream
# Das Schema wird abgerufen von: https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master-standalone-strict/pod-v1.json
kubesec scan ./pod.yaml
# Eine bestimmte Schema-Version von upstream verwenden (Format x.y.z ohne v-Präfix)
# Das Schema wird abgerufen von: https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/v1.25.3-standalone-strict/pod-v1.json
kubesec scan ./pod.yaml --kubernetes-version 1.25.3