Protección de los clústeres de Azure Kubernetes Service (AKS) con Azure Policy

Puedes aplicar y hacer cumplir directivas de seguridad integradas en tus clústeres de Azure Kubernetes Service (AKS) mediante Azure Policy. Azure Policy ayuda a hacer cumplir los estándares de la organización y evalúa el cumplimiento a escala. Después de instalar el complemento de Azure Policy para AKS, puedes aplicar definiciones de directivas individuales o grupos de definiciones de directivas denominadas iniciativas (a veces denominadas conjuntos de directivas) a tu clúster. Para ver una lista completa de definiciones de directiva e iniciativa de AKS, consulte Definiciones integradas de Azure Policy para Azure Kubernetes Service.

En este artículo se muestra cómo aplicar definiciones de directiva al clúster y comprobar que se aplican esas asignaciones.

Requisitos previos

Asignación de una definición o iniciativa de directiva integrada

Puedes aplicar una definición o iniciativa de directiva en el Azure Portal mediante los pasos siguientes:

  1. Navega hasta el servicio de Azure Policy en Azure Portal denominado Directiva.
  2. En el panel izquierdo de la página de Azure Policy, seleccione Definitions (Definiciones).
  3. En Categorías, selecciona Kubernetes.
  4. Elija la definición o iniciativa de directiva que quiera aplicar. Para este ejemplo, selecciona los estándares de referencia de seguridad del módulo de clúster de Kubernetes para la iniciativa de cargas de trabajo basadas en Linux.
  5. Seleccione Asignar.
  6. Establece el valor de Ámbito en el grupo de recursos del clúster de AKS con el complemento de Azure Policy habilitado.
  7. Seleccione la página Parámetros y actualice Efecto de audit a deny para impedir que las nuevas implementaciones infrinjan la iniciativa de línea de base. También puedes agregar espacios de nombres adicionales para excluirlos de la evaluación. En este ejemplo, conserve los valores predeterminados.
  8. Selecciona Revisar + crear>Crear para enviar la asignación de directivas.

Creación y asignación de una definición de directiva personalizada

Las directivas personalizadas permiten definir reglas para usar Azure. Por ejemplo, puedes aplicar los siguientes tipos de reglas:

  • Prácticas de seguridad
  • Administración de costos
  • Reglas específicas de la organización (como nombres o ubicaciones)

Antes de crear una directiva personalizada, compruebe la lista de patrones y ejemplos comunes para ver si ya incluye su caso.

Las definiciones de directivas personalizadas se escriben en JSON. Para más información sobre cómo crear una directiva personalizada, consulte Estructura de definición de Azure Policy y Creación de una definición de directiva personalizada.

Nota

Azure Policy ahora utiliza una nueva propiedad conocida como templateInfo que te permite definir el tipo de fuente para la plantilla de restricción. Cuando defines templateInfo en las definiciones de directivas, no tienes que definir las propiedades de constraintTemplate o define. No obstante, tienes que definir apiGroups y kinds. Para más información, consulte Descripción de los efectos de Azure Policy.

Una vez que hayas creado tu definición de directiva personalizada, consulta Asignar una definición de directiva para obtener un tutorial paso a paso sobre cómo asignar la directiva al clúster de Kubernetes.

Validar que se está ejecutando Azure Policy

  • Confirma que las asignaciones de directivas se aplican al clúster mediante el siguiente comando kubectl get.

    kubectl get constrainttemplates
    

    Nota

    Las asignaciones de directivas pueden tardar hasta 20 minutos en sincronizarse con cada clúster.

    La salida debe ser similar a la siguiente salida de ejemplo:

    NAME                                     AGE
    k8sazureallowedcapabilities              23m
    k8sazureallowedusersgroups               23m
    k8sazureblockhostnamespace               23m
    k8sazurecontainerallowedimages           23m
    k8sazurecontainerallowedports            23m
    k8sazurecontainerlimits                  23m
    k8sazurecontainernoprivilege             23m
    k8sazurecontainernoprivilegeescalation   23m
    k8sazureenforceapparmor                  23m
    k8sazurehostfilesystem                   23m
    k8sazurehostnetworkingports              23m
    k8sazurereadonlyrootfilesystem           23m
    k8sazureserviceallowedports              23m
    

Validación del rechazo de un pod con privilegios

Vamos a probar primero lo que sucede cuando se programa un pod con el contexto de seguridad privileged: true. Este contexto de seguridad eleva los privilegios del pod. La iniciativa no permite los pods privilegiados, por lo que se deniega la solicitud, lo que provoca que se rechace la implementación.

  1. Cree un archivo denominado nginx-privileged.yaml y pegue el siguiente manifiesto de YAML.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-privileged
    spec:
      containers:
        - name: nginx-privileged
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          securityContext:
            privileged: true
    
  2. Cree el pod con el comando kubectl apply y especifique el nombre de su manifiesto de YAML.

    kubectl apply -f nginx-privileged.yaml
    

    Como se esperaba, el pod no se puede incluir en la programación, como se muestra en la salida del ejemplo siguiente:

    Error from server ([denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}): error when creating "privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}
    

    El pod no llega a la fase de programación, por lo que no hay recursos que eliminar para continuar.

Prueba de la creación de un pod sin privilegios

En el ejemplo anterior la imagen de contenedor intentó automáticamente utilizar la raíz para enlazar NGINX al puerto 80. La iniciativa de directiva deniega esta solicitud, por lo que el pod no se inicia. Ahora, intentemos ejecutar ese mismo pod NGINX sin acceso privilegiado.

  1. Cree un archivo denominado nginx-unprivileged.yaml y pegue el siguiente manifiesto de YAML.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-unprivileged
    spec:
      containers:
        - name: nginx-unprivileged
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
    
  2. Cree el pod con el comando kubectl apply y especifique el nombre de su manifiesto de YAML.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Compruebe el estado del pod con el comando kubectl get pods.

    kubectl get pods
    

    Tu salida debe ser similar a la siguiente salida de ejemplo, que muestra que el pod se programó correctamente y tiene un estado de En ejecución:

    NAME                 READY   STATUS    RESTARTS   AGE
    nginx-unprivileged   1/1     Running   0          18s
    

    Este ejemplo muestra la iniciativa de referencia que afecta solo a las implementaciones que infringen las directivas de la colección. Las implementaciones permitidas continúan funcionando.

  4. Elimine el pod NGIX sin privilegios mediante el comando kubectl delete y especifique el nombre del manifiesto de YAML.

    kubectl delete -f nginx-unprivileged.yaml
    

Deshabilitación de una directiva o iniciativa

Puedes quitar la iniciativa de línea base en el Azure Portal mediante los pasos siguientes:

  1. Ve al panel Directiva en Azure Portal.
  2. Seleccione Asignaciones.
  3. Seleccione el botón... junto a los estándares de referencia de seguridad del módulo de clúster de Kubernetes para la iniciativa de carga de trabajo basada en Linux.
  4. Seleccione Eliminar asignación.

Pasos siguientes

Para obtener más información sobre cómo funciona Azure Policy, consulta los siguientes artículos: