Comment héberger un site Web avec Caddy sur Ubuntu 18.04

De Get Docs
Aller à :navigation, rechercher

L'auteur a sélectionné le Free and Open Source Fund pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

Caddy est un serveur Web conçu autour de la simplicité et de la sécurité, doté d'un certain nombre de fonctionnalités utiles pour l'hébergement de sites Web. Par exemple, il peut obtenir et gérer automatiquement les certificats TLS de Let's Encrypt pour activer HTTPS, et inclut la prise en charge de HTTP/2. HTTPS est un système de sécurisation du trafic entre vos utilisateurs et votre serveur, et devient rapidement une attente de base de tout site Web en cours d'exécution - sans lui, Chrome et Firefox avertiront que votre site Web est "non sécurisé" si les utilisateurs tentent de soumettre une connexion information.

Dans ce didacticiel, vous allez créer Caddy à partir de la source à l'aide de xcaddy, un outil de création de Caddy personnalisé, et l'utiliser pour héberger un site Web sécurisé avec HTTPS. Cela implique de le compiler, de le configurer à l'aide d'un Caddyfile et d'installer le plugin. Au final, votre domaine servira des pages statiques, tout en étant sécurisé avec des certificats TLS gratuits de Let's Encrypt.

Conditions préalables

Étape 1 - Caddie de construction

Dans cette étape, vous construirez Caddy à partir de la source avec la possibilité d'ajouter ultérieurement des plug-ins, le tout sans modifier le code source de Caddy. Vous y parviendrez en utilisant xcaddy, qui téléchargera et construira Caddy et ses plugins pour vous, selon vos besoins.

Rendez-vous sur sa page de versions [1] et copiez le lien de la dernière version de la plate-forme linux_amd64. Avant de le télécharger, accédez à /tmp en exécutant la commande suivante :

cd /tmp

Ensuite, téléchargez la dernière version à l'aide de wget :

wget https://github.com/caddyserver/xcaddy/releases/download/v0.1.8/xcaddy_0.1.8_linux_amd64.tar.gz

Une fois téléchargé, extrayez uniquement le binaire :

tar xvf xcaddy_0.1.8_linux_amd64.tar.gz xcaddy

Enfin, déplacez l'exécutable xcaddy vers /usr/bin, le rendant accessible à l'ensemble du système :

sudo mv xcaddy /usr/bin

Maintenant que xcaddy est installé, vous allez construire Caddy. Pour cela, créez un répertoire séparé pour le stocker :

mkdir ~/caddy

Accédez-y en exécutant la commande suivante :

cd ~/caddy

Pour compiler la dernière version de Caddy, sans plugins tiers, exécutez la commande suivante :

xcaddy build

Cette commande prendra un certain temps pour se terminer et sa sortie ressemblera à ceci :

Output2021/02/23 21:12:07 [INFO] Temporary folder: /tmp/buildenv_2021-02-23-2112.542119152
2021/02/23 21:12:07 [INFO] Writing main module: /tmp/buildenv_2021-02-23-2112.542119152/main.go
2021/02/23 21:12:07 [INFO] Initializing Go module
2021/02/23 21:12:07 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy
go: creating new go.mod: module caddy
go: to add module requirements and sums:
        go mod tidy
2021/02/23 21:12:07 [INFO] Pinning versions
2021/02/23 21:12:07 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
...
2021/02/23 21:12:34 [INFO] Build environment ready
2021/02/23 21:12:34 [INFO] Building Caddy
2021/02/23 21:12:34 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
...
2021/02/23 21:12:51 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
2021/02/23 21:14:26 [INFO] Build complete: ./caddy
2021/02/23 21:14:26 [INFO] Cleaning up temporary folder: /tmp/buildenv_2021-02-23-2112.542119152

Une fois terminé, vous aurez l'exécutable caddy disponible dans le dossier actuel. Déplacez-le vers /usr/bin pour l'installer :

sudo mv caddy /usr/bin

Vous pouvez essayer d'exécuter caddy pour vérifier qu'il est correctement installé :

caddy version

La sortie contiendra la version de Caddy que vous venez de compiler :

Outputv2.3.0 h1:fnrqJLa3G5vfxcxmOH/+kJOcunPLhSBnjgIvjXV/QTA=

Vous avez maintenant construit et exécuté Caddy. Dans l'étape suivante, vous installerez Caddy en tant que service afin qu'il démarre automatiquement au démarrage, puis vous ajusterez ses paramètres de propriété et d'autorisations pour assurer la sécurité du serveur.

Étape 2 - Installation de Caddy

Maintenant que vous avez vérifié que vous êtes capable de construire et d'exécuter Caddy, il est temps de configurer un service systemd afin que Caddy puisse être lancé automatiquement au démarrage du système. Pour en savoir plus sur systemd, consultez notre tutoriel Systemd Essentials.

