
kubeaudit ajuda você a auditar seus clusters Kubernetes contra controles de segurança comuns.
Agora é necessário que os clusters executem Kubernetes >=1.19.
As labels de override com anotações
kubernetes.ionão registradas serão descontinuadas. Em breve será obrigatório usarkubeaudit.ioem vez disso. Consulte esta discussão para mais contexto.
O Kubeaudit está planejado para ser descontinuado até outubro de 2024.
Estamos ativamente buscando mantenedores interessados em assumir a administração deste projeto. Se você tem paixão por continuar seu desenvolvimento e manutenção, entre em contato conosco.
Para usuários que buscam alternativas, recomendamos a transição para o Kubebench, que oferece funcionalidade semelhante e é mantido ativamente.
Agradecemos à comunidade por suas contribuições e apoio.
kubeaudit é uma ferramenta de linha de comando e um pacote Go para auditar clusters Kubernetes em relação a diversas preocupações de segurança, tais como:
tl;dr. O kubeaudit garante que você implante contêineres seguros!
Para usar o kubeaudit como um pacote Go, consulte a documentação do pacote.
O restante deste README focará em como usar o kubeaudit como uma ferramenta de linha de comando.
brew install kubeaudit
O Kubeaudit possui lançamentos oficiais que são abençoados e estáveis: Lançamentos oficiais
A branch main pode ter funcionalidades mais recentes que as versões estáveis. Se você precisar de uma funcionalidade mais nova ainda não incluída em um lançamento, certifique-se de usar a versão mais recente do Go e execute o seguinte:
go get -v github.com/Shopify/kubeaudit
Comece a usar o kubeaudit com o Início Rápido ou veja todos os comandos suportados.
Pré-requisito: kubectl v1.12.0 ou posterior
Com o kubectl v1.12.0 introduzindo plugabilidade fácil de funções externas, o kubeaudit pode ser invocado como kubectl audit através de
make plugin e ter $GOPATH/bin disponível em seu path.ou
kubectl-audit e tê-lo disponível em seu path.Não publicamos mais imagens no Docker Hub (desde que o Docker Hub descontinuou as organizações Free Team). Por enquanto, imagens antigas ainda estão disponíveis, mas podem parar de funcionar a qualquer momento. Em breve começaremos a publicar imagens no registro de contêineres do Github.
Para executar o kubeaudit como um job em seu cluster, veja Executando kubeaudit em um cluster.
O kubeaudit possui três modos:
Se um arquivo de manifesto Kubernetes for fornecido usando a flag -f/--manifest, o kubeaudit auditará o arquivo de manifesto.
Exemplo de comando:
kubeaudit all -f "/caminho/para/manifest.yml"
Exemplo de saída:
$ kubeaudit all -f "internal/test/fixtures/all_resources/deployment-apps-v1.yml"
---------------- Resultados para ---------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: deployment-apps-v1
--------------------------------------------
-- [error] AppArmorAnnotationMissing
Mensagem: Anotação AppArmor ausente. A anotação 'container.apparmor.security.beta.kubernetes.io/container' deve ser adicionada.
Metadados:
Container: container
MissingAnnotation: container.apparmor.security.beta.kubernetes.io/container
-- [error] AutomountServiceAccountTokenTrueAndDefaultSA
Mensagem: Conta de serviço padrão com token montado. automountServiceAccountToken deve ser definido como 'false' ou uma conta de serviço não padrão deve ser usada.
-- [error] CapabilityShouldDropAll
Mensagem: Capacidade não definida como ALL. Idealmente, você deve remover todas as capacidades e adicionar as específicas que precisa na lista de adição.
Metadados:
Container: container
Capability: AUDIT_WRITE
...
Se nenhum erro com uma gravidade mínima especificada for encontrado, o seguinte é retornado:
Todas as verificações concluídas. 0 vulnerabilidades de alto risco encontradas
O modo manifesto também suporta a correção automática de todos os problemas de segurança usando o comando autofix:
kubeaudit autofix -f "/caminho/para/manifest.yml"
Para gravar o manifesto corrigido em um novo arquivo em vez de modificar o arquivo fonte, use a flag -o/--output.
kubeaudit autofix -f "/caminho/para/manifest.yml" -o "/caminho/para/fixo"
Para corrigir um manifesto com base em regras personalizadas especificadas em um arquivo de configuração do kubeaudit, use a flag -k/--kconfig.
kubeaudit autofix -k "/caminho/para/kubeaudit-config.yml" -f "/caminho/para/manifest.yml" -o "/caminho/para/fixo"
O kubeaudit pode detectar se está sendo executado dentro de um contêiner em um cluster. Se sim, ele tentará auditar todos os recursos Kubernetes nesse cluster:
kubeaudit all
O kubeaudit tentará conectar-se a um cluster usando o arquivo kubeconfig local ($HOME/.kube/config). Um local diferente do kubeconfig pode ser especificado usando a flag --kubeconfig. Para especificar um contexto do kubeconfig, use a flag -c/--context.
kubeaudit all --kubeconfig "/caminho/para/config" --context meu_cluster
Para mais informações sobre arquivos de configuração do kubernetes, veja https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
O kubeaudit produz resultados com três níveis de gravidade:
Error: Um problema de segurança ou configuração inválida do kubernetesWarning: Uma recomendação de melhor práticaInfo: Informativo, nenhuma ação necessária. Inclui resultados que foram sobrescritosO nível mínimo de gravidade pode ser definido usando a flag --minSeverity/-m.
Por padrão, o kubeaudit exibirá os resultados de forma legível por humanos. Se a saída for destinada a processamento posterior, pode ser configurada para saída JSON usando a flag --format json. Para exibir os resultados como logs (o padrão anterior) use --format logrus. Alguns formatos de saída incluem cores para facilitar a leitura no terminal. Para desabilitar cores (por exemplo, se você estiver enviando a saída para um arquivo de texto), você pode usar a flag --no-color.
Você pode gerar um relatório kubeaudit em SARIF usando a flag --format sarif. Para gravar os resultados SARIF em um arquivo, você pode redirecionar a saída com >. Por exemplo:
kubeaudit all -f caminho-para-meu-arquivo.yaml --format="sarif" > exemplo.sarif
Se houver resultados de nível de gravidade error, o kubeaudit sairá com código de saída 2. Isso pode ser alterado usando a flag --exitcode/-e.
Para todas as formas de personalização do kubeaudit, veja Flags Globais.
Os auditores também podem ser executados individualmente.
| Comando | Descrição | Documentação |
|---|---|---|
apparmor | Encontra contêineres executando sem AppArmor. | docs |
asat | Encontra pods usando uma conta de serviço padrão montada automaticamente | docs |
capabilities | Encontra contêineres que não removem as capacidades recomendadas ou adicionam novas. | docs |
deprecatedapis | Encontra qualquer recurso definido com uma versão de API obsoleta. | docs |
hostns | Encontra contêineres que têm HostPID, HostIPC ou HostNetwork habilitados. | docs |
image | Encontra contêineres que não usam a versão desejada de uma imagem (através da tag) ou usam uma imagem sem tag. | docs |
limits | Encontra contêineres que excedem os limites especificados de CPU e memória ou não especificam nenhum. | docs |
mounts | Encontra contêineres que têm caminhos sensíveis do host montados. | docs |
netpols | Encontra namespaces que não têm uma política de rede default-deny. |
| Curta | Longa | Descrição |
|---|---|---|
| --format | O formato de saída a ser usado (um de "sarif", "pretty", "logrus", "json") (padrão é "pretty") | |
| --kubeconfig | Caminho para o arquivo de configuração local do Kubernetes. Usado apenas no modo local (padrão é $HOME/.kube/config) | |
| -c | --context | O nome do contexto do kubeconfig a ser usado |
| -f | --manifest | Caminho para a configuração yaml a ser auditada. Usado apenas no modo manifesto. Você pode usar - para ler da entrada padrão. |
| -n | --namespace | Auditar apenas recursos no namespace especificado. Não suportado atualmente no modo manifesto. |
| -g | --includegenerated | Incluir recursos gerados na varredura (como Pods gerados por deployments). Se você quiser que o kubeaudit produza resultados para recursos gerados (por exemplo, se você tiver recursos personalizados ou quiser capturar recursos órfãos onde o recurso proprietário não existe mais), você pode usar esta flag. |
| -m | --minseverity | Define o nível de severidade mais baixo a ser relatado (um de "error", "warning", "info") (padrão é "info") |
| -e | --exitcode | Código de saída a ser usado se houver resultados com severidade "error". Convencionalmente, 0 é usado para sucesso e todos os códigos não zero para erro. (padrão é 2) |
| --no-color | Não usar cores na saída (padrão é falso) |
O config do kubeaudit pode ser usado para duas coisas:
Qualquer configuração que possa ser especificada usando flags para os auditores individuais pode ser representada usando o config.
O config possui o seguinte formato:
enabledAuditors:
# Auditores são habilitados por padrão se não forem explicitamente definidos como "false"
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:
# adicione capacidades necessárias à lista de adição, para que o kubeaudit não reporte erros
allowAddList: ['AUDIT_WRITE', 'CHOWN']
deprecatedapis:
# Se nenhuma versão for especificada e o auditor 'deprecatedapis' estiver habilitado, resultados WARN
# serão gerados para os recursos definidos com uma API obsoleta.
currentVersion: '1.22'
targetedVersion: '1.25'
image:
# Se nenhuma imagem for especificada e o auditor 'image' estiver habilitado, resultados WARN
# serão gerados para contêineres que usam uma imagem sem tag
image: 'myimage:mytag'
limits:
# Se nenhum limite for especificado e o auditor 'limits' estiver habilitado, resultados WARN
# serão gerados para contêineres que não têm limites de cpu ou memória especificados
cpu: '750m'
memory: '500m'
Para mais detalhes sobre cada auditor, incluindo uma descrição da configuração específica do auditor no config, veja a Documentação dos Auditores.
Nota: O config do kubeaudit não é o mesmo que o arquivo kubeconfig especificado com a flag --kubeconfig, que se refere ao arquivo de configuração do Kubernetes (veja Modo Local). Observe também que apenas os comandos all e autofix suportam o uso de um config do kubeaudit. Não funcionará com outros comandos.
Nota: Se flags forem usadas em combinação com o arquivo de configuração, as flags terão precedência.
Problemas de segurança podem ser ignorados para contêineres ou pods específicos adicionando labels de sobrescrita. Isso significa que o auditor produzirá resultados info em vez de resultados error e o nome do resultado da auditoria terá Allowed anexado. As labels estão documentadas na documentação de cada auditor, mas o formato geral para auditores que suportam sobrescritas é o seguinte:
Uma label de sobrescrita consiste em uma key e um value.
A key é uma combinação do tipo de sobrescrita (contêiner ou pod) e um identificador de sobrescrita que é único para cada auditor (veja a documentação para o auditor específico). A key pode assumir uma de duas formas, dependendo do tipo de sobrescrita:
container.kubeaudit.io/[nome do contêiner].[identificador de sobrescrita]
kubeaudit.io/[identificador de sobrescrita]
Se o value for definido como uma string não vazia, ele será exibido no resultado info como OverrideReason:
$ kubeaudit asat -f "auditors/asat/fixtures/service-account-token-true-allowed.yml"
---------------- Resultados para ---------------
apiVersion: v1
kind: ReplicationController
metadata:
name: replicationcontroller
namespace: service-account-token-true-allowed
--------------------------------------------
-- [info] AutomountServiceAccountTokenTrueAndDefaultSAAllowed
Mensagem: Resultado da auditoria sobrescrito: Conta de serviço padrão com token montado. automountServiceAccountToken deve ser definido como 'false' ou uma conta de serviço não padrão deve ser usada.
Metadados:
OverrideReason: SomeReason
Conforme especificação do Kubernetes, value deve ter 63 caracteres ou menos e deve ser vazio ou começar e terminar com um caractere alfanumérico ([a-z0-9A-Z]) com traços (-), underscores (_), pontos (.), e alfanuméricos entre eles.
Várias labels de sobrescrita (para vários auditores) podem ser adicionadas ao mesmo recurso.
Veja a documentação específica do auditor para o auditor que você deseja sobrescrever para exemplos.
Para aprender mais sobre labels, veja https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
Se você deseja corrigir um bug, contribuir com uma funcionalidade ou apenas corrigir um erro de digitação, sinta-se à vontade para fazê-lo, desde que siga nosso Código de Conduta.
go get github.com/Shopify/kubeauditcd $GOPATH/src/github.com/Shopify/kubeauditgit remote add fork https://github.com/voce-e-incrivel/kubeauditgit checkout -b funcionalidade-nova-incrivelUSE_KIND=true make test (para executar os testes sem Kind: make test)git commit -am 'Adiciona funcionalidade incrível'git push forkNote que se você não assinou o CLA antes de abrir seu PR, você pode reexecutar a verificação adicionando um comentário ao PR que diga "I've signed the CLA!"!
| docs |
nonroot | Encontra contêineres executando como root. | docs |
privesc | Encontra contêineres que permitem escalonamento de privilégios. | docs |
privileged | Encontra contêineres executando como privilegiado. | docs |
rootfs | Encontra contêineres que não têm um sistema de arquivos somente leitura. | docs |
seccomp | Encontra contêineres executando sem Seccomp. | docs |