Ingress Controller de Citrix ADC

Soporte para webhooks de controladores de admisión

Loscontroladores de admisión son herramientas poderosas para interceptar solicitudes al servidor de la API de Kubernetes antes de la persistencia del objeto. Con los controladores de admisión de Kubernetes, puede definir y personalizar lo que se permite ejecutar en su clúster. Por lo tanto, son herramientas útiles para que los administradores de clústeres implementen controles de seguridad preventivos en su clúster. Pero debe compilar los controladores de admisión en kube-apiserver binario y ofrecen una flexibilidad limitada.

Para superar esta limitación, Kubernetes admite controladores de admisión dinámicos que se pueden desarrollar como extensiones y ejecutarse como webhooks configurados en tiempo de ejecución.

Con los webhooks del controlador de admisión, los administradores de clústeres de Kubernetes pueden crear complementos adicionales para la cadena de admisión del servidor de API sin tener que volver a compilarlos. Los webhooks del controlador de admisión se pueden ejecutar siempre que se cree, actualice o elimine un recurso.

Puede definir dos tipos de webhooks de controladores de admisión:

  • validación de webhook de admisión
  • webhook de admisión mutante

Los webhooks de admisión mutados se invocan primero y pueden modificar los objetos enviados al servidor de la API para aplicar valores predeterminados personalizados. Una vez que se completan todas las modificaciones del objeto y el servidor API valida el objeto entrante, se invocan los webhooks de admisión de validación. La validación de ganchos de admisión procesa las solicitudes y acepta o rechaza solicitudes para aplicar directivas personalizadas.

El siguiente diagrama explica cómo funciona el webhook del controlador de admisión:

admission-control-webhook

Estos son algunos de los casos en los que los webhooks de admisión son útiles:

  • Exigir una línea de base de seguridad razonable en todo un espacio de nombres o un clúster que exija. Por ejemplo, no permitir que los contenedores se ejecuten como raíz o asegurarse de que el sistema de archivos raíz del contenedor siempre esté montado como de solo lectura.
  • Aplicar el cumplimiento de ciertos estándares y prácticas para etiquetas, anotaciones o límites de recursos. Por ejemplo, aplique la validación de etiquetas en diferentes objetos para garantizar que se usen etiquetas adecuadas para varios objetos.

  • Para validar la configuración de los objetos que se ejecutan en el clúster y evitar que cualquier configuración incorrecta obvia llegue a su clúster. Por ejemplo, para detectar y corregir imágenes implementadas sin etiquetas semánticas.

Cómo aplicar controladores de admisión

Escribir un controlador de admisión para cada caso de uso específico no es escalable y ayuda tener un sistema que admita múltiples configuraciones que cubran diferentes tipos de recursos y campos. Puede usar Open policy agent (OPA) y Gatekeeper para implementar un webhook de admisión personalizable para Kubernetes.

OPA es un motor de directivas de código abierto y propósito general que unifica la aplicación de directivas en toda la pila. Gatekeeper es un webhook de validación personalizable que aplica directivas basadas en CRD ejecutadas por OPA.

Gatekeeper( créditode imagen)

Gatekeeper presenta las siguientes funcionalidades

  • Una biblioteca de directivas ampliable y parametrizada
  • CRD nativos de Kubernetes para crear instancias de la biblioteca de directivas (restricciones)
  • CRD nativos de Kubernetes para ampliar la biblioteca de directivas (plantillas de restricciones)
  • Función de auditoría

Escritura e implementación de un webhook de controlador de admisión

Requisitos previos

  • Kubernetes 1.14.0 o posterior con la API admissionregistration.k8s.io/v1beta1 habilitada.
    Puede comprobar si la API está habilitada mediante el siguiente comando:

     kubectl api-versions | grep admissionregistration.k8s.io/v1beta1
    

    El siguiente resultado indica que la API está habilitada:

     admissionregistration.k8s.io/v1beta1
    
  • Los controladores de admisión de webhook de admisión de webhook de admisión y validación de webhook de admisión deben agregarse y enumerarse en el orden correcto en la bandera de control de admisión de kube-apiserver.

