Auditar mediante restricciones

Los objetos de restricción de Policy Controller te permiten aplicar políticas en tus clústeres de Kubernetes. Para probar tus políticas, puedes añadir una medida de cumplimiento a tus restricciones. A continuación, puedes ver las infracciones en los objetos de restricción y en los registros.

Esta página está dirigida a administradores y operadores de TI que quieran asegurarse de que todos los recursos que se ejecutan en la plataforma en la nube cumplen los requisitos de cumplimiento de la organización proporcionando y manteniendo la automatización para auditar o aplicar, y que gestionan el ciclo de vida de la infraestructura tecnológica subyacente. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE.Google Cloud

Tipos de medidas por incumplimiento de políticas

Hay tres tipos de medidas: deny, dryrun y warn.

deny es la medida por incumplimiento de políticas predeterminada. Se habilita automáticamente, aunque no añadas ninguna medida de cumplimiento en tu restricción. Usa deny para evitar que se produzca una operación de clúster determinada cuando haya una infracción.

dryrun te permite monitorizar las infracciones de tus reglas sin bloquear activamente las transacciones. Puedes usarlo para comprobar si tus restricciones funcionan correctamente antes de habilitar la aplicación activa con la acción deny. Si pruebas las restricciones de esta forma, puedes evitar interrupciones causadas por una restricción configurada incorrectamente.

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

Se recomienda usar esta opción al probar nuevas restricciones o realizar acciones de migración, como actualizar plataformas, para cambiar las acciones de aplicación de deny a warn o dryrun, de modo que puedas comprobar que tus políticas funcionan correctamente.

Añadir medidas por incumplimiento de políticas

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

La siguiente restricción de ejemplo, denominada audit.yaml, añade 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ícalo con kubectl apply -f:

kubectl apply -f audit.yaml

Ver los resultados de la auditoría

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

Ver los resultados de la auditoría en objetos Constraint

Para ver las infracciones de una restricción determinada, ejecuta el siguiente comando y consulta 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

La salida que verás será similar a la 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

Ver los resultados de la auditoría en los registros

Puedes usar el Explorador de registros para obtener, ver y analizar datos de registro de Policy Controller.

Para obtener todos los registros de Policy Controller, 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 de registro, por lo que puedes canalizar la salida a otro comando y filtrar por estas líneas. Por ejemplo, puedes usar jq, que analiza archivos JSON y te permite definir un filtro para un tipo de registro específico.

Ejemplo de resultado de auditoría de 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"
}

Siguientes pasos