Análise de riscos de segurança para recursos Kubernetes
[![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]
Para mais exemplos, visite Kubesec.io, que usa a API hospedada da ControlPlane em v2.kubesec.io/scan.
Crie um arquivo de recurso Kubernetes (ex.: kubesec-test.yaml) para analisar. Para um teste rápido, você pode salvar o seguinte manifesto de Pod:
$ 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
Execute uma análise no seu arquivo de manifesto:
# Usando o binário local
kubesec scan kubesec-test.yaml
# Ou usando Docker
docker run -i kubesec/kubesec:v2 scan /dev/stdin < kubesec-test.yaml
# Usando o binário local com um formato de saída de tabela legível por humanos
kubesec scan kubesec-test.yaml --format table
[!TIP] Para visualizar os resultados em uma tabela legível em vez do formato JSON padrão, use o sinalizador
--format table
O kubesec exibirá uma pontuação de segurança e uma análise detalhada do seu recurso.
O Kubesec está disponível como:
docker.io/kubesec/kubesec:v2Ou instale o commit mais recente do GitHub com:
$ go install github.com/controlplaneio/kubesec/v2@latest
$ GO111MODULE="on" go get github.com/controlplaneio/kubesec/v2
Analise recursos Kubernetes a partir de arquivos locais ou entrada padrão.
O Kubesec pode analisar vários documentos YAML em um único arquivo de entrada, ou analisar documentos de vários arquivos de uma só vez, desde que estejam formatados corretamente como múltiplos documentos separados por ---.
# Analisar um arquivo YAML local específico
kubesec scan ./deployment.yaml
# Analisar a partir da entrada padrão (JSON ou YAML)
cat file.json | kubesec scan -
# Analisar um chart Helm renderizado
helm template -f values.yaml ./chart | kubesec scan /dev/stdin
# Analisar vários documentos YAML separados por '---'
{ cat test/asset/multi.yml; echo "---"; cat test/asset/critical.yml; } | kubesec scan -
Você pode executar os mesmos comandos de análise usando a imagem oficial do Docker:
# Analisar um arquivo via Docker usando entrada padrão
docker run -i kubesec/kubesec:v2 scan /dev/stdin < kubesec-test.yaml
O Kubesec suporta três formatos de saída diferentes, especificados pelo sinalizador --format / -f: json (padrão), table e template, e pode analisar vários documentos YAML em um único arquivo de entrada.
# Saída em array JSON (comportamento padrão)
kubesec scan ./deployment.yaml --format json
# Saída em tabela legível por humanos
kubesec scan ./deployment.yaml --format table
# Usar um template personalizado para a saída
kubesec scan ./deployment.yaml --format template --template report-template.tmpl
# Uma regra
kubesec scan --rules CapSysAdmin kubesec-test.yaml
# Várias regras
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
},
{
// ...
}
]
}
}
]

# Imprimir todas as regras de análise com suas pontuações associadas
kubesec print-rules
# Imprimir todas as regras de análise com suas pontuações associadas como tabela
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
},
...
]
O Kubesec utiliza o kubeconform (obrigado @yannh) para validar os manifestos a serem analisados. Isso implica que especificar diferentes locais de schema segue as regras descritas no README do kubeconform.
# Usa o schema mais recente do upstream
# O schema será obtido de: https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master-standalone-strict/pod-v1.json
kubesec scan ./pod.yaml
# Usa uma versão de schema específica do upstream (formato x.y.z sem o prefixo v)
# O schema será obtido de: 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