Auditoria através de restrições

Os objetos de restrição do Policy Controller permitem-lhe aplicar políticas aos seus clusters do Kubernetes. Para ajudar a testar as suas políticas, pode adicionar uma ação de aplicação às restrições. Em seguida, pode ver as violações nos objetos de restrição e nos registos.

Esta página destina-se a administradores de TI e operadores que querem garantir que todos os recursos executados na plataforma de nuvem cumprem os requisitos de conformidade organizacionais, fornecendo e mantendo a automatização para auditar ou aplicar, e que gerem o ciclo de vida da infraestrutura tecnológica subjacente. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no Google Cloud conteúdo, consulte Funções e tarefas comuns do utilizador do GKE.

Tipos de ações de aplicação

Existem três ações de aplicação: deny, dryrun e warn.

deny é a ação de aplicação predefinida. É ativada automaticamente, mesmo que não adicione uma ação de aplicação na restrição. Use deny para impedir que uma operação de cluster específica ocorra quando existir uma violação.

dryrun permite-lhe monitorizar violações das suas regras sem bloquear ativamente as transações. Pode usá-lo para testar se as restrições estão a funcionar como previsto antes de ativar a aplicação ativa através da ação deny. Testar as restrições desta forma pode evitar interrupções causadas por uma restrição configurada incorretamente.

warn é semelhante a dryrun, mas também fornece uma mensagem imediata sobre as violações que ocorrem no momento da admissão.

Recomendamos que, quando testar novas restrições ou realizar ações de migração, como a atualização de plataformas, altere as ações de aplicação de deny para warn ou dryrun para poder testar se as suas políticas funcionam como esperado.

Adicionar ações de aplicação

Pode adicionar enforcementAction: deny ou enforcementAction: dryrun a uma restrição.

A restrição de exemplo seguinte, denominada audit.yaml, adiciona a ação dryrun.

#audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  name: user-must-be-3333
spec:
  enforcementAction: dryrun
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    runAsUser:
      rule: MustRunAs
      ranges:
        - min: 3333
          max: 3333

Crie a restrição. Por exemplo, aplique-o com kubectl apply -f:

kubectl apply -f audit.yaml

Visualizar resultados da auditoria

As violações auditadas são anexadas aos objetos Constraint e também são escritas nos registos. As violações que o controlador de admissão rejeita não aparecem nos registos.

Visualizar resultados de auditoria em objetos de restrição

Para ver as violações de uma determinada restrição, execute o seguinte comando e veja os campos spec.status.

kubectl get constraint-kind constraint-name -o yaml

Exemplo

Para ver o resultado da restrição de audit.yaml, execute o seguinte comando:

kubectl get K8sPSPAllowedUsers user-must-be-3333 -o yaml

O resultado que vê é semelhante ao seguinte:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  creationTimestamp: "2020-05-22T01:34:22Z"
  generation: 1
  name: user-must-be-3333
  resourceVersion: "13351707"
  selfLink: /apis/constraints.gatekeeper.sh/v1beta1/k8spspallowedusers/user-must-be-3333
  uid: 5d0b39a8-9bcc-11ea-bb38-42010a80000c
spec:
  enforcementAction: dryrun
  match:
    kinds:
    - apiGroups:
      - ""
      kinds:
      - Pod
  parameters:
    runAsUser:
      ranges:
      - max: 3333
        min: 3333
      rule: MustRunAs
 status:
  auditTimestamp: "2020-05-22T01:39:05Z"
  byPod:
  - enforced: true
    id: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    observedGeneration: 1
 totalViolations: 5
  violations:
  - enforcementAction: dryrun
    kind: Pod
    message: Container git-sync is attempting to run as disallowed user 65533
    name: git-importer-86564db8cb-5r4gs
    namespace: config-management-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container manager is attempting to run as disallowed user 1000
    name: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    namespace: gatekeeper-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-cckf
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-jnhb
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8
    namespace: kube-system

Ver resultados de auditoria nos registos

Pode usar o Explorador de registos para obter, ver e analisar dados de registos do Policy Controller.

Para obter todos os registos do Policy Controller, execute o seguinte comando:

kubectl logs -n gatekeeper-system -l gatekeeper.sh/system=yes

Os resultados da auditoria têm "process":"audit" nas linhas do registo, pelo que pode transferir a saída para outro comando e filtrar por estas linhas. Por exemplo, pode usar jq, que analisa ficheiros JSON e permite definir um filtro para um tipo de registo específico.

Exemplo de resultado de auditoria do registo:

{
"level":"info",
"ts":1590111401.9769812,
"logger":"controller",
"msg":"Container kube-proxy is attempting to run without a required securityContext/runAsUser",
"process":"audit",
"audit_id":"2020-05-22T01:36:24Z",
"event_type":"violation_audited",
"constraint_kind":"K8sPSPAllowedUsers",
"constraint_name":"user-must-be-3333",
"constraint_namespace":"",
"constraint_action":"dryrun",
"resource_kind":"Pod",
"resource_namespace":"kube-system",
"resource_name":"kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8"
}

O que se segue?