mod_policy Mise en conformité avec le protocole HTTP. Extension mod_policy.c policy_module

Le protocole HTTP recommande aux clients d'être "indulgents pour ce qu'ils doivent accepter", et aux serveurs d'être "stricts pour ce qu'ils envoient". Dans certains cas, il peut s'avérer difficile de déterminer si un serveur ou une application a été mal configuré, sert un contenu qui ne peut pas être mis en cache ou se comporte de manière non optimale, car le client HTTP est souvent en mesure de compenser les défauts du serveur. Ces problèmes peuvent induire une consommation de bande passante excessive, ou même une interruption de service suite à une charge trop importante du serveur.

Le module mod_policy propose un jeu de filtres qui permettent de tester la conformité du serveur au protocole HTTP. Ces tests permettent à l'administrateur du serveur de journaliser les violations, ou même de rejeter une réponse losque certaines conditions spécifiées se réalisent.

Il devient ainsi possible de définir des critères de conformité minimale au protocole HTTP pour développer des applications sans problème. En outre, il est possible de configurer un mandataire inverse ou un cache pour qu'il se protège lui-même contre les serveurs d'origine mal configurés ou les contenus indument impossible à être mis en cache, ou un mécanisme qui détecte les erreurs de configuration au sein du serveur lui-même.

Les filtres Conformité au protocole HTTP
Actions

Si une règle est violée, il possible d'effectuer les actions suivantes :

ignore
La vérification de la politique de conformité sera désactivée pour l'espace d'URL spécifié, même si le filtre est présent.
log
La vérification de la politique de conformité sera exécutée, et si une violation est détectée, un avertissement sera enregistré dans le journal error_log du serveur, et un en-tête Warning ajouté à la réponse en tant qu'information à destination du client.
enforce
La vérification de la politique de conformité sera exécutée, The policy check will be executed, and if a violation is detected an error will be logged to the server error_log, a Warning header added to the response, and a 502 Bad Gateway will be returned to the client. Optional links to explanatory documentation can be added to each error message, detailing the origin of each policy.

Il est aussi possible de désactiver toutes les règles pour un espace d'URL donné, si le besoin s'en fait sentir, via la directive PolicyFilter.

En outre, la directive PolicyEnvironment permet de spécifier une variable d'environnement qui, si elle est définie, va court-circuiter les règles ou diminuer leur portée.

Tests de la politique de filtrage

Les filtres suivants sont disponibles :

POLICY_TYPE : Impose la validité des types de contenus
La requête peut être rejetée suite à la présence de types de contenus vides ou syntaxiquement invalides. Les types peuvent aussi être restreints à une liste pouvant contenir des caractères génériques ? et *.
POLICY_LENGTH : Impose la présence de l'en-tête Content-Length
La longueur des réponses peut être spécifiée de trois manières différentes : en spécifiant à l'avance une longueur explicite, en utilisant un codage de morcellement (chunking) pour définir la longueur, ou en ne spécifiant aucune longueur et en terminant la requête lorsque son traitement est achevé. L'absence de spécification d'une longueur de contenu peut affecter la possibilité de mise en cache de la réponse, et empêcher l'utilisation de la persistance avec les requêtes de type HTTP/1.0. Ce filtre impose la présence d'une longueur de contenu explicite dans la réponse.
POLICY_KEEPALIVE : Impose l'option de persistance
Moins restrictif que le filtre POLICY_LENGTH, ce filtre impose la possibilité de persistance de la réponse. Si la réponse n'a pas de longueur définie à 0 par le protocole, si elle n'est pas une erreur, et si elle ne contient pas d'en-tête Content-Length ou si elle est de type HTTP/1.1 et ne contient pas l'en-tête Content-Encoding: chunked, alors elle sera rejetée.
POLICY_VARY : Interdit la présence de certains en-têtes au sein des en-têtes Vary
Si l'en-tête Vary contient un des en-têtes spécifiés, ce filtre va rejeter la requête. Un cas typique est la présence de l'en-tête User-Agent dans l'en-tête Vary, ce qui peut être à l'origine d'une condition de déni de service au niveau du cache.
POLICY_VALIDATION: Impose la présence d'un en-tête Etag et/ou Last-Modified
La possibilité pour un cache de déterminer si une entité qu'il contient peut être rafraîchie dépend de la présence d'un en-tête Etag et/ou Last-Modified pour vérifier si elle est valide. La requête sera rejetée en cas d'absence de ces deux en-têtes, ou d'une syntaxe invalide d'un de ces deux en-têtes.
POLICY_CONDITIONAL: Impose un traitement conforme des en-têtes conditionnels
Lorsqu'une requête contient des en-têtes conditonnels, un serveur doit répondre dans certaines conditions avec un code 304 Not Modified ou 412 Precondition Failed. Il arrive q'un serveur ignore les en-têtes conditionnels, et cela diminue l'efficacité du mécanisme de mise en cache HTTP. Ce filtre rejète les requêtes lorsqu'un en-tête conditionnel était présent, et une réponse 2xx a été renvoyée au lieu de la réponse 304 ou 412 attendue.
POLICY_NOCACHE : Impose la possibilité de mise en cache des réponses
Lorsqu'une requête se déclare elle-même impossible à mettre en cache, elle est rejetée. C'est le cas si elle contient l'un des en-têtes suivants :
  • Cache-Control: no-cache
  • Pragma: no-cache
  • Cache-Control: no-store
  • Cache-Control: private