Caddy nécessite son propre utilisateur et groupe pour fonctionner en tant que service systemd. Commencez par créer le groupe en exécutant la commande suivante :

sudo groupadd --system caddy

Ensuite, créez un nouvel utilisateur appelé caddy qui appartient au groupe caddy :

sudo useradd --system \
    --gid caddy \
    --create-home \
    --home-dir /var/lib/caddy \
    --shell /usr/sbin/nologin \
    --comment "Caddy web server" \
    caddy

Le nouvel utilisateur caddy aura son propre répertoire personnel créé. Il ne sera pas possible de se connecter en tant que caddy, car son shell est défini sur nologin.

Changez la propriété du binaire Caddy pour l'utilisateur root :

sudo chown root:root /usr/bin/caddy

Cela empêchera d'autres comptes de modifier l'exécutable. Cependant, même si l'utilisateur root possède Caddy, il est conseillé de l'exécuter uniquement en utilisant d'autres comptes non root présents sur le système - comme ce sera le cas avec le service systemd. Cela garantit qu'en cas de compromission de Caddy (ou d'un autre programme), l'attaquant ne pourra pas modifier le binaire ou exécuter des commandes en tant que root.

Ensuite, définissez les autorisations du fichier binaire sur 755 — cela donne à root des autorisations complètes de lecture/écriture/exécution pour le fichier, tandis que les autres utilisateurs ne pourront que le lire et l'exécuter :

sudo chmod 755 /usr/bin/caddy

Vous avez maintenant terminé la configuration du binaire Caddy et êtes prêt à commencer à écrire la configuration de Caddy.

Créez un répertoire dans lequel vous stockerez les fichiers de configuration de Caddy en exécutant la commande suivante :

sudo mkdir /etc/caddy

Ensuite, définissez les autorisations d'utilisateur et de groupe appropriées :

sudo chown -R root:caddy /etc/caddy

Définir l'utilisateur comme root et le groupe comme caddy garantit que Caddy aura un accès en lecture et en écriture au dossier (via le groupe caddy) et que seul le compte superutilisateur aura les mêmes droits de lecture et de modification.

Dans une étape ultérieure, vous activerez le provisionnement automatique des certificats TLS à partir de Let's Encrypt. En prévision de cela, créez un répertoire pour stocker tous les certificats TLS que Caddy obtiendra et donnez-lui les mêmes règles de propriété que le répertoire /etc/caddy :

sudo mkdir /etc/ssl/caddy
sudo chown -R root:caddy /etc/ssl/caddy

Caddy doit être capable d'écrire des certificats dans ce répertoire et de le lire afin de chiffrer les requêtes. Pour cette raison, modifiez les autorisations pour le répertoire /etc/ssl/caddy afin qu'il ne soit accessible que par root et caddy :

sudo chmod 0770 /etc/ssl/caddy

Ensuite, créez un répertoire pour stocker les fichiers que Caddy hébergera :

sudo mkdir /var/www

Ensuite, définissez le propriétaire et le groupe du répertoire sur caddy :

sudo chown caddy:caddy /var/www

Caddy lit sa configuration à partir d'un fichier appelé Caddyfile, stocké sous /etc/caddy. Créez le fichier sur le disque en exécutant :

sudo touch /etc/caddy/Caddyfile

Pour installer le service Caddy, téléchargez le fichier d'unité systemd depuis le référentiel Caddy GitHub vers /etc/systemd/system en exécutant :

sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'

Modifiez les autorisations du fichier de service afin qu'il ne puisse être modifié que par son propriétaire, root :

sudo chmod 644 /etc/systemd/system/caddy.service

Ensuite, rechargez systemd pour détecter le service Caddy :

sudo systemctl daemon-reload

Vérifiez si systemd a détecté le service Caddy en exécutant systemctl status :

sudo systemctl status caddy

Vous verrez une sortie similaire à :

Output● caddy.service - Caddy
     Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: https://caddyserver.com/docs/

Si vous voyez cette même sortie, le nouveau service a été correctement détecté par systemd.

Dans le cadre de la configuration initiale du serveur, vous avez activé ufw, le pare-feu simple, et autorisé les connexions SSH. Pour que Caddy puisse servir le trafic HTTP et HTTPS depuis votre serveur, vous devrez les autoriser dans ufw en exécutant la commande suivante :

sudo ufw allow proto tcp from any to any port 80,443

La sortie sera :

OutputRule added
Rule added (v6)

Utilisez ufw status pour vérifier si vos modifications ont fonctionné :

sudo ufw status

Vous verrez le résultat suivant :

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80,443/tcp                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80,443/tcp (v6)            ALLOW       Anywhere (v6)

Votre installation de Caddy est maintenant terminée, mais il n'est pas configuré pour servir quoi que ce soit. À l'étape suivante, vous configurerez Caddy pour qu'il serve les fichiers du répertoire /var/www.

Étape 3 - Configuration de Caddie

Dans cette section, vous allez écrire la configuration de base de Caddy pour servir des fichiers statiques à partir de votre serveur.

Commencez par créer un fichier HTML de base dans /var/www, appelé index.html :

sudo nano /var/www/index.html

Ajoutez les lignes suivantes :

/var/www/index.html

<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>

Lorsqu'il est affiché dans un navigateur Web, ce fichier affiche un titre avec le texte Cette page est servie via Caddy. Enregistrez et fermez le fichier.

Ouvrez le fichier de configuration Caddyfile que vous avez créé précédemment pour le modifier :

sudo nano /etc/caddy/Caddyfile

Ajoutez les lignes suivantes :

/etc/caddy/Caddyfile

http:// {
    root * /var/www
    encode gzip
    file_server
}

