Realizar auditorías con restricciones

Los objetos de restricción del controlador de políticas te permiten aplicar políticas a tus clústeres de Kubernetes. Para ayudarte a probar tus políticas, puedes agregar una acción de aplicación a tus restricciones. Luego, puedes ver las infracciones en los objetos de restricción y los registros.

Tipos de acciones de aplicación

Existen tres acciones de aplicación: deny, dryrun y warn.

deny es la acción de aplicación predeterminada. Se habilita de forma automática, incluso si no agregas una acción de aplicación en tu restricción. Usa deny para evitar que se realice una operación de clúster determinada cuando hay una infracción.

dryrun te permite supervisar los incumplimientos de tus reglas sin bloquear de forma activa las transacciones. Puedes usarlo para probar si tus restricciones funcionan según lo previsto antes de habilitar la aplicación activa mediante la acción deny. Probar las restricciones de esta manera puede evitar interrupciones causadas por una restricción configurada de forma incorrecta.

warn es similar a dryrun, pero también proporciona un mensaje inmediato sobre las infracciones que ocurren en el momento de la admisión.

Cuando se prueban restricciones nuevas o se realizan acciones de migración, como actualizar plataformas, se recomienda cambiar las acciones de aplicación de deny a warn o dryrun para que puedas probar que las políticas funcionan como se espera.

Agrega acciones de aplicación

Puedes agregar enforcementAction: deny o enforcementAction: dryrun a una restricción.

La siguiente restricción de ejemplo, llamada audit.yaml, agrega la acción 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

Crea la restricción. Por ejemplo, aplícala mediante kubectl apply -f:

kubectl apply -f audit.yaml

Visualiza los resultados de la auditoría

Las infracciones auditadas se agregan a los objetos de restricción y también se escriben en los registros. Las infracciones que el controlador de admisión rechaza no aparecen en los registros.

Visualiza los resultados de la auditoría en objetos de la restricción

Para ver los incumplimientos de una restricción determinada, ejecuta el siguiente comando y visualiza los campos spec.status.

kubectl get constraint-kind constraint-name -o yaml

Ejemplo

Para ver el resultado de la restricción de audit.yaml, ejecuta el siguiente comando:

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

El resultado que ves es similar al siguiente:

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

Visualiza los resultados de los auditoría en los registros

Puedes ver los informes de auditoría en tus registros. Para obtener más información sobre los registros, consulta Usa registros de auditoría.

Para obtener todos los registros del controlador de políticas, ejecuta el siguiente comando:

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

Los resultados de la auditoría tienen "process":"audit" en las líneas del registro para que puedas canalizar el resultado a otro comando y filtrar por estas líneas. Por ejemplo, puedes usar jq, que analiza archivos JSON y te permite configurar un filtro para un tipo de registro específico.

Resultado de auditoría de ejemplo del registro:

{
"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"
}

¿Qué sigue?