POLICY_MAXAGE : Impose une durée de vie minimale
Lorsqu'une réponse possède une durée de vie inférieure à la valeur spécifiée, ou si cette durée de vie est heuristique, la requête est rejetée. La chronologie de la vérification d'une réponse est la suivante :
  • Si s-maxage est présent mais d'une valeur trop faible; ou
  • Si max-age est présent mais d'une valeur trop faible; ou
  • Si Expires est présent et invalide; ou
  • Date est présent et invalide; ou
  • Expires moins Date est trop faible ; ou
  • Aucun en-tête s-maxage, maxage, ou Expires/Date n'est présent
POLICY_VERSION : Impose une version HTTP minimale dans la requête
Lorsqu'une requête possède un numéro de version HTTP inférieur au numéro de version minimum requis, la requête est rejetée. Les numéros de version suivants sont reconnus :
  • HTTP/1.1
  • HTTP/1.0
  • HTTP/0.9
Exemple de configuration

Voici un exemple de configuration qui protège un serveur qui délivre du contenu statique :

<Location "/"> SetOutputFilter POLICY_TYPE;POLICY_LENGTH;POLICY_KEEPALIVE;POLICY_VARY;POLICY_VALIDATION; \ POLICY_CONDITIONAL;POLICY_NOCACHE;POLICY_MAXAGE;POLICY_VERSION # le contenu peut être quelconque, mais l'en-tête Content-Type doit être # présent et valide PolicyType enforce */* # rejet si aucune longueur de contenu déclarée PolicyLength enforce # pris en charge par le filtre policy length PolicyKeepalive ignore # rejet si l'en-tête User-Agent aparaît dans les en-têtes Vary PolicyVary enforce User-Agent # la validation est imposée PolicyValidation enforce # les réponses conditionnelles non conformes sont rejetées PolicyConditional enforce # les réponses impossibles à mettre en cache sont rejetées PolicyNocache enforce # la durée de vie doit être au moins d'un jour PolicyMaxage enforce 86400 # le numéro de version de la requête peut être quelconque PolicyVersion ignore HTTP/1.1 </Location> # désactivation du filtrage pour le répertoire /server-status <Location "/server-status"> PolicyFilter off </Location>
PolicyFilter Active ou désactive le filtrage pour un espace d'URL donné. PolicyFilter on|off on server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Commutateur principal qui permet d'activer ou de désactiver le filtrage pour un espace d'URL donné.

Example # activé par défaut <Location "/"> PolicyFilter on </Location> # désactivation du filtrage pour le répertoire /server-status <Location "/server-status"> PolicyFilter off </Location>
PolicyEnvironment Modification des règles de filtrage en fonction d'une variable d'environnement. PolicyEnvironment variable log-value ignore-value none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Limite l'action des règles à la journalisation ou les désactive totalement en fonction de la présence d'une variable d'environnement. Si la variable spécifiée est présente et égale à la valeur de l'argument log-value, les erreurs rencontrées par les filtres ne seront que journalisées. Si la variable spécifiée est présente et égale à la valeur de l'argument ignore-value, toutes les règles seront ignorées.

Example # limitation de l'action des règles si la variable POLICY_CONTROL # est présente PolicyEnvironment POLICY_CONTROL log ignore
PolicyConditional Active le filtrage des requêtes conditionnelles. PolicyConditional ignore|log|enforce ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse qui aurait du être conditionnelle mais ne l'est pas sera rejetée.

Exemple # les réponses conditionnelles non conformes doivent être rejetées PolicyConditional enforce
PolicyConditionalURL URL contenant la description de la politique de filtrage des requêtes conditionnelles. PolicyConditionalURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL de la documentation décrivant la politique de filtrage des requêtes conditionnelles ; elle apparaîtra dans les messages d'erreur.

PolicyLength Active le filtrage de la spécification de la longueur du contenu. PolicyLength ignore|log|enforce ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse qui ne contient pas d'en-tête Content-Length sera rejetée.

Exemple # rejet suite à l'absence de l'en-tête Content-Length PolicyLength enforce
PolicyLengthURL URL contenant la description de la politique de filtrage de la spécification de la longueur du contenu. PolicyLengthURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la documentation décrivant la politique de filtrage de la spécification de la longueur du contenu ; elle apparaîtra dans les messages d'erreur.