Ceci est une configuration de base de Caddy et déclare que tout le trafic HTTP vers votre serveur doit être servi avec des fichiers (file_server) de /var/www (qui est marqué comme root) et compressé en utilisant gzip pour réduire les temps de chargement des pages côté client.

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Caddy a un grand nombre de directives différentes pour de nombreux cas d'utilisation. Par exemple, la directive php_fastcgi pourrait être utile pour activer PHP.

Pour tester que tout fonctionne correctement, démarrez le service Caddie :

sudo systemctl start caddy

Ensuite, exécutez systemctl status pour trouver des informations sur l'état du service Caddy :

sudo systemctl status caddy

Vous verrez ce qui suit :

Output● caddy.service - Caddy
     Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-12-08 11:19:47 UTC; 34s ago
       Docs: https://caddyserver.com/docs/
   Main PID: 4631 (caddy)
      Tasks: 6 (limit: 1137)
     Memory: 10.4M
     CGroup: /system.slice/caddy.service
             └─4631 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: USER=caddy
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: INVOCATION_ID=45713fb36abe48ecaf4aa72a12542658
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: JOURNAL_STREAM=9:33053
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.425965,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4281814,"logger":"admin","msg":"admin endpoint started","address":"tcp/localhost:2019","enforce_origin":false,"origins":["127.0.0.1:2019","localhost:2019","[::1]:2019"]}
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4285417,"logger":"http","msg":"server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server","server_name":"srv0","http_port":80}
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.430661,"msg":"autosaved config","file":"/var/lib/caddy/.config/caddy/autosave.json"}
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.430849,"msg":"serving initial configuration"}
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4311824,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc00021f0a0"}
Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4313655,"logger":"tls","msg":"cleaned up storage units"}

Vous pouvez maintenant accéder à l'adresse IP de votre serveur dans un navigateur Web. Votre exemple de page Web affichera :

Vous avez maintenant configuré Caddy pour servir des fichiers statiques à partir de votre serveur. Dans l'étape suivante, vous allez étendre les fonctionnalités de Caddy grâce à l'utilisation de plugins.

Étape 4 - Activer le TLS automatique avec Let's Encrypt

Les plugins offrent un moyen de modifier et d'étendre le comportement de Caddy. Généralement, ils offrent plus de directives de configuration à utiliser, selon votre cas d'utilisation. Dans cette section, vous allez activer le provisionnement et le renouvellement automatiques des certificats Let's Encrypt, en utilisant les enregistrements DNS TXT pour la vérification. Pour vérifier l'utilisation des enregistrements DNS TXT, vous allez installer le plugin officiel pour l'interface avec l'API DNS DigitalOcean.

Remarque : Vous remarquerez peut-être que le plug-in officiel que nous utilisons à cette étape est marqué comme obsolète. C'est parce qu'il est en train d'être remplacé par un ensemble de bibliothèques modulaires plus récentes basées sur libdns.

Cependant, la bibliothèque digitalocean est actuellement en cours de développement avec quelques problèmes ouverts. Jusqu'à ce que les problèmes soient résolus, nous utiliserons le plugin précédent, qui fonctionne correctement malgré le fait qu'il soit étiqueté obsolète.


Pour ajouter un plugin, vous devrez recompiler Caddy en utilisant xcaddy, mais en spécifiant les dépôts de plugins qui devraient être disponibles. Exécutez la commande suivante pour compiler Caddy avec la prise en charge de DigitalOcean DNS :

xcaddy build --with github.com/caddy-dns/lego-deprecated

La sortie sera similaire à ceci :

