--- date: 2020-05-06T15:00:23+02:00 description: "Comment gérer les entêtes HTTP avec le couple serveur relay+web, httpd & relayd, serveurs natifs sous OpenBSD" draft: false lastmod: 2020-05-07T18:20:36+02:00 tags: ['relayd','Header','httpd','HTTP','OpenBSD'] title: "Relayd : Gestion des entêtes pour httpd" translationKey: "relayd-headers-http" --- ## Description **OpenBSD** intègre par défaut dans le système de base, depuis 5.7 : * un serveur web, nommé **httpd** - que j'ai présenté plus ou moins succinctement {{< inside "web:httpd:httpd" ici >}} * un serveur relay, nommé **relayd** * Site web : https://bsd.plumbing/ * OpenBSD : **6.6, 6.7** --- Le problème est que le serveur **httpd** n'est pas capable de gérer les entêtes {{< abbr HTTP "HyperText Transfert Protocol" >}} *(en anglais : {{< tag header >}})*, et que [l'auteur ne le veut pas][100]. Nous passons donc le relais au serveur **relayd** qui lui est capable de les gérer - *par contre, il le fait de manière globale, {{< abbr çad "c'est-à-dire" >}} non spécifique à un domaine en particulier* - ## Configuration Étant donné que **relayd** est en frontal d'**httpd**, nous allons modifier la configuration des deux fichiers de configuration relatifs. * **relayd** va recevoir tout le traffic à destination des ports web, 80, voire 443, si {{< abbr TLS "Transport Layer Secure" >}} et le rediriger en local sur les ports correspondant. Bien sûr, il est possible d'agir sur chacune des piles réseaux des protocoles IPv4 et IPv6. * quant à lui, **httpd** ne fera qu'interroger la boucle locale sur les ports redirigés. Ne pas oublier de redémarrer les services correspondants après modifier de la configuration ! ### httpd * Le fichier de configuration est `/etc/httpd.conf`, par défaut. Dans le contexte `server`, il y a deux, trois modifications importantes à faire : * l'option d'écoute `listen on` doit écouter localhost - *cf : [listen on][1]* * l'option de journalisation `log` est à modifier pour que le `style` soit paramétré sur `forwarder` - *cf : [style][2]* {{< note info >}} Sachez que certains écrivent une redirection vers le port 8080, au lieu de 80. Bien-sûr, cela fonctionne ; c'est à votre convenance. {{}} Seule l'entête {{< abbr HSTS "HTTP Strict Transport Security" >}} est géré différement : #### httpd: HSTS L'entête **HSTS** se modifie, non pas en déclarant une entête, comme pour les autres, mais en utilisant tout simplement l'option `hsts` *(cf : [hsts][3])*. Elle se gère bien sûr dans le contexte de protocole {{< abbr HTTPS "HyperText Transport Protocol Secure" >}}, via {{< abbr TLS "Transport Layer Secure" >}}. *Pour l'instant, nous n'aborderons pas ce sujet ; d'autant que je fais les présentations dans mon article de {{< inside2 a="tls" l="web:httpd:httpd" t="présentation d'httpd" >}}.* #### httpd: exemple {{< code "web-httpd-relayd-headers-example-config-httpd" httpd >}} #### httpd: log Voici un exemple de log : `domain.tld 127.0.0.1 - - [06/May/2020:04:08:51 +0200] "GET / HTTP/1.1" 200 0 "" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 66.249.79.202 -`
`domain.tld 127.0.0.1 - - [06/May/2020:09:48:36 +0200] "GET /robots.txt HTTP/1.1" 200 0 "" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" 5.196.87.174 -`
`domain.tld 127.0.0.1 - - [06/May/2020:10:29:29 +0200] "GET / HTTP/1.1" 200 0 "" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" 54.36.148.31 -`
Nous remarquons bien que l'adresse IP du client est précisé en fin de ligne.
C'est ce que permet le paramètre de style de journal `forwarder`. ### relayd * Le fichier de configuration est `/etc/relayd.conf`, par défaut. Dans les faits : * Nous déclarons un protocole **http** en lui donnant un nom - *le nom importe peu, mais est réutilisé plus tard, dans le contexte des déclarations de relais*. * les filtres de correspondance `match` pour créer les réponses d'entêtes `header`. * les deux premières déclarations sont nécessaires pour capturer les valeurs serveurs suivantes afin de les rediriger correctement : * `$SERVER_ADDR:$SERVER_PORT` pour l'option `X-Forwarded-By`, * `$REMOTE_ADDR` pour l'option `X-Forwarded-For`. * puis nous relaierons en paramétrant, dans les déclarations `relay` correspondantes : * l'option d'écoute `listen`, sur l'adresse IP public et le port www et, * nous ciblons le protocole **http** nommé afin que les règles sur les entêtes soient appliquées dans chacun des contextes de relais, et, * redirigerons à l'aide de l'option `forward` vers l'interface de bouclage local, et le port désiré, correspondant à celui sur lequel écoute **httpd**. #### relayd: Httpoxy Certains des plus attentifs remarqueront dans l'exemple ci-dessous la déclaration de l'entête suivante :
`match request header remove "Proxy"` Celle-ci est utile pour lutter contre la faille **[Httpoxy][7]** qui affecte les applications CGI, PHP, dans le contexte d'une connexion {{< abbr HTTP "HyperText Transfert Protocol" >}}. C'est reconnue comme étant la meilleure façon de bloquer cette faille.
L'autre angle de protection efficace est de fournir des connexions {{< abbr HTTPS "HyperText Transfert Protocol Secure" >}}, qui apparemment ne sont pas assujetties à cette faille. #### relayd: exemple {{< code "web-httpd-relayd-headers-example-config-relayd" relayd >}} ## Documentations ### Manpages * {{< man httpd 8 >}}, {{< man "httpd.conf" 5 >}} * {{< man relayd 8 >}}, {{< man "relayd.conf" 5 >}}, {{< man relayctl 8 >}} ### Autres documentations * Pour en savoir plus sur les entêtes : * **Content-Security-Policy** : {{< inside "web:http:csp" >}} * **Cross-origin Resource Sharing** : {{< inside "web:http:cors" >}} * **Frame-Options** : {{< inside "web:http:X-Frame-Options" >}} * **HSTS** : {{< inside "web:ssl:hsts" >}} * **Referrer** : {{< inside "web:http:Referrer" >}} * **X-Content-Type-Options** : {{< inside "web:http:X-Content-Type-Options" >}} * **X-Frame-Options** : {{< inside "web:http:X-Frame-Options" >}} * **X-Xss-Protection** : {{< inside "web:http:X-Xss-Protection" >}} * Pour information, Xavier Cartron @prx propose une autre [méthode][10] - *personnellement testé, non réussie*. * ou la page du wiki de la communauté "OpenBSD Pour Tous" : **"[HTTPd : Comment gérer les entêtes HTTP][11]"** * Voici un [exemple très complet][12], avec gestion TLS - *en anglais* --- [1]: https://man.openbsd.org/httpd.conf#listen [2]: https://man.openbsd.org/httpd.conf#style [3]: https://man.openbsd.org/httpd.conf#hsts [7]: https://httpoxy.org/ [10]: https://ybad.name/ah/doku.php/4-httpd/relayd#configuration-de-relayd [11]: https://wiki.openbsd.fr.eu.org/doku.php/network/service/httpd-headers [12]: https://www.alexander-pluhar.de/openbsd-webserver.html [100]: https://marc.info/?l=openbsd-misc&m=142407262812306&w=2