--- title: "httpd : présentation du serveur HTTP d'OpenBSD" date: 2019-11-17T01:08:30+01:00 description: "Présentation du serveur web httpd natif sous OpenBSD" draft: false include_toc: true lastmod: 2020-05-07T18:25:36+02:00 show_comments: false tags: ["httpd", "OpenBSD"] --- ## Description **OpenBSD** intègre par défaut dans le système de base un serveur web, nommé **httpd**, depuis 5.7.
C'est un serveur qui se veut sécurisé, tant par le fonctionnement chrooté que par la séparation des privilèges, l'usage de chiffrements forts, de courbes elliptiques, et autres paramétres forts pour {{< abbr TLS "Transport Layer Security" >}}, par défaut. **httpd** est un serveur {{< abbr HTTP "HyperText Transfert Protocol" >}} de fichiers statiques, qui supporte les appels directs ou asynchrones FastCGI (soit par socket Unix - *c'est mieux* -, soit par {{< abbr TCP "Transfert Control Protocol" >}}/{{< abbr IP "Internet Protocol" >}}). Il est bien sûr possible de gérer les connexions TLS, via la bibliothèque LibreSSL, et fonctionne sur la double couche de protocole IPv4 et IPv6. Une configuration flexible d'hôtes virtuels est possible, soit par nom d'hôte, soit par adresse IP. Enfin, la journalisation se fait soit via `syslog`, soit par des journaux d'accès et d'erreurs dédiés aux différents hôtes virtuels. Ce que ne gère pas **httpd** : * les entêtes HTTP. * l'URL Rewriting ? * Quoi d'autres ?! * Site web : https://bsd.plumbing/ ## Configuration La configuration du serveur httpd se fait, *à minima*, au-travers d'un seul fichier de configuration, à créer : `/etc/httpd.conf`. Exemple : {{< code "web-httpd-example-httpd.conf" httpd >}} La configuration d'hôte virtuel, étant à envisager, il est préférable de créer un fichier par hôte et de l'inclure dans le fichier de configuration par le biais du mot clé `include`. ### Configuration Globale Voici les paramètres de niveau global : * `chroot` : spécifie le répertoire {{< man chroot 2 >}}. S'il n'est pas spécifié, il a pour valeur `/var/www/` qui est le répertoire home de l'utilisateur web `www`. * `default type` : spécifie les types de média utilisés pour une extension donnée ou un type de fichier. S'il n'est pas spécifié, le type par défaut est `application/octect-stream`. * `logdir` : spécifie le répertoire où les journaux seront écrits. Par défaut, il fait référence au répertoire enfant `logs/` à l'intérieur du chroot. * `prefork` : le nombre de processus du serveur. Par défaut, httpd utilise 3 processus serveur. Augmenter cette valeur améliore la performance et prévient les délais de connexion au serveur. ### Macros Des macros peuvent être définies. Considérez-les comme des variables. On ne peut utiliser des mots clés réservés. Elles commencent forcément par une lettre, un chiffre ou le symbole '`_` ' suivi de tout autre caractère. Exemple : {{< code "web-httpd-example-macro" httpd >}} Dans cet exemple, la macro est la variable `ip_ext` ; sa valeur étant `10.0.0.1`. ### Les Hôtes Virtuels La gestion des hôtes virtuels se fait dans chaque section `server`, en déclarant le nom du serveur entre double-quotes. Pour plus d'informations, lire la section [`SERVERS`][2] du manpage `httpd.conf(5)`. ### Les Types Médias La section `types` configure les types de média supportés. Si rien n'est spécifié, par défaut, httpd gére les types de média pour : * `text/css`, `text/html`, `text/plain` * `image/gif`, `image/jpeg`, `image/png`, `image/svg+xml` * ainsi qu'`application/javascript`. Exemple : `types { include "usr/share/misc/mime.types" }` ou {{< code "web-httpd-example-types" httpd >}} *Avant de chercher à ajouter un nouveau type, assurez-vous qu'il ne soit pas déjà inclus dans le fichier `/usr/share/misc/mimes.types` ; si ce n'est pas le cas, ajoutez-le en suivant.* ## Utilisation * Le service se nomme logiquement : `httpd` * L'option de test de configuration : `-n` Ainsi la commande `httpd -n` permettra de s'assurer de la validité de l'ensemble de la configuration, à tout moment. Par convention/préférence, il est intéressant de créer un répertoire `/etc/httpd.d/` dans lequel sera écrit les configurations serveurs des hôtes virtuels, tel que : `# mkdir -p /etc/httpd.d` Modification du fichier de configuration `/etc/httpd.conf` : `types { include "usr/share/misc/mime.types" }` Puis utilisez le mot clé `include` pour ajouter la configuration d'un hôte virtuel au fur et à mesure des besoins, tel que `include "etc/httpd.d/nom-de-domaine.conf"` ### Gestion des logs La gestion des logs est intéressante. * Vous ne voulez pas de log, indiquez `no log` dans votre section `server`. * Vous pouvez demander à {{< man syslog 3 >}} d'enregistrer la journalisation, en lieu et place des journaux individualisés. Spécifiez tout simplement : `log syslog` * Vous pouvez invoquer individuellement les logs d'accès ou d'erreur, tel que :
`log access "nom-fichier-acces.log"`
`log error "nom-fichier-erreurs.log"`
Néanmoins, sachez qu'il est possible d'intégrer les différentes options entre crochets, tel que :
{{< code "web-httpd-example-logs" httpd >}} Et, pour finir, vous pouvez y intégrer l'option `style` qui va vous permettre de définir le style de journalisation désiré, tel que : * `common` ou `combined` : ces deux styles imitent le format de journalisation des standards des serveurs web Apache ou nginx. `common` est le type par défaut, si aucun n'est spécifié. * `forwarded` étend le style `combined` en ajoutant deux champs d'information contenant la valeur des entêtes `X-Forwarded-For` et `X-Forwarded-Port` *(respectivement, la première doit retourner l'adresse ip du client, la seconde celle du port de connexion sur le serveur)*. Intéressant quand **httpd** est derrière un proxy web, tel nginx ou relayd. * `connection` imite le format de journalisation du serveur {{< man relayd 8 >}}. Chaque entrée du journal est un résumé de chaque connexion qui peut contenir de multiples requêtes. ### Authentification Web **httpd** peut faire de l'authentification web. Dans un premier temps, il faut utiliser l'outil {{< man htpasswd 5 >}}, *(accessible nativement depuis OpenBSD 5.6)*, tel que : {{< code "web-httpd-example-htpasswd" httpd >}} Par mesure de sécurité, ensuite, attribuez-lui des droits en exécution `0400`, accessible rien que par l'utilisateur web `www`. Puis ensuite dans une des directives `location` ou `server`, ajoutez ce qui ressemble à : `authenticate "! Acces sous Restriction !" with "/nom-fichier"` ### PHP-FPM {{< note danger >}} Attention, si vous mettez en place PHP et permettez la connexion en clair, sur le protocole HTTP, il est recommandé fortement de mettre en frontal {{< inside2 a="relayd-httpoxy" l="web:httpd:relayd-headers-httpd" t="relayd afin de lutter contre la faille Httpoxy" >}} ! {{}} Pour autant que vous avez installer PHP sur le serveur, **httpd** peut servir du contenu php, par le biais de la directive `location`, tel que : Exemple : {{< code "web-httpd-example-location-php-fpm" httpd >}} Il est nécessaire que le socket FastCGI corresponde bien à celui de PHP-FPM. ### Slowcgi {{< note danger >}} Attention, si vous mettez en place CGI et permettez la connexion en clair, sur le protocole HTTP, il est recommandé fortement de mettre en frontal {{< inside2 a="relayd-httpoxy" l="web:httpd:relayd-headers-httpd" t="relayd afin de lutter contre la faille Httpoxy" >}} ! {{}} **{{< man slowcgi 8 >}}** est un serveur FastCGI de connexion {{< abbr CGI "Common Gateway Interface" >}}, *lui aussi intégré dans le système de base d'OpenBSD, depuis la version 5.4*. **httpd** peut servir du contenu CGI, disponible depuis le répertoire enfant `cgi-bin/` du chroot web, par le biais de la directive `location`, tel que : Exemple : {{< code "web-httpd-example-location-slowcgi" httpd >}} Là aussi, il est nécessaire que le nom du socket FastCGI corresponde bien. ATTENTION : Il semble important de mettre en place une [authentification web](#authentification-web) pour protéger le contenu délivré par les scripts CGI ! ### TLS **httpd** prend très bien en charge la configuration TLS. Exemple : {{< code "web-httpd-example-server-tls" httpd >}} * La directive `hsts` active la gestion **HTTP Strict Transport Security**. Les options suivantes sont possibles : * `max-age` en nombre de secondes - paramètre le temps maximum durant lequel cet hôte peut être considéré comme hôte HSTS. * `preload` confirme et authentifie que le site est autorisé à être inclu dans la liste de préchargement des navigateurs web. * `subdomains` signale que les sous-domaines doivent être considérés comme hôtes HSTS. {{< color red >}}Il semble important par mesure de sécurité d'utiliser cette option lors de fonctionnement avec des sous-domaines, même si ces derniers ont leurs propres certificats TLS{{< /color >}}. * La directive `tls` permet de spécifier la configuration TLS du serveur. Les différentes options sont comprises dans les crochets. Les options suivantes sont possibles : * `certificate` - nécessaire - pour spécifier le certificat serveur, encodé au format PEM. * `key` - nécessaire - pour spécifier le fichier de clé privée, encodée lui aussi au format PEM. {{< color red >}}ATTENTION : ce fichier doit absolument résider en-dehors du chroot web{{< /color >}}. * Il est possible de paramétrer : * les options de chiffrement `ciphers`, * les clés d'échange `dhe`, * les courbes elliptiques `ecdhe` - *par défaut, sont actives : `X25519`, `P-256` et `P-384`* -, * une réponse `ocsp` - *il faudra générer un fichier OCSP au format DER avec l'outil {{< man oscpcheck 8 >}}* -, * de spécifier les `protocols` TLS - *sachant que seul TLSv1.2 est actif par défaut* - * ainsi que la durée de vie du ticket de session `ticket lifetime` en nombre de secondes - *qui par défaut est de 2 heures*. Il ne sert à rien de spécifier une valeur d'option par défaut, puisque par défaut, sans écriture, c'est la valeur qui lui est appliquée ! ### Auto-indexation **httpd** peut faire de l'auto-indexation de répertoire et ainsi afficher le contenu d'un répertoire en particulier. Ajoutez tout simplement, soit dans une directive `server`, soit `location` : `directory auto index` ## Documentation ### Manpages La documentation se fait au-travers des différents manpages, tels que : * {{< man httpd 8 >}}, {{< man "httpd.conf" 5 >}} ---- [2]: https://man.openbsd.org/httpd.conf.5#SERVERS ----