Le connecteur ModSecurity-nginx est le point de connexion entre nginx et libmodsecurity (ModSecurity v3). Autrement dit, ce projet fournit un canal de communication entre nginx et libmodsecurity. Ce connecteur est requis pour utiliser LibModSecurity avec nginx.
Le connecteur ModSecurity-nginx prend la forme d'un module nginx. Le module sert simplement de couche de communication entre nginx et ModSecurity.
Notez que ce projet dépend de libmodsecurity plutôt que de ModSecurity (version 2.9 ou inférieure).
L'ancienne version utilise ModSecurity autonome, qui est un wrapper permettant aux composants internes d'Apache de lier ModSecurity à nginx. Cette version actuelle est plus proche de nginx, consommant la nouvelle libmodsecurity qui ne dépend plus d'Apache. En conséquence, cette version actuelle comporte moins de dépendances, moins de bugs et est plus rapide. De plus, de nouvelles fonctionnalités sont également fournies, telles que la possibilité d'utiliser la configuration de règles globales avec des personnalisations par répertoire/emplacement (par exemple SecRuleRemoveById).
Avant de compiler ce logiciel, assurez-vous que libmodsecurity est installé. Vous pouvez le télécharger depuis le référentiel git ModSecurity. Pour plus d'informations concernant la compilation et l'installation de libmodsecurity, veuillez consulter la documentation fournie avec celui-ci.
Une fois libmodsecurity installé, vous pouvez procéder à l'installation du connecteur ModSecurity-nginx, qui suit la procédure d'installation du module tiers nginx. Depuis le répertoire source de nginx :
./configure --add-module=/path/to/ModSecurity-nginx
Ou, pour créer un module dynamique :
./configure --add-dynamic-module=/path/to/ModSecurity-nginx --with-compat
Notez que lors de la création d'un module dynamique, votre version source de nginx doit correspondre à la version de nginx pour laquelle vous le compilez.
De plus amples informations sur la prise en charge des modules complémentaires tiers nginx sont disponibles ici : http://wiki.nginx.org/3rdPartyModules
ModSecurity pour nginx étend vos directives de configuration nginx. Il ajoute quatre nouvelles directives et ce sont :
syntaxe : modsecurity sur | désactivé
contexte : http, serveur, emplacement
par défaut : désactivé
Active ou désactive la fonctionnalité ModSecurity. Notez que cette directive de configuration n'est plus liée à l'état SecRule. Au lieu de cela, il sert désormais uniquement d'indicateur nginx pour activer ou désactiver le module.
syntaxe : modsecurity_rules_file
contexte : http, serveur, emplacement
par défaut : non
Spécifie l'emplacement du fichier de configuration modsecurity, par exemple :
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_file /etc/my_modsecurity_rules.conf;
}
}
syntaxe : modsecurity_rules_remote
contexte : http, serveur, emplacement
par défaut : non
Spécifie d'où (sur Internet) un fichier de configuration modsecurity sera téléchargé. Il spécifie également la clé qui sera utilisée pour s'authentifier auprès de ce serveur :
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_remote my-server-key https://my-own-server/rules/download;
}
}
syntaxe : modsecurity_rules
contexte : http, serveur, emplacement
par défaut : non
Permet l'inclusion directe d'une règle ModSecurity dans la configuration nginx. L'exemple suivant consiste à charger des règles à partir d'un fichier et à injecter des configurations spécifiques par répertoire/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
' ;
}
}
syntaxe : chaîne modsecurity_transaction_id
contexte : http, serveur, emplacement
par défaut : non
Permet de transmettre l'ID de transaction depuis nginx au lieu de le générer dans la bibliothèque. Cela peut être utile à des fins de traçage, par exemple considérez cette configuration :
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 / {
...
}
}
En utilisant une combinaison de log_format et modsecurity_transaction_id, vous pourrez trouver des corrélations entre le journal d'accès et les entrées du journal d'erreurs en utilisant le même identifiant unique.
La chaîne peut contenir des variables.
En tant que projet open source, nous invitons (et encourageons) toute personne de la communauté à contribuer à notre projet. Cela peut prendre la forme de : de nouvelles fonctionnalités, des corrections de bogues, des rapports de bogues, une assistance aux utilisateurs débutants et toute autre chose pour laquelle vous êtes prêt à aider. Merci.
Nous préférons avoir votre correctif au sein de l'infrastructure GitHub pour faciliter notre travail de révision et notre intégration d'assurance qualité. GitHub fournit une excellente documentation sur la façon d'effectuer des « Pull Requests ». Plus d'informations disponibles ici : https://help.github.com/articles/using-pull-requests/
Veuillez respecter le style de codage utilisé. Les demandes d'extraction peuvent inclure divers commits, fournissez donc un correctif ou une fonctionnalité par commit. Ne changez rien en dehors du cadre de votre travail cible (par exemple, le style de codage dans une fonction que vous avez dépassée).
Dans notre code, divers éléments marqués TODO ou FIXME peuvent nécessiter votre attention. Vérifiez la liste des éléments en effectuant un grep :
$ cd /path/to/modsecurity-nginx
$ egrep -Rin "TODO|FIXME" -R *
Vous pouvez également consulter les rapports de bogues récents et les problèmes en suspens pour avoir une idée du type d'aide que nous recherchons.
Parallèlement aux tests manuels, nous vous recommandons fortement d'utiliser l'utilitaire de test nginx pour vous assurer que votre correctif n'affecte pas négativement le comportement ou les performances de nginx.
Les tests nginx sont disponibles sur : http://hg.nginx.org/nginx-tests/
Pour utiliser ces tests, assurez-vous d'avoir l'utilitaire Perl proof (qui fait partie de Perl 5) et exécutez les commandes suivantes :
$ 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 vous rencontrez des problèmes pour que votre fonctionnalité ajoutée réussisse tous les tests nginx, n'hésitez pas à nous contacter ou à contacter la liste de diffusion nginx à l'adresse : http://nginx.org/en/support.html
Nous respectons le schéma de débogage nginx. En utilisant l'option de configuration "--with-debug" lors de la configuration de nginx, vous activerez également les messages de débogage du connecteur. Les core dumps et les crashs devraient être débogués de la même manière que celle utilisée pour déboguer nginx. Pour plus d'informations, veuillez consulter les informations de débogage de nginx : http://wiki.nginx.org/Debugging
Si vous rencontrez un problème de configuration ou si quelque chose ne fonctionne pas comme prévu, veuillez utiliser la liste de diffusion des utilisateurs de ModSecurity. Les problèmes sur GitHub sont également les bienvenus, mais nous préférons d'abord poser les questions des utilisateurs sur la liste de diffusion, où vous pouvez atteindre une communauté entière. N'oubliez pas non plus de rechercher un problème existant avant d'en ouvrir un nouveau.
Enfin, si vous envisagez d'ouvrir un ticket sur GitHub, n'oubliez pas de nous indiquer la version de votre libmodsecurity et la version du connecteur nginx que vous utilisez.
Veuillez ne signaler publiquement aucun problème de sécurité. Contactez-nous plutôt à : [email protected] pour signaler le problème. Une fois le problème résolu, nous vous créditerons la découverte.
Nous serions ravis de discuter de toutes les idées que vous pourriez avoir pour une nouvelle fonctionnalité. Veuillez garder à l'esprit qu'il s'agit d'un projet mené par la communauté, alors assurez-vous de contacter la communauté via la liste de diffusion pour obtenir d'abord des commentaires. Vous pouvez également ouvrir des tickets GitHub pour demander de nouvelles fonctionnalités. Avant d'ouvrir un nouveau numéro, veuillez vérifier s'il existe une demande de fonctionnalité existante pour la fonctionnalité souhaitée.
Avoir nos packages dans les distributions à temps est quelque chose que nous souhaitons vivement. Faites-nous savoir si nous pouvons faire quelque chose pour faciliter votre travail en tant que conditionneur.