Con Minikube, puede realizar esta tarea iniciando Minikube con el siguiente comando:

    minikube start --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook`
  • Asegúrese de tener permisos de administrador de clústeres.

     kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user <YOUR USER NAME>
    

Mutar la configuración de webhook de admisión

Para obtener más información sobre la mutación de la configuración de webhook de admisión, consulte ingress-admission-webhook.

En el ejemplo de webhook de admisión con mutación se tratan los siguientes casos de uso:

  • Actualizar el puerto en un Ingress en función del nombre de Ingress
  • Habilite un back-end seguro con fuerza en función de un espacio de nombres

Validación de la configuración de webhook de admisión mediante Gatekeeper

Gatekeeper usa una CRD que le permite crear restricciones como recursos de Kubernetes. Este CRD se denomina ConstraintTemplate en Gatekeeper. El esquema de la restricción permite a un administrador ajustar el comportamiento de una restricción, de forma similar a los argumentos de una función. Las restricciones se utilizan para informar a Gatekeeper de que el administrador quiere que se aplique una plantilla de restricción y de qué manera.

Puede aplicar varias directivas mediante plantillas de restricciones. En la biblioteca Gatekeeperse enumeran varios ejemplos.

Implementación de una directiva de muestra

Realice los siguientes pasos para implementar HttpsOnly como una directiva de ejemplo con Gatekeeper. La HttpsOnly directiva solo permite una configuración de Ingress con HTTPS.

  1. Instale Gatekeeper con el siguiente comando.

    Nota:

    En este paso, Gatekeeper se instala con una imagen precompilada. Puede instalar Gatekeeper mediante varios métodos mencionados en la instalación de Gatekeeper.

    # kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml
    

    Puede comprobar la instalación mediante el siguiente comando.

    kubectl get crd | grep -i constraintsonstrainttemplates.templates.gatekeeper.sh  
    

    Puede comprobar todas las plantillas de restricciones mediante el siguiente comando:

     kubectl get constrainttemplates.templates.gatekeeper.sh
    
  2. Aplique la plantilla de httpsonly restricción.

     kubectl apply -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/template.yaml
    
  3. Aplique una restricción para hacer cumplir la directiva httpsonly.

     kubectl apply -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/constraint.yaml
    
  4. Implemente un Ingress de muestra que infrinja la directiva para verificar la directiva. Debería mostrar un error al crear el Ingress.

    kubectl apply -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/bad-example-ingress.yaml
    
    Error from server ([denied by ingress-https-only] Ingress must be https. tls configuration is required for test-ingress): error when creating "ingress.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by ingress-https-only] Ingress must be https. tls configuration is required for test-ingress
    
  5. Ahora, implemente un Ingress que tenga la sección TLS requerida en Ingress.

     # kubectl apply -f  https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/good-example-ingress.yaml
           
     ingress.networking.k8s.io/test-ingress created
    
  6. Limpie la instalación con los siguientes comandos una vez que haya finalizado la verificación de las directivas de Gatekeeper.

    Uninstall all packages and template installed.
    kubectl delete -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/good-example-ingress.yaml
    kubectl delete -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/constraint.yaml
    kubectl delete -f https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/master/docs/how-to/webhook/httpsonly/template.yaml
    kubectl delete -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml
    

Más casos de uso de muestra

Hay varios casos de uso listados en el directorio webhook. Los pasos son similares a los especificados en el ejemplo y se pueden resumir de la siguiente manera:

  1. Aplique el archivo YAML de plantilla que se proporciona en cada directorio de casos de uso.
  2. Aplica el archivo YAML de restricciones.
  3. Verifique aplicando archivos YAML de muestra incorrectos o correctos para validar el caso de uso.

Para otros casos de uso, consulte la biblioteca Gatekeeper.

Soporte para webhooks de controladores de admisión