El conector ModSecurity-nginx es el punto de conexión entre nginx y libmodsecurity (ModSecurity v3). Dicho de otra manera, este proyecto proporciona un canal de comunicación entre nginx y libmodsecurity. Este conector es necesario para utilizar LibModSecurity con nginx.
El conector ModSecurity-nginx toma la forma de un módulo nginx. El módulo simplemente sirve como una capa de comunicación entre nginx y ModSecurity.
Tenga en cuenta que este proyecto depende de libmodsecurity en lugar de ModSecurity (versión 2.9 o menos).
La versión anterior usa ModSecurity independiente, que es un contenedor para que los componentes internos de Apache vinculen ModSecurity a nginx. Esta versión actual está más cerca de nginx y consume el nuevo libmodsecurity que ya no depende de Apache. Como resultado, esta versión actual tiene menos dependencias, menos errores y es más rápida. Además, también se proporcionan algunas funciones nuevas, como la posibilidad de utilizar la configuración de reglas globales con personalizaciones por directorio/ubicación (por ejemplo, SecRuleRemoveById).
Antes de compilar este software, asegúrese de tener instalado libmodsecurity. Puedes descargarlo desde el repositorio git de ModSecurity. Para obtener información relacionada con la compilación e instalación de libmodsecurity, consulte la documentación proporcionada junto con el mismo.
Con libmodsecurity instalado, puede continuar con la instalación del conector ModSecurity-nginx, que sigue el procedimiento de instalación del módulo de terceros nginx. Desde el directorio fuente de nginx:
./configure --add-module=/path/to/ModSecurity-nginx
O, para construir un módulo dinámico:
./configure --add-dynamic-module=/path/to/ModSecurity-nginx --with-compat
Tenga en cuenta que al crear un módulo dinámico, su versión fuente de nginx debe coincidir con la versión de nginx para la que está compilando esto.
Más información sobre la compatibilidad con complementos de terceros de nginx está disponible aquí: http://wiki.nginx.org/3rdPartyModules
ModSecurity para nginx amplía sus directivas de configuración de nginx. Añade cuatro nuevas directivas y son:
sintaxis: modsecurity activado | apagado
contexto: http, servidor, ubicación
predeterminado: desactivado
Activa o desactiva la funcionalidad ModSecurity. Tenga en cuenta que esta directiva de configuración ya no está relacionada con el estado SecRule. En cambio, ahora sirve únicamente como indicador nginx para habilitar o deshabilitar el módulo.
sintaxis: modsecurity_rules_file
contexto: http, servidor, ubicación
predeterminado: no
Especifica la ubicación del archivo de configuración modsecurity, por ejemplo:
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_file /etc/my_modsecurity_rules.conf;
}
}
sintaxis: modsecurity_rules_remote
contexto: http, servidor, ubicación
predeterminado: no
Especifica desde dónde (en Internet) se descargará un archivo de configuración de modsecurity. También especifica la clave que se utilizará para autenticarse en ese servidor:
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_remote my-server-key https://my-own-server/rules/download;
}
}
sintaxis: modsecurity_rules
contexto: http, servidor, ubicación
predeterminado: no
Permite la inclusión directa de una regla ModSecurity en la configuración de nginx. El siguiente ejemplo carga reglas desde un archivo e inyecta configuraciones específicas por directorio/alias:
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_file /etc/my_modsecurity_rules.conf;
}
location /ops {
root /var/www/html/opts;
modsecurity_rules '
SecRuleEngine On
SecDebugLog /tmp/modsec_debug.log
SecDebugLogLevel 9
SecRuleRemoveById 10
' ;
}
}
sintaxis: cadena modsecurity_transaction_id
contexto: http, servidor, ubicación
predeterminado: no
Permite pasar el ID de transacción desde nginx en lugar de generarlo en la biblioteca. Esto puede resultar útil para fines de seguimiento; por ejemplo, considere esta configuración:
log_format extended ' $remote_addr - $remote_user [ $time_local ] '
'" $request " $status $body_bytes_sent '
'" $http_referer " " $http_user_agent " $request_id ' ;
server {
server_name host1;
modsecurity on;
modsecurity_transaction_id "host1- $request_id " ;
access_log logs/host1-access.log extended;
error_log logs/host1-error.log;
location / {
...
}
}
server {
server_name host2;
modsecurity on;
modsecurity_transaction_id "host2- $request_id " ;
access_log logs/host2-access.log extended;
error_log logs/host2-error.log;
location / {
...
}
}
Usando una combinación de log_format y modsecurity_transaction_id podrá encontrar correlaciones entre las entradas del registro de acceso y del registro de errores usando el mismo identificador único.
La cadena puede contener variables.
Como proyecto de código abierto, invitamos (y animamos) a cualquier persona de la comunidad a contribuir a nuestro proyecto. Esto puede tomar la forma de: nueva funcionalidad, corrección de errores, informes de errores, soporte para usuarios principiantes y cualquier otra cosa con la que esté dispuesto a ayudar. Gracias.
Preferimos tener su parche dentro de la infraestructura de GitHub para facilitar nuestro trabajo de revisión y nuestra integración de control de calidad. GitHub proporciona una excelente documentación sobre cómo realizar "solicitudes de extracción". Más información disponible aquí: https://help.github.com/articles/using-pull-requests/
Respete el estilo de codificación utilizado. Las solicitudes de extracción pueden incluir varias confirmaciones, por lo tanto, proporcione una solución o una funcionalidad por confirmación. No cambie nada fuera del alcance de su trabajo objetivo (por ejemplo, el estilo de codificación en una función que haya pasado por alto).
Dentro de nuestro código hay varios elementos marcados como TODO o FIXME que pueden necesitar su atención. Verifique la lista de elementos realizando un grep:
$ cd /path/to/modsecurity-nginx
$ egrep -Rin "TODO|FIXME" -R *
También puede consultar los informes de errores recientes y los problemas abiertos para tener una idea de qué tipo de ayuda estamos buscando.
Además de las pruebas manuales, le recomendamos encarecidamente que utilice la utilidad de prueba nginx para asegurarse de que su parche no afecte negativamente el comportamiento o el rendimiento de nginx.
Las pruebas de nginx están disponibles en: http://hg.nginx.org/nginx-tests/
Para utilizar esas pruebas, asegúrese de tener la utilidad Perl (parte de Perl 5) y continúe con los siguientes comandos:
$ cp /path/to/ModSecurity-nginx/tests/* /path/to/nginx/test/repository
$ cd /path/to/nginx/test/repository
$ TEST_NGINX_BINARY=/path/to/your/nginx prove .
Si tiene problemas para que su funcionalidad adicional pase todas las pruebas de nginx, no dude en contactarnos o contactar con la lista de correo de nginx en: http://nginx.org/en/support.html
Respetamos el esquema de depuración de nginx. Al utilizar la opción de configuración "--with-debug" durante la configuración de nginx, también habilitará los mensajes de depuración del conector. Se espera que los volcados de núcleo y los fallos se depuren de la misma manera que se utiliza para depurar nginx. Para obtener más información, consulte la información de depuración de nginx: http://wiki.nginx.org/Debugging
Si tiene un problema de configuración o si algo no funciona como espera, utilice la lista de correo de usuarios de ModSecurity. Los problemas en GitHub también son bienvenidos, pero preferimos que los usuarios hagan preguntas primero en la lista de correo, donde pueden llegar a toda una comunidad. Además, no olvide buscar un problema existente antes de abrir uno nuevo.
Por último, si planea abrir un problema en GitHub, no olvide indicarnos la versión de su libmodsecurity y la versión del conector nginx que está ejecutando.
No informe públicamente ningún problema de seguridad. En su lugar, contáctenos en: [email protected] para informar el problema. Una vez que se solucione el problema, le proporcionaremos crédito por el descubrimiento.
Nos encantaría analizar cualquier idea que pueda tener para una nueva función. Tenga en cuenta que este es un proyecto impulsado por la comunidad, así que asegúrese de comunicarse con la comunidad a través de la lista de correo para recibir comentarios primero. Alternativamente, no dudes en abrir los problemas de GitHub solicitando nuevas funciones. Antes de abrir una nueva edición, verifique si existe una solicitud de función para la funcionalidad deseada.
Tener nuestros paquetes en las distribuciones a tiempo es algo que deseamos mucho. Háganos saber si hay algo que podamos hacer para facilitar su trabajo como empaquetador.