Output2021/02/23 21:18:46 [INFO] Temporary folder: /tmp/buildenv_2021-02-23-2118.769615504
2021/02/23 21:18:46 [INFO] Writing main module: /tmp/buildenv_2021-02-23-2118.769615504/main.go
2021/02/23 21:18:46 [INFO] Initializing Go module
2021/02/23 21:18:46 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy
go: creating new go.mod: module caddy
go: to add module requirements and sums:
        go mod tidy
2021/02/23 21:18:46 [INFO] Pinning versions
2021/02/23 21:18:46 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
go get: added github.com/caddyserver/caddy/v2 v2.3.0
2021/02/23 21:18:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/lego-deprecated
...
2021/02/23 21:19:17 [INFO] Build environment ready
2021/02/23 21:19:17 [INFO] Building Caddy
2021/02/23 21:19:17 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
...
2021/02/23 21:19:20 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
2021/02/23 21:20:09 [INFO] Build complete: ./caddy
2021/02/23 21:20:09 [INFO] Cleaning up temporary folder: /tmp/buildenv_2021-02-23-2118.769615504

Une fois la compilation terminée, déplacez le binaire résultant vers /usr/bin en exécutant :

sudo mv caddy /usr/bin

Définissez ensuite les autorisations appropriées :

sudo chown root:root /usr/bin/caddy
sudo chmod 755 /usr/bin/caddy

Ensuite, vous configurerez Caddy pour qu'il fonctionne avec l'API de DigitalOcean afin de définir des enregistrements DNS. Caddy doit lire votre jeton API en tant que variable d'environnement pour configurer le DNS de DigitalOcean, vous allez donc modifier son fichier d'unité systemd :

sudo nano /etc/systemd/system/caddy.service

Ajoutez la ligne en surbrillance dans la section [Service], en remplaçant your_token_here par votre jeton API :

/etc/systemd/system/caddy.service

...
[Service]
User=caddy
Group=caddy
Environment=DO_AUTH_TOKEN=your_token_here
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
...

Enregistrez et fermez ce fichier, puis rechargez le démon systemd comme vous l'avez fait précédemment pour vous assurer que la configuration est mise à jour :

sudo systemctl daemon-reload

Exécutez systemctl restart pour vérifier que vos modifications de configuration étaient correctes :

sudo systemctl restart caddy

Ensuite, exécutez systemctl status pour voir s'il s'exécute correctement :

sudo systemctl status caddy

La sortie ressemblera à :

Output● caddy.service - Caddy
     Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-12-08 13:39:17 UTC; 1s ago
       Docs: https://caddyserver.com/docs/
   Main PID: 5440 (caddy)
      Tasks: 5 (limit: 1137)
     Memory: 9.8M
     CGroup: /system.slice/caddy.service
             └─5440 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
...

Vous devrez apporter quelques légères modifications à votre Caddyfile, alors ouvrez-le pour le modifier :

sudo nano /etc/caddy/Caddyfile

Ajoutez les lignes en surbrillance au Caddyfile, en veillant à remplacer your_domain par votre domaine (au lieu de simplement http://) et en ajoutant le bloc tls, en spécifiant que Le DNS DigitalOcean doit être utilisé :

/etc/caddy/Caddyfile

your_domain {
    root * /var/www
    encode gzip
    file_server
    
    tls {
        dns lego_deprecated digitalocean
    }
}

L'utilisation d'un domaine plutôt que d'un simple spécificateur de protocole pour le nom d'hôte obligera Caddy à traiter les requêtes via HTTPS. La directive tls configure le comportement de Caddy lors de l'utilisation de TLS, et la sous-directive dns spécifie que Caddy doit utiliser le système DNS DigitalOcean, au lieu de HTTP.

Avec cela, votre site Web est prêt à être déployé. Redémarrez Caddy avec systemctl puis enable pour qu'il s'exécute au démarrage :

sudo systemctl restart caddy
sudo systemctl enable caddy

Si vous accédez à votre domaine, vous serez automatiquement redirigé vers HTTPS, avec le même message affiché.

Votre installation de Caddy est maintenant terminée et sécurisée, et vous pouvez encore la personnaliser en fonction de votre cas d'utilisation.

Conclusion

Caddy est maintenant installé et configuré sur votre serveur, servant des pages statiques sur le domaine de votre choix, sécurisé avec des certificats Let's Encrypt TLS gratuits.

Une bonne prochaine étape serait de trouver un moyen d'être averti lorsque de nouvelles versions de Caddy sont publiées. Par exemple, vous pouvez utiliser le flux Atom pour les versions de Caddy, ou un service dédié tel que dependencies.io.

Vous pouvez explorer la documentation de Caddy pour plus d'informations sur la configuration de Caddy.