%

httpd : présentation du serveur HTTP d'OpenBSD

Article publié, le et modifié le
7 minutes de lecture

Cet article contient 1486 mots.
Source brute de l'article :
Commit version : 097fe9d

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 TLS , par défaut.

httpd est un serveur HTTP de fichiers statiques, qui supporte les appels directs ou asynchrones FastCGI (soit par socket Unix - c’est mieux -, soit par TCP /IP ). 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 :

Configuration

La configuration du serveur httpd se fait, à minima, au-travers d’un seul fichier de configuration, à créer : /etc/httpd.conf.

Exemple :

Code : httpd

prefork 3

types { include "/usr/share/misc/mime.types" }

server "adr_ip" {
    ...
}

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

ip_ext="10.0.0.1"

server "default" {
    listen on $ip_ext port 80
    ...
}

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

types {
    text/css        css
    text/html       html htm
    text/plain      txt
    image/gif       gif
    image/jpeg      jpeg jpg
    image/png       png
    application/javascript  js
    application/xml     xml
}

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 à 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 : httpd

    log {
        access "nom-fichier-acces.log"
        error  "nom-fichier-erreurs.log
    }

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 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 htpasswd(5) , (accessible nativement depuis OpenBSD 5.6), tel que :

Code : httpd

# cd /var/www/
# htpasswd nom-fichier identifiant
Password:
Retype Password:

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

Danger

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

    location "*.php" {
        fastcgi socket "/run/php-fpm.sock"
    }

Il est nécessaire que le socket FastCGI corresponde bien à celui de PHP-FPM.

Slowcgi

Danger

slowcgi(8) est un serveur FastCGI de connexion CGI , 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 : httpd

    location "/cgi-bin/*.cgi" {
        fastcgi socket "/run/slowcgi.sock"
        root "/"
    }

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 pour protéger le contenu délivré par les scripts CGI !

TLS

httpd prend très bien en charge la configuration TLS.

Exemple :

Code : httpd

listen on adresse_ip tls port 443
hsts preload
tls {
    certificate "/etc/ssl/chezmoi.tld-fullchain.pem"
    key "/etc/ssl/private/chezmoi.tld.key"
    ticket lifetime 3600
}
  • 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. 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 .
  • 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. ATTENTION : ce fichier doit absolument résider en-dehors du chroot web .
    • 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 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 :