PolicyKeepalive Active la politique de persistance. PolicyKeepalive ignore|log|enforce ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse qui ne contient ni en-tête Content-Length, ni en-tête Transfer-Encoding de valeur chunked sera rejetée.

Exemple # rejet suite a absence d'en-tête Content-Length ou Transfer-Encoding PolicyKeepalive enforce
PolicyKeepaliveURL URL contenant la description de la politique de persistance. PolicyKeepaliveURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique de persistance ; elle apparaîtra dans les messages d'erreur.

PolicyType Active la politique des types de contenus. PolicyType ignore|log|enforce type [ type [ ... ]] ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse qui ne contient pas d'en-tête Content-Type, ou dont l'en-tête Content-Type est mal formé, ou dont l'en-tête Content-Type contient une valeur qui ne correspond pas au(x) modèle(s) spécifié(s) sera rejetée.

Exemple # impose le type de contenu json ou XML PolicyType enforce application/json text/xml Exemple # rejet suite à type de contenu mal formé PolicyType enforce */*
PolicyTypeURL URL contenant la description de la politique des types de contenu. PolicyTypeURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique des types de contenu ; elle apparaîtra dans les messages d'erreur.

PolicyVary Active la politique de filtrage de l'en-tête Vary. PolicyVary ignore|log|enforce header [ header [ ... ]] ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse dont l'en-tête Vary contient un des en-têtes spécifiés sera rejetée.

Exemple # rejet suite à la présence de l'en-tête "User-Agent" dans l'en-tête # Vary PolicyVary enforce User-Agent
PolicyVaryURL URL contenant la description de la politique de filtrage de l'en-tête Vary. PolicyVaryURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique de filtrage de l'en-tête Vary ; elle apparaîtra dans les messages d'erreur.

PolicyValidation Active le filtrage de la validation du contenu. PolicyValidation ignore|log|enforce ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse qui ne contient ni en-tête ETag valide, ni en-tête Last-Modified, ou dont la syntaxe d'un de ces deux en-têtes est incorrecte sera rejetée.

Exemple # rejet suite à l'absence des en-têtes Etag et/ou Last-Modified PolicyValidation enforce
PolicyValidationURL URL contenant la description de la politique de filtrage de la validation du contenu. PolicyValidationURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique de filtrage de la validation du contenu ; elle apparaîtra dans les messages d'erreur.

PolicyNocache Active le filtrage des réponses qui se définissent elles-mêmes comme impossibles à mettre en cache. PolicyNocache ignore|log|enforce ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse qui se définit elle-même comme impossible à mettre en cache via l'en-tête Cache-Control ou Pragma sera rejetée.

Exemple # une réponse contenant l'en-tête Cache-Control: no-cache sera # rejetée PolicyNocache enforce
PolicyNocacheURL URL contenant la description de la politique de filtrage des réponses qui se définissent elles-mêmes comme impossibles à mettre en cache. PolicyNocacheURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique de filtrage des réponses qui se définissent elles-mêmes comme impossibles à mettre en cache ; elle apparaîtra dans les messages d'erreur.

PolicyMaxage Active le filtrage de la durée de vie des réponses. PolicyMaxage ignore|log|enforce age ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une réponse dont la durée de vie n'est pas explicitement spécifiée via un en-tête max-age, s-maxage ou Expires, ou dont la durée de vie est inférieure à la valeur donnée sera rejetée.

Exemple # rejet des réponses dont la durée de vie est inférieure à une # journée PolicyMaxage enforce 86400
PolicyMaxageURL URL contenant la description de la politique de filtrage des réponses en fonction de leur durée de vie. PolicyMaxageURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique de filtrage des réponses en fonction de leur durée de vie ; elle apparaîtra dans les messages d'erreur.

PolicyVersion Active le filtrage des requêtes en fonction du numéro de version HTTP. PolicyVersion ignore|log|enforce HTTP/0.9|HTTP/1.0|HTTP/1.1 ignore server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Avec l'argument enforce, une requête dont le numéro de version HTTP est inférieur à la valeur spécifiée sera rejetée.

Exemple # rejet des requêtes dont le numéro de version HTTP est inférieur à # HTTP/1.1 PolicyVersion enforce HTTP/1.1
PolicyVersionURL URL contenant la description de la politique de filtrage des requêtes en fonction du numéro de version HTTP. PolicyVersionURL url none server configvirtual host directory Disponible à partir de la version 2.5.0 du serveur HTTP Apache.

Cette directive permet de spécifier l'URL contenant la description de la politique de filtrage des requêtes en fonction du numéro de version HTTP ; elle apparaîtra dans les messages d'erreur.