BLOG | NGINX

Compilación de módulos dinámicos de terceros para NGINX y NGINX Plus

NGINX - Parte de F5 - horizontal, negro, tipo RGB
Miniatura de Owen Garrett
Owen Garrett
Publicado el 25 de octubre de 2016

Editor : La publicación del blog que anuncia el lanzamiento original del soporte para módulos dinámicos (en NGINX Open Source 1.9.11, febrero de 2016) redirige aquí. El proceso de compilación descrito en esa publicación está obsoleto.

Esta publicación es parte de una serie de dos partes sobre el uso de módulos dinámicos de terceros con NGINX Open Source y NGINX Plus.

  • Esta publicación proporciona instrucciones paso a paso para compilar módulos dinámicos de terceros que pueden cargarse mediante NGINX Open Source o NGINX Plus en tiempo de ejecución.
  • La segunda publicación proporciona orientación y herramientas para automatizar la creación de módulos dinámicos de terceros para un entorno de producción. Explica cómo crear paquetes instalables para módulos dinámicos de terceros que incluyen verificación de dependencia de versiones.

 

NGINX Open Source 1.11.5 y NGINX Plus Release R11 introdujeron compatibilidad binaria para módulos dinámicos. Este artículo explica cómo compilar módulos de terceros para usar con NGINX Open Source y NGINX Plus en un entorno de desarrollo. Para obtener instrucciones sobre cómo crear, implementar y actualizar módulos dinámicos de terceros en un entorno de producción, consulte Creación de paquetes instalables para módulos dinámicos .

Por el bien de la brevedad, el resto de esta publicación se refiere únicamente a NGINX Plus, excepto cuando la diferencia entre este y NGINX Open Source sea relevante. Salvo que se indique lo contrario, todas las declaraciones sobre NGINX Plus también se aplican a NGINX Open Source.

Descripción general de los módulos dinámicos

Los módulos que se pueden cargar en NGINX Plus están escritos en C y cumplen con la API descrita en Extender NGINX en NGINX Wiki. Existe un gran ecosistema de módulos de terceros , que van desde intérpretes de idiomas hasta soluciones de seguridad, y algunos de ellos están incluidos y son compatibles con NGINX Plus.

Otros módulos de terceros, y módulos que usted mismo ha creado, deben compilarse de forma independiente y cargarse dinámicamente en NGINX Plus en tiempo de ejecución. Puede compilar estos módulos para usarlos con NGINX Plus al compilarlos contra NGINX Open Source como se ilustra en los dos ejemplos a continuación:

  1. Obtenga la versión de código abierto NGINX correspondiente
  2. Obtenga las fuentes del módulo y cambie el archivo de configuración del módulo si es necesario
  3. Construya el módulo dinámico contra la versión de código abierto de NGINX, con el argumento --with-compat en el comando de configuración
  4. Cargue el módulo dinámico resultante (el archivo .so ) en NGINX Plus y úselo como si fuera un módulo integrado

Example: Un módulo sencillo de «Hola mundo»

Este ejemplo utiliza un módulo Hola Mundo simple para mostrar cómo actualizar la fuente de un módulo y cargarlo en NGINX Plus. El módulo “Hello World” implementa una directiva simple ( hello_world ) que responde a las solicitudes con un mensaje simple.

Paso 1: Obtenga la versión de código abierto de NGINX

  1. Determine la versión de código abierto de NGINX que corresponde a su instalación de NGINX Plus. En este ejemplo, es NGINX 1.11.5.

    $ nginx -v versión de nginx: nginx/1.11.5 (nginx-plus-r11)
    
  2. Descargue el paquete de código abierto NGINX correspondiente en nginx.org/download :

    $ wget https://nginx.org/download/nginx-1.11.5.tar.gz $ tar -xzvf nginx-1.11.5.tar.gz
    

