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 :
-
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 :
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 webwww.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 estapplication/octect-stream.logdir: spécifie le répertoire où les journaux seront écrits. Par défaut, il fait référence au répertoire enfantlogs/à 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 :
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/plainimage/gif,image/jpeg,image/png,image/svg+xml- ainsi qu’
application/javascript.
Exemple :
types { include "usr/share/misc/mime.types" }
ou
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 logdans votre sectionserver. - 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 :
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 :
commonoucombined: ces deux styles imitent le format de journalisation des standards des serveurs web Apache ou nginx.commonest le type par défaut, si aucun n’est spécifié.forwardedétend le stylecombineden ajoutant deux champs d’information contenant la valeur des entêtesX-Forwarded-ForetX-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.connectionimite 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 :
:# 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
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 :
location "*.php" {
fastcgi socket "/run/php-fpm.sock"
}
Il est nécessaire que le socket FastCGI corresponde bien à celui de PHP-FPM.
Slowcgi
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 :
location "/cgi-bin/*.cgi" {
fastcgi socket "/run/slowcgi.sock"
root "/"
}
Là aussi, il est nécessaire que le nom du socket FastCGI corresponde bien.
TLS
httpd prend très bien en charge la configuration TLS.
Exemple :
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
hstsactive la gestion HTTP Strict Transport Security.
Les options suivantes sont possibles :max-ageen nombre de secondes - paramètre le temps maximum durant lequel cet hôte peut être considéré comme hôte HSTS.preloadconfirme et authentifie que le site est autorisé à être inclu dans la liste de préchargement des navigateurs web.subdomainssignale 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
tlspermet 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-256etP-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
protocolsTLS - sachant que seul TLSv1.2 est actif par défaut - - ainsi que la durée de vie du ticket de session
ticket lifetimeen nombre de secondes - qui par défaut est de 2 heures.
- les options de chiffrement
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 :