Caddy est un serveur Web open source écrit en langage Go. Il fournit une prise en charge HTTP/3, TLS v1.3, une configuration SSL automatique avec Let's Encrypt, un proxy inverse et prend en charge plusieurs plugins pour étendre ses fonctionnalités. Il a l'avantage que toute sa configuration est servie à partir d'un seul fichier, quel que soit le nombre de sites que vous devez héberger.
Ce tutoriel couvrira l'installation et la configuration de Caddy et PHP sur les serveurs basés sur Fedora 34 et CentOS 8. Nous expliquerons comment héberger des sites uniques et multiples et comment utiliser un proxy inverse avec quelques autres fonctionnalités de sécurité.
Prérequis
-
Serveur basé sur Fedora 34 ou CentOS 8
-
Un utilisateur non root avec des privilèges sudo
-
Un nom de domaine pointant vers l'adresse IP du serveur
-
SELinux est désactivé.
$ sudo setenforce 0
-
Assurez-vous que tout est mis à jour.
$ sudo dnf update
Étape 1 - Configuration du pare-feu
La première étape consiste à configurer le pare-feu pour ouvrir les ports HTTP et HTTPS. Fedora et CentOS sont livrés avec le pare-feu Firewalld préinstallé.
Vérifiez si le pare-feu est en cours d'exécution.
$ sudo firewall-cmd --state
Vous devriez obtenir le résultat suivant.
running
Vérifiez les services/ports actuellement autorisés.
$ sudo firewall-cmd --permanent --list-services
Il devrait afficher la sortie suivante.
dhcpv6-client mdns ssh
Autoriser les ports HTTP et HTTPS.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Revérifiez l'état du pare-feu.
$ sudo firewall-cmd --permanent --list-services
Vous devriez voir une sortie similaire.
dhcpv6-client http https mdns ssh
Rechargez le pare-feu.
$ sudo systemctl reload firewalld
Étape 2 - Installer le chariot
La première étape consiste à installer le serveur. Les étapes d'installation restent les mêmes pour Fedora 34 et CentOS 8.
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
Vous pouvez vérifier l'installation par la commande suivante.
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Étape 3 - Principes de base de la configuration du chariot
Caddy utilise JSON comme format principal pour stocker ou écrire la configuration. C'est la manière la plus flexible d'écrire la configuration et prend en charge toutes les fonctionnalités de Caddy. Mais si vous ne savez pas comment écrire des fichiers JSON, Caddy propose un moyen plus simple sous la forme de Caddyfile.
Le paquet Fedora / CentOS inclut un Caddyfile à /etc/caddy/Caddyfile
. Cela devrait ressembler à ceci (en ignorant les commentaires)
:80 {
root * /usr/share/caddy
file_server
}
Activez et démarrez le démon caddy.
$ sudo systemctl enable --now caddy
Vous pouvez ouvrir l'URL http://youripaddress
vérifier. Vous devriez voir la page d'accueil suivante.
Caddy offre de nombreuses fonctionnalités et configurations, nous n'utiliserons donc que les plus importantes pour servir notre site Web. La configuration par défaut sert sur HTTP, qui est spécifié comme :80
. La root
indique à Caddy de rechercher les fichiers à servir dans /usr/share/caddy
répertoire.
Le file_server
indique à Caddy d'agir en tant que serveur de fichiers, ce qui signifie qu'il ne servira que des fichiers statiques sur l'adresse par défaut.
Configuration de Caddy pour un site Web HTML de base
Créons un fichier de configuration de base du caddy pour servir un site Web statique.
Créez un répertoire pour héberger votre site Web et stocker vos fichiers journaux.
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
Définissez la propriété du répertoire sur Caddy.
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
Créez un fichier HTML à tester et ouvrez-le pour le modifier.
$ sudo nano /var/www/example.com/html/index.html
Ajoutez le code suivant.
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>
Appuyez sur Ctrl + X pour fermer l'éditeur et appuyez sur Y lorsque vous êtes invité à enregistrer le fichier.
Ouvrez le Caddyfile pour le modifier.
$ sudo nano /etc/caddy/Caddyfile
Remplacez le code existant par ce qui suit.
example.com {
root * /var/www/example.com/html
file_server
encode gzip
log {
output file /var/log/caddy/example.access.log
}
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
}
header @static Cache-Control max-age=5184000
tls [email protected]
}
Appuyez sur Ctrl + X pour fermer l'éditeur et appuyez sur Y lorsque vous êtes invité à enregistrer le fichier.
Passons en revue toutes les directives du dossier. Le encode gzip
indique à Caddy de compresser les fichiers à l'aide de la compression Gzip.
Le log
La directive affiche le journal d'accès du site dans /var/log/caddy/example.access.log
dossier. Par défaut, Caddy fait pivoter les fichiers journaux lorsqu'ils atteignent 100 Mo. Les fichiers pivotés sont supprimés après 90 jours ou lorsqu'il y a plus de 10 journaux pivotés. Vous pouvez modifier les paramètres par défaut de la manière suivante.
log {
output file /var/log/caddy/example.access.log {
roll_size 10MB
roll_keep 5
roll_keep_for 240h
}
}
Dans le code ci-dessus, les fichiers journaux en rotation sont limités à 10 Mo et supprimés après 10 jours (240 heures) ou lorsqu'il y a plus de 5 journaux en rotation.
Caddy générera et installera le certificat SSL automatiquement sans aucune intervention. Le tls
nous permet de fournir des options supplémentaires pour configurer HTTPS comme l'adresse e-mail utilisée pour obtenir les rapports Let's Encrypt.
L'header
La directive active le contrôle du cache sur tous les fichiers statiques (fichiers images/javascript/CSS). Vous pouvez ajouter plus d'extensions de fichiers ou copier le code pour définir une durée différente pour différents formats de fichiers. Vous devrez changer la valeur static
à quelque chose de différent car il s'agit d'une référence nommée.
Une fois terminé, vous pouvez valider votre configuration à l'aide de la commande suivante.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Nous devons utiliser le --adapter caddyfile
car, par défaut, la commande ne valide que les configurations JSON.
Si vous recevez l'avertissement suivant, vous pouvez le corriger facilement avec une seule commande.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Exécutez la commande suivante pour corriger l'erreur.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
La commande ci-dessus formate et écrase le Caddyfile.
Redémarrez Caddy pour activer la configuration. Vous devrez redémarrer le serveur chaque fois que vous modifiez la configuration.
$ sudo systemctl restart caddy
Ouvrez dans votre navigateur et vous devriez voir la page suivante, ce qui signifie que la configuration fonctionne.
Configuration de plusieurs sites dans Caddy
Vous pouvez configurer plusieurs sites dans un seul fichier caddie. Pour ce faire, créez des blocs séparés pour chaque site de la manière suivante.
example1.com {
root * /var/www/example1.com/html
...
}
example2.com {
root * /var/www/example2.com/html
...
}
Cette méthode convient à quelques sites, mais un seul peut devenir assez volumineux et difficile à gérer si vous hébergez plusieurs sites.
Créez le répertoire `/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Vous pouvez maintenant importer les fichiers de configuration depuis le répertoire dans votre /etc/caddty/caddyfile
en haut du fichier.
import caddyconf/*.conf
La dernière étape consiste à créer des fichiers de configuration individuels pour chaque site.
Configuration des sites PHP
Jusqu'à présent, nous n'avons parlé que de servir des sites statiques à l'aide de Caddy. Vous pouvez utiliser Caddy tout aussi facilement pour servir des sites PHP dynamiques. Pour activer le support PHP, ajoutez le code suivant dans votre bloc de site.
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
Vous devrez également installer PHP.
$ sudo dnf install php-fpm php-cli php-gd
Vous pouvez installer n'importe quel module PHP supplémentaire dont vous avez besoin. Vous devrez également configurer le fichier /etc/php-fpm.d/www.conf
. Ouvrez le fichier pour le modifier.
$ sudo nano /etc/php-fpm.d/www.conf
Nous devons définir l'utilisateur/groupe Unix de processus PHP sur caddie . Trouvez le user=apache
et group=apache
lignes dans le fichier et changez-les en nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...
Trouvez la ligne listen.acl_users = apache,nginx
et changez sa valeur comme suit.
...
listen.acl_users = apache,nginx,caddy
...
Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
Démarrez le processus PHP-fpm.
$ sudo systemctl start php-fpm
Pour tester votre configuration PHP, créez un fichier test.php
dans le html
dossier.
$ sudo nano /var/www/example.com/html/test.php
Ajoutez-y le contenu suivant et enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.
<?php phpinfo();
Lancez http://example.com/test.php
dans votre navigateur Web, et vous devriez voir ce qui suit.
Configuration du proxy inverse
Caddy peut également être utilisé comme serveur proxy inverse. Pour le configurer, utilisez le code suivant.
example1.com {
...
reverse_proxy localhost:8000 {
header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
}
}
Étape 4 - Options globales du chariot
Le Caddyfile vous permet de définir certaines options qui seront applicables globalement, c'est-à-dire qu'elles s'appliqueront à l'ensemble de vos sites. Il est avantageux de définir des options globales afin de ne pas avoir à les redéclarer dans chaque bloc de serveur.
Vous devez inclure les options globales tout en haut de votre Caddyfile. Il existe de nombreuses options que vous pouvez définir globalement. Nous n'aborderons que quelques points importants. Pour le reste, vous devez vous référer à la documentation de Caddy.
Voici quelques options par défaut que vous pouvez utiliser dans votre Caddyfile.
{
#TLS Options
email [email protected]
servers :443 {
protocol {
experimental_http3
}
max_header_size 5mb
}
servers :80 {
protocol {
allow_h2c
}
max_header_size 5mb
}
}
Dans le code ci-dessus email
spécifie l'identifiant de messagerie utilisé pour enregistrer le certificat SSL auprès de l'autorité Let's Encrypt. L'agrafage OCSP améliore les performances des sites HTTPS en fournissant automatiquement des informations de révocation de certificat aux navigateurs. Le max_header_size
L'option spécifie la taille des en-têtes de requête HTTP du client à analyser.
Nous avons également activé le protocole HTTP/3 pour les sites HTTPS et la prise en charge HTTP/2 pour les sites HTTP. Il s'agit de fonctionnalités expérimentales qui seront probablement supprimées à terme, alors faites attention avant de les activer.
Étape 5 - Amélioration de la sécurité
Activer l'authentification HTTP
Vous pouvez activer l'authentification HTTP simple pour certains répertoires. Tout d'abord, vous devez créer des identifiants d'authentification pour celui-ci.
Caddy n'accepte que les mots de passe hachés dans la configuration. Donc, vous devez d'abord créer un mot de passe haché. Exécutez la commande suivante pour ce faire.
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Une fois que vous avez le mot de passe prêt, entrez le code suivant dans votre Caddyfile.
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
La commande ci-dessus protégera le /secret
répertoire avec les identifiants que vous venez de créer.
Renforcement de la sécurité du site et activation du HSTS
Il existe d'autres configurations de sécurité que vous pouvez ajouter pour protéger vos sites. Pour cela, nous allons créer un autre fichier /etc/caddy/caddy_security.conf
.
$ sudo nano /etc/caddy/caddy_security.conf
Ajoutez-y le code suivant.
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Xss-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Permissions-Policy "interest-cohort=()"
Content-Security-Policy "upgrade-insecure-requests"
Referrer-Policy "strict-origin-when-cross-origin"
Cache-Control "public, max-age=15, must-revalidate"
Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
}
Le code ci-dessus active/implémente ce qui suit.
- Active la prise en charge HSTS pour le site et tous ses sous-domaines.
- Active le filtrage XSS.
- Empêche le reniflage de contenu/MIME.
- Cela empêche le chargement de votre site dans un IFRAME.
- Cela empêche votre site d'être inclus dans les essais de suivi FLOC.
- Ajoute une politique de sécurité du contenu sur la façon dont les agents utilisateurs traitent les URL non sécurisées.
- Mette en œuvre une politique de référence afin que seul le référent soit envoyé pour les requêtes d'origine croisée si le protocole dit la même chose.
- La politique relative aux fonctionnalités fournit un mécanisme permettant d'activer et de désactiver certaines fonctionnalités du navigateur.
Ensuite, importez le fichier dans l'un des blocs de site de votre choix.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Redémarrez le serveur pour appliquer la modification.
Conclusion
Ceci conclut le didacticiel sur l'installation et la configuration du serveur Web Caddy sur les serveurs basés sur Fedora 34 / CentOS 8. Si vous avez des questions, postez-les dans les commentaires ci-dessous.