Paso 2: Obtener las fuentes del módulo

  1. Obtenga la fuente del módulo NGINX 'Hello World' desde GitHub :

    $ git clone https://github.com/perusio/nginx-hello-world-module.git
    
  2. El archivo de configuración de shell de un módulo define cómo se construye, y su formato es diferente para los módulos dinámicos que para los módulos que se construyen estáticamente en un binario de código abierto NGINX.

    Modifique el archivo nginx-hello-world-module/config para que contenga lo siguiente:

    Nombre_complemento_ngx=módulo_ngx_http_hola_mundo
    
    Si prueba -n "$enlace_módulo_ngx"; Entonces
    Tipo_módulo_ngx=HTTP
    Nombre_módulo_ngx=módulo_ngx_http_hola_mundo
    Fuente_módulo_ngx="$dir_complemento_ngx/módulo_ngx_http_hola_mundo.c"
    
    . auto/módulo
    De lo contrario
    MÓDULOS_HTTP="$MÓDULOS_HTTP módulo_ngx_http_hola_mundo"
    SRCS_ADDON_NGX="$dir_complemento_ngx/módulo_ngx_http_hola_mundo.c"
    fi
    

Para obtener información detallada sobre la compilación de módulos dinámicos, incluidas instrucciones sobre cómo actualizar el archivo de configuración de un módulo desde el formato anterior, consulte NGINX Wiki .

Paso 3: Compilar el módulo dinámico

  1. Compile el módulo ejecutando primero el script de configuración con el argumento --with-compat , que crea un entorno de compilación estándar compatible con NGINX Open Source y NGINX Plus. Luego ejecute make modules para construir el módulo:

    $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module $ crear módulos
    
  2. Copie la biblioteca de módulos (archivo .so ) a /etc/nginx/modules :

    $ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/
    

Paso 4: Cargar y utilizar el módulo

  1. Para cargar el módulo en NGINX Plus, agregue la directiva load_module en el contexto de nivel superior (principal) de su archivo de configuración nginx.conf (no dentro del contexto http o de transmisión ):

    módulo de carga módulos/ngx_http_hello_world_module.so;
    
  2. En el contexto http , agregue un bloque de ubicación con la directiva hello_world proporcionada por el módulo Hello World. Las solicitudes a la ubicación devuelven la respuesta hola mundo .

    servidor {
    escuchar 80;
    
    ubicación / {
    hola_mundo;
    }
    }
    
  3. Recargue su configuración de NGINX Plus y pruébela con una solicitud simple:

    $ nginx -s reload $ curl http://localhost/ hola mundo
    

Example: El firewall de aplicação web NAXSI

NAXSI es un firewall de aplicação web (WAF) de alto rendimiento y fácil de usar que utiliza heurística y un sistema de puntuación para identificar solicitudes sospechosas, como ataques XSS e inyección SQL.

La fuente NAXSI se ha actualizado para cumplir con el nuevo formato del archivo de shell de configuración , por lo que crear un módulo dinámico para NGINX Plus es sencillo. El proceso se basa en las instrucciones de instalación de NAXSI :

$ git clone https://github.com/nbs-system/naxsi.git $ cd nginx-1.11.5/ $ ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src $ crear módulos $ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

Cargue el módulo en el núcleo NGINX Plus agregando la directiva load_module al contexto principal en su archivo nginx.conf :

módulo de carga módulos/ngx_http_naxsi_module.so;

La configuración de NAXSI se describe en detalle en la documentación del proyecto . La siguiente configuración de NGINX ilustra el módulo en acción:

# Edite esta directiva 'include' para que apunte a su archivo naxsi_core.rules
include /home/owen/src/naxsi/naxsi_config/naxsi_core.rules;

servidor {
listen 80;

ubicación / {
root /usr/share/nginx/html;

# Habilitar NAXSI
SecRulesEnabled;

# Definir adónde van las solicitudes bloqueadas
DeniedUrl "/50x.html";

# Reglas de verificación, que determinan cuándo NAXSI debe actuar
Regla de verificación "$SQL >= 8" BLOQUE;
Regla de verificación "$RFI >= 8" BLOQUE;
Regla de verificación "$TRAVERSAL >= 4" BLOQUE;
Regla de verificación "$EVADE >= 4" BLOQUE;
Regla de verificación "$XSS >= 8" BLOQUE;

# No olvides el registro de errores, donde se registran las solicitudes bloqueadas
error_log /tmp/naxsi.log;
}

error_page 500 502 503 504 /50x.html;
}

Puede verificar el correcto funcionamiento de NAXSI con un par de simples solicitudes HTTP:

  • curl http://localhost/ devuelve la página de índice estándar de NGINX Plus almacenada en /usr/share/nginx/html .
  • curl "http://localhost/?a=<>" activa la detección XSS de NAXSI y bloquea la solicitud, devolviendo la página de error estándar 50x.html de /usr/share/nginx/html . También registra un mensaje en error_log .

Para implementaciones de producción, también puede descargar versiones firmadas de NAXSI en https://github.com/nbs-system/naxsi/tags y compilarlas de manera similar.

Cómo damos soporte a los módulos dinámicos en NGINX Plus

Nota:  La información de esta sección se aplica únicamente a NGINX Plus. El conjunto de módulos dinámicos que viene con los paquetes de código abierto NGINX prediseñados puede ser diferente de los que vienen con NGINX Plus. Los módulos dinámicos utilizados con NGINX Open Source reciben soporte de la misma manera que el código fuente de NGINX y los binarios prediseñados.

NGINX Plus viene con una serie de módulos dinámicos que también puedes descargar directamente desde nuestro repositorio de módulos. Para obtener una lista, consulte la página Módulos dinámicos . Estos módulos son de dos tipos:

  • Los módulos NGINX Plus están escritos y/o mantenidos por el equipo de ingeniería de NGINX. No los incluimos en NGINX Plus por razones técnicas (por ejemplo, tienen dependencias adicionales) o porque están en estado de vista previa. Los módulos de vista previa están en desarrollo activo y solo deben implementarse con mucho cuidado. De lo contrario, los módulos NGINX Plus son totalmente compatibles con NGINX. Para ver la lista, filtre por autor NGINX en la página de Módulos Dinámicos .
  • Los módulos comunitarios certificados por NGINX Plus son módulos populares de terceros que NGINX prueba y distribuye, y para los cuales brindamos soporte con instalación y configuración básica. Garantizamos que estos módulos no interfieren con el funcionamiento correcto de NGINX Plus y los actualizamos según sea necesario en cada versión de NGINX Plus o cuando hay una versión de seguridad. Para obtener una lista, filtre por autor de la Comunidad en la página Módulos dinámicos .

Además, NGINX certifica módulos de proveedores comerciales que participan en nuestro programa de Módulos Certificados NGINX Plus . Estos módulos son distribuidos y soportados por sus proveedores. Para obtener una lista, filtre por autor Socio Certificado en la página Módulos dinámicos .

NGINX no prueba ni brinda soporte a los módulos que usted compila usted mismo (otros módulos de la comunidad, módulos proporcionados por proveedores externos que no son parte del programa de módulos certificados NGINX Plus y módulos personalizados). Si busca asistencia técnica para un problema, el equipo de soporte de NGINX puede solicitarle que elimine un módulo no compatible y reproduzca la falla como parte de nuestro proceso de soporte técnico, para que puedan verificar si la falla es causada o no por el módulo no compatible.

resumen

El proceso de creación de módulos dinámicos para NGINX Plus le permite aprovechar el amplio ecosistema de módulos de código abierto de NGINX y ejecutarlos en el núcleo completo y con soporte completo de NGINX Plus.

Si actualmente está utilizando NGINX Open Source con extensiones de terceros, lo más probable es que estas extensiones se puedan compilar y cargar en NGINX Plus.

Si desarrolla módulos comerciales o comunitarios, el nuevo proceso de compilación significa que sus usuarios pueden implementar sus módulos con NGINX Plus. Para obtener más información sobre cómo certificar un módulo comercial, consulte Módulos certificados NGINX Plus .

Si necesita ayuda para desarrollar un módulo o actualizar su archivo de configuración , consulte los siguientes recursos:

La lista de correo de desarrolladores de NGINX es el lugar al que acudir para obtener asistencia de la comunidad, y nuestro equipo de Servicios Profesionales también estará encantado de ayudarle.

Para probar usted mismo los módulos dinámicos con NGINX Plus, comience hoy mismo una prueba gratuita de 30 días o contáctenos para analizar sus casos de uso .


"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.