> For the complete documentation index, see [llms.txt](https://devops.nataliagranato.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://devops.nataliagranato.xyz/politica-como-codigo-com-kyverno.md).

# Política como código com Kyverno

O Kyverno é uma ferramenta open-source que permite definir políticas de validação, mutação e geração de recursos Kubernetes. Com o Kyverno, você pode definir políticas de segurança, conformidade e boas práticas de forma declarativa.

As políticas do Kyverno são definidas em objetos do tipo `ClusterPolicy` e `Policy`. Um `ClusterPolicy` é aplicado a todos os namespaces do cluster, enquanto um `Policy` é aplicado a um namespace específico.

### Instalação

Para instalar o Kyverno, execute o seguinte comando:

```bash
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
kubectl create namespace kyverno
helm install kyverno --namespace kyverno kyverno/kyverno
```

Para definir a utilização do Kyverno em modo HA (High Availability), execute o seguinte comando:

```bash
helm install kyverno --namespace kyverno kyverno/kyverno --set replicaCount=3
```

### Políticas

As políticas aplicadas para esse projeto estão disponíveis no diretório `kyverno` na raiz do repositório. As políticas são definidas em arquivos YAML e aplicadas ao cluster com o comando `kubectl apply -f kyverno/`.

São elas:

* `check-deprecated-api.yaml`: Verifica se os recursos estão utilizando versões de API descontinuadas.
* `dissalow-latest-tag.yaml`: Verifica se os recursos estão utilizando a tag `latest` em imagens de containers. A tag `latest` não é recomendada em ambientes de produção porque torna o versionamento da imagem ambíguo, o que pode causar problemas de compatibilidade, dificuldades de rastreamento e problemas de segurança.
* `dissalow-secrets-from-env-vars.yaml`: Verifica se os recursos estão utilizando variáveis de ambiente para passar credenciais sensíveis. O uso de variáveis de ambiente para passar credenciais sensíveis é uma prática insegura, pois as variáveis de ambiente são visíveis para qualquer processo em execução no mesmo host.
* `no-root-containers.yaml`: Verifica se os recursos estão utilizando containers com usuário `root`. Utilizar o usuário `root` em containers é uma prática insegura, pois permite que o container tenha acesso total ao host. Por definição, um container deve ter todos os processos isolados, isso vale para o usuário também.
* `require-labels.yaml`: Verifica se os recursos possuem as labels `app` e `env`. Essas labels são úteis para identificar e agrupar recursos relacionados.
* `require-probes.yaml`: Verifica se os recursos possuem os probes `liveness` e `readiness`. Os probes são essenciais para garantir a disponibilidade e a confiabilidade dos recursos.
* `require-requests-limits.yaml`: Verifica se os recursos possuem requests e limits definidos para CPU e memória. Definir requests e limits é essencial para garantir a previsibilidade, a eficiência dos recursos e economizar custos.
* `verify-image.yaml`: Verifica se as imagens possuem assinatura digital. Verificar a assinatura digital das imagens é essencial para garantir a autenticidade e a integridade das imagens.

Para aplicar as polícas mencionadas acima, execute o seguinte comando:

```bash
cd kyverno
kubectl apply -f .
```
