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 :
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 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 :
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 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 :
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
oucombined
: 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 stylecombined
en ajoutant deux champs d’information contenant la valeur des entêtesX-Forwarded-For
etX-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
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
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
etP-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.
- 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 :