---
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