Serveur Web

Apache2

Apache2

Installer un Reverse Proxy Apache2 sur Debian 11

Dans cette procédure je vais vous expliquer comment installer un serveur reverse proxy sur Debian 11 avec Apache2. Un serveur Reverse Proxy est un serveur qui se situe entre un accès internet et les serveurs internes afin de gérer une mémoire cache des applications.


logo-apache2-300x235.jpg

Prérequis pour installer un Reverse Proxy Apache2 :

Installer un Reverse Proxy Apache2 sur Debian 11 :

Depuis une machine Debian 11 qui ne va servir qu’a ça (recommandation mais pas obligé), nous allons saisir les instructions suivantes :

Mise à jour du système :

apt update && apt full-upgrade -y

Installation des Apache2 :

apt-get install apache2

Afin de bénéficier du mode reverse sur Apache2, il faut activer les module : proxy et proxy_http.
Pour activer ces 2 modules saisissez la commande :

a2enmod proxy proxy_http

Pour que l’activation de ces modules soient pris en compte redémarrer le service d’apache2 :

systemctl restart apache2

Créer un fichier de configuration Apache :

vim /etc/apache2/conf-available/votre-conf.conf

# ou 
nano /etc/apache2/conf-available/votre-conf.conf

Voici un fichier de configuration d’exemple :

<VirtualHost *:80>
    ServerName votre-domaine.fr
    ServerAdmin postmaster@domaine.fr
 
    ProxyPass / http://127.0.0.1/
    ProxyPassReverse / http://127.0.0.1/
    ProxyRequests Off
</VirtualHost>

Activer la configuration :

a2ensite votre-conf.conf

Puis redémarrer apache2 :

systemctl restart apache2

Source :

https://httpd.apache.org/docs/2.4/fr/

Recommandations :

Je vous recommande de sécuriser ce serveur à l’aide d’un firewall sur vos deux machines, comme UFW qui est facile à prendre en mains ou Iptables. Sur votre machine qui sert de serveur Web, vous pouvez autoriser uniquement le serveur reverse proxy à se connecter à l’aide du port 80 ou 443 (ports part défaut) et n’oubliez pas de garder le port SSH (port 22 par défaut) ouvert si vous l’utilisez. Vous pouvez également utiliser l’outil CrowdSec afin de limiter les tentatives de cyberattaques si votre site web est exposé sur internet.

Je vous recommande aussi d’utiliser faill2ban pour limiter les attaques de force brute sur vos serveurs web Apache2.

Apache2

Sécuriser Apache2 sur un serveur

Dans cette procédure, je vais vous montrer quelques bases pour sécuriser vos serveurs Apache2. Je vous recommande de faire une sauvegarde de votre serveur avant toutes modifications, quelques opérations peuvent être sensibles pour serveur Apache2.


logo-apache2-300x235.jpg

Prérequis pour sécuriser Apache2 sur un serveur :

Modifications sur la configuration Apache2 :

Pour sécuriser un serveur Apache2, la première étape à faire sur un serveur Apache2. C’est de cacher la version du service.

apache2_server_signature_on.png

apache2_server_signature_off-1.png

Le but va être de passer de la première image à la deuxième. Pour cela il faut modifier la configuration de Apache2 :

vim /etc/apache2/conf-enabled/security.conf

Remplacer : ServerSignature On
Par : ServerSignature Off

Il est également possible de faire cette étape avec la commande suivante :

sed -i 's/ServerSignature On/ServerSignature Off/g' /etc/apache2/conf-enabled/security.conf

La seconde étape de sécurisation du serveur Apache2 sera de désactiver la lisibilité des fichiers présents dans les dossiers :

vim /etc/apache2/conf-enabled/security.conf

Ajouter ceci à la fin du fichier :

<Directory /var/www>
		Options -Indexes
</Directory>
 

apache2-options-index-not-set.png

apache2-options-index-set.png

Maintenant, il faut redémarrer le service Apache2 pour que la configuration soit prise en compte :

sudo systemctl restart apache2

Ensuite avoir un système à jour permet de limiter les possibles intrusions.

sudo apt update && sudo apt full-upgrade -y 

Il est aussi recommandé d’installer un certificat et de forcer la communication avec le protocole HTTPS afin de chiffrer chaque communication.

Je recommande l’utilisation de firewall comme Iptables ou UFW. Attention à ne pas bloquer les ports que vous utilisez. Comme le 80/443 pour l’utilisation web et le 22 pour l’utilisation du protocole SSH. Si vous n’avez pas changé les ports par défaut.

Je conseille aussi d’utiliser une machine en tant que reverse proxy dans le but de limiter les possibles accès à vos données qui sont accessibles depuis les serveurs web que vous possédez. De plus, en cas de Cyber attaque il s’agira du serveur qui contiendra ce reverse proxy qui sera le premier à subir l’attaque. Il vous offrira aussi un cache permettant d’obtenir de meilleur temps de réponses lors des chargements des pages de votre site Web. Attention, il ne faut pas abuser de ce cache et le nettoyer régulièrement sinon il pourrait être source d’intrusion.

Il est également recommandé d’utiliser un parseur de logs (comme CrowdSec) afin de détécter les comportements annormaux : Installer CrowdSec pour Apache sur Debian 11

Apache2

Debian 11 utiliser Certbot avec Apache2

Dans cet article, je vais vous montrer comment utiliser Certbot avec Debian 11 pour mettre en place un certificat SSL (Let’s encrypt) pour votre site web. Dans cette procédure, je vais utiliser Apache2 comme serveur web, si vous souhaitez utiliser un autre type de serveur il faudra adapter les commandes. Avoir un certificat SSL sur votre site web vous permet de chiffrer la communication en votre serveur Web et le client, en revanche le certificat SSL sur un site garantie pas que le site est sécurisé.

logo-certbot.png

Prérequis :

Utiliser Certbot sur Debian 11 pour mettre en place un certificat SSL:

Pour utiliser Cerbot sur une machine Debian 11 (avec Apache2), il faut d’abord l’installer :

On va d’abord mettre à jour la liste des paquets :

apt update

Puis nous allons télécharger Certbot :

apt install certbot python3-certbot-apache -y

Ensuite vous allez avoir accès à la commande Certbot pour générer les certificats et Certbot s’occupe de mettre en place les certificats :

certbot --apache

Puis répondez aux questions demandées par Certbot, ensuite redémarrer Apache si vous utilisez Apache ou sinon le service web que vous utilisez :

systemctl restart apache2

Une fois le service redémarré, le certificat SSL sera installé pour votre site (le virtualhost sera configuré par Certbot).

Si vous souhaitez utiliser Certbot pour un sous-domaine vous pouvez utiliser la commande suivante :

certbot --apache --expand -d domaine.com  -d sous.domaine.com

Sources :

https://certbot.eff.org/
Apache2

Certificat SSL Apache2 Debian 11

Le certificat SSL est important pour un serveur Web car il va crypté chaque communication avec le serveur Web et le Client. Pour avoir le HTTPS sur son serveur Web Apache2 qui se trouve sur la distribution Debian 11, il faut installer un certificat SSL. Dans cette procédure, je vais le réaliser à l’aide d’un VPS, un DNS et un certficat SSL de l’hébergeur 1&1 Ionos.


logo-apache2-300x235.jpg

Prérequis pour un certificat SSL dans Apache2:

Installer un certificat SSL dans Apache2 :

Pour installer le certificat, utiliser un protocole de transfert de fichiers pour envoyer sur votre serveur les fichiers.

Nous allons créer plusieurs répertoire, chacun devra contenir un fichier.

mkdir -p /etc/ssl/cles
mkdir -p /etc/ssl/certificats

Dans le dossier « cles » on va y mettre le fichier de clé privées (.key)

Dans le dossier « certificats », il faut mettre les fichiers certificats (.cert), le certificat et le certificat intermédiaire.

Puis rendez-vous dans le fichier de configuration du VirtualHost de votre site à l’emplacement suivant /etc/apache2/sites-available/

Modifier votre VirtualHost :

<VirtualHost *:80>
        ServerName votre-domaine.fr

        ServerAdmin postmaster@votre-domaine.fr
        DocumentRoot /var/www/votre-domaine

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

        Redirect permanent / https://votre-domaine.fr
</VirtualHost>

<VirtualHost *:443>
        ServerName votre-domaine.fr
        ServerAdmin postmaster@votre-domaine.fr
        DocumentRoot /var/www/votre-domaine

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on
        SSLCertificateFile /etc/ssl/certificats/votre-domaine.fr_ssl_certificate.cer
        SSLCertificateKeyFile /etc/ssl/cles/votre-domaine.fr_private_key.key
        SSLCertificateChainFile /etc/ssl/certificats/votre-domaine.fr_ssl_certificate_INTERMEDIATE.cer
</VirtualHost>

Une fois la configuration du VirtualHost faite et enregistrer, vous pouvez vérifier que votre configuration apache2 est correct :

Si vous n’aviez pas de VirtualHost avant, n’oubliez pas de l’activée ! Avec la commande a2ensite votre-domaine.fr

apachectl configtest

Si le message suivant vous est retourner, c’est que votre configuration est correct sinon il faut regarder votre fichier de configuration, il doit y avoir une erreur.

apache-2-certificats-ssl-debian-11-verification-configuration-apache2.png

Une fois que vous êtes sûr que votre configuration est correct, alors vous pouvez redémarrer le service Apache2.

systemctl restart apache2

Après avoir fait cette opération si vous essayé de vous connecter sur votre domaine depuis un navigateur. Vous aller être automatiquement rediriger sur le protocole HTTPS, même si vous précisé que vous utilisé le protocole HTTP.

Sources :

https://wiki.debian.org/Apache
Apache2

Installer CrowdSec pour Apache sur Debian 11

Dans cette procédure, je vais vous montrer comment installer CrowdSec sur Debian 11 pour protéger son site Web Apache. CrowdSec est un outil qui va permettre de bloquer les attaques qu’il détecte sur le serveur, nous allons utilisé un serveur Debian 11 dans notre démonstration. CrowdSec fonctionne avec des modules appelés des Bouncers. Les bouncers permettent de bloqué les trafics réseau qui ne sont pas détecter comme « normaux ». Ils peuvent soit bloqué complètement la requête ou afficher à Captcha dans le but de vérifier qu’il ne s’agit pas d’un robot.

logo-crowdsec.png

Prérequis :

Installer CrowdSec pour Apache 2 sur Debian 11 :

Avant de commencer l’installation de CrowdSec, commencer par mettre à jour la liste des paquets votre machine Debian 11

sudo apt update

Ensuite télécharger le CrowdSec sur votre machine Debian :

sudo apt install -y crowdsec

Après avoir installer CrowdSec sur votre machine, la CLI de CrowdSec (CSCLI) vous permet de voir les services pouvant être protéger par CrowdSec présents sur votre machine.

cscli collections list

crowdsec-collections-list.png

Vous pouvez également lister les bouncers installés et disponibles sur votre machine :

cscli bouncers list

Si vous exécutez cette commande, vous allez voir un tableau vide. C’est normal car nous n’avons pas encore installer de bouncer.

Installation du Bouncer Apache 2 sur CrowdSec (Debian 11) :

Avant de commencer l’installation du Bouncer, assurez-vous d’avoir composer d’installé. Si vous ne l’avez pas installer, voici une procédure pour l’installer :
Installer Composer sur Debian 11

Nous allons installer git sur la machine pour pouvoir cloner le Repo du bouncer :

sudo apt install git -y

Puis nous clonons le Repo GitHub :

git clone https://github.com/crowdsecurity/cs-php-bouncer.git

On se rend dans le dossier du projet :

cd cs-php-bouncer/

Enfin on lance l’installation avec un compte utilisateur (pas avec le compte root ni avec sudo mais le compte utilisateur doit être dans le groupe ‘sudo’)

./install.sh --apache

Puis on donne les droit en tant que propriétaire www-data (apache) sur le répertoire de CrowdSec

sudo chown www-data /usr/local/php/crowdsec/

Puis on redémarre le service de Apache

sudo systemctl reload apache2

Enfin le Bouncer de Apache va apparaître dans la liste des bouncers :

sudo cscli bouncers list

Installer-CrowdSec-pour-Apache-sur-Debian-11-Bouncer-list-verification--768x118.png

Ensuite on va afficher un Captcha pour les utilisateurs qui consulterons notre site web avec un mauvais User-agent (Généralement les outils de pentest utilisent des User-Agent différent des navigateurs Web) et les crawler non static.

On va modifier le fichier de configuration :

sudo nano /etc/crowdsec/profiles.yaml
# Mauvais User-Agent + Crawler
name: crawler_captcha_remediation
filters:
 - Alert.Remediation == true && Alert.GetScenario() in ["crowdsecurity/http-crawl-non_statics", "crowdsecurity/http-bad-user-agent"]
decisions:
 - type: captcha
   duration: 4h
on_success: break
---
name: default_ip_remediation
filters:
 - Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
 - type: ban
   duration: 4h
on_success: break
---

Puis on redémarre CrowdSec pour qu’il utilise la nouvelle configuration :

sudo systemctl restart crowdsec

Il est possible d’afficher toutes les actions que CrowdSec aura pris avec cette commande :

sudo cscli decisions list

C’est également possible de débanir une adresse IP :

sudo cscli decisions delete --ip adresse-ip-a-deban

La CLI de CrowdSec est pratique mais CrowSec propose également une interface graphique Web avec Docker.

Sources :

https://doc.crowdsec.net/
Apache2

Créer une Autorité de certification

Dans cette procédure je vais vous expliquer comment créer une autorité de certification et un certificat hôte pour Apache2. Pour réaliser l’autorité de certification nous allons utiliser Openssl et une machine Debian.

logo-openssl.png

Prérequis :

Créer une Autorité de certification :

D’abord, nous allons créer un répertoire pour notre autorité de certification :

mkdir -p /etc/ssl/certificats/CA

Ensuite nous allons créer la clé privée de l’autorité de certification :

openssl genrsa -des3 -out /etc/ssl/certificats/CA/CA.key 2048

Saisir une passphrase qui sera utilisée pour signer les certificats (Donc à ne pas perdre).

Puis nous allons générer le certificat root (racine) de l’autorité de certification au format .pem :

 openssl req -x509 -new -nodes -key /etc/ssl/certificats/CA/CA.key -sha256 -days 10000 -out /etc/ssl/certificats/CA/CA.pem

Une liste de questions va vous être demandée.

Ensuite nous allons générer le certificat root (racine) au format .crt :

openssl x509 -in /etc/ssl/certificats/CA/CA.pem -inform PEM -out /etc/ssl/certificats/CA/CA.crt

Installer l’autorité de certification sur une machine :

Nous avons créer 3 fichiers dans le répertoire /etc/ssl/certificats

Intallation version web :

Le fichier CA.crt est a importé dans votre navigateur Web :

Installation au niveau de l’OS :

Windows :

Récupérer le fichier CA.crt et double cliquer dessus => Choisir l’emplacement : « Autorité de certification racine de confiance »

Ou en ligne de commande :

certutil.exe -addstore root CA.crt

Pour Firefox, il faut autoriser l’utilisation des autorités de certifications de confiances de Windows.
Donc il faut créer un fichier dans le répertoire suivant C:\Program Files (x86)\Mozilla Firefox\Defaults\Pref\defaults\pref\ ou C:\Program Files\Mozilla Firefox\Defaults\Pref\defaults\pref\ :

Créer un fichier enableroot.js
Ajoutez y le contenu suivant :

pref("security.enterprise_roots.enabled", true);
Linux :

D’abord, on va copier le fichier CA.crt dans le répertoire des autorités (/usr/local/share/ca-certificates/) :

cp CA.crt /usr/local/share/ca-certificates/

Ensuite mettre à jour les autorités :

update-ca-certificates

Créer un certificat hôte :

D’abord nous allons créer un répertoire pour notre hôte :

mkdir -p /etc/ssl/certificats/hote

Ensuite nous allons créer la clé privée de l’hôte :

openssl genrsa -out /etc/ssl/certificats/hote/hote.key 2048

Puis on génère la demande de signature de certificat (fichier au format .csr) :

openssl req -new -key /etc/ssl/certificats/hote/hote.key -out /etc/ssl/certificats/hote/hote.csr

Dans les questions qui sont demandées, il faut mettre le DNS du serveur pour le Common Name.

Signer le certificat hôte par l’autorité de certification :

D’abord on va créer un fichier de configuration :

nano /etc/ssl/certificats/hote/hote.ext

Avec le contenu suivant :

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = hote

Pour signer le certificat de l’hôte par l’autorité de certification précédemment créée nous allons exécuter la commande suivante :

openssl x509 -req -in /etc/ssl/certificats/hote/hote.csr -CA /etc/ssl/certificats/CA/CA.pem -CAkey /etc/ssl/certificats/CA/CA.key -CAcreateserial -out /etc/ssl/certificats/hote/hote.crt -days 10000 -sha256 -extfile /etc/ssl/certificats/hote/hote.ext

Enfin on renseigne la passphrase de l’autorité de certification.

Intégré le certificat signé avec Apache2 :

Pour intégré le certificat dans Apache2, on doit éditer le Virtual Host qui est utilisé dans le répertoire /etc/apache2/sites-available :

nano /etc/apache2/sites-available/000-default.conf

Voici un exemple de configuration :

<VirtualHost *:80>
        ServerName hote

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        Redirect permanent / https://hote/
</VirtualHost>
<VirtualHost *:443>
        ServerName hote

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        
        SSLEngine on
        SSLCertificateFile /etc/ssl/certificats/hote/hote.crt
        SSLCertificateKeyFile /etc/ssl/certificats/hote/hote.key
</VirtualHost>

Cette configuration permet d’automatiquement rediriger les connexions http en https et d’utiliser les fichiers du certificat et de la clé de l’hôte.

Ensuite on va activer le SSL sur Apache2 :

a2enmod ssl

Puis on redémarrer le service Apache2 :

systemctl restart apache2

Nginx


Nginx

Setting up an NGINX Reverse Proxy with SSL

A reverse proxy is a function of a web server that allows it to forward requests onto other web servers. Typically they are set up in combination with a wildcard SSL certificate, allowing each subdomain to go to a different server. Apache2 and NGINX can both function as reverse proxies, but NGINX is much easier to set up!

Installing NGINX

Install using apt

First, install nginx using apt:

sudo apt install nginx
Testing with telnet

Telnet is great for testing TCP ports. NGINX listens on TCP port 80 by default, so we can test it with telnet:

telnet 127.0.0.1 80

If the server is responding correctly, you should see an output similar to below:

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Configuring NGINX

NGINX configuration files are stored in /etc/nginx/ - the site configuration files are stored in sites-available/, then these are enabled by creating a symbolic link to them in sites-enabled/

Disabling the default site configuration file

Now that we know the server is running, we are going to disable the default NGINX configuration file. This is so that we can create a new one that is more focused around the reverse proxy abilities of NGINX.

To remove the default configuration file, run this command:

sudo rm /etc/nginx/sites-enabled/default

Creating a new site configuration file

We will now create a new site configuration file, using our domain name as the file name:

sudo nano /etc/nginx/sites-available/YOUR.DOMAIN

Here is an example template, which retains NGINX's default site configuration for the root domain and does reverse proxy for a subdomain to a Proxmox server:

# We are defining our Let's Encrypt certificate here
# If your NGINX server will serve multiple domains, you will instead need to place it within the 443 definition
ssl_certificate /etc/letsencrypt/live/YOUR.DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR.DOMAIN/privkey.pem;

# Required when reverse proxying to a Proxmox server
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# This will forward all HTTP requests to HTTPS
server {
	listen 80;
	listen [::]:80;
	server_name *.YOUR.DOMAIN;
	rewrite ^ https://$host$request_uri? permanent;
}

# This will serve NGINX's default web page, via HTTPS
server {
	listen 443 ssl;
	listen [::]:443 ssl;
	server_name YOUR.DOMAIN;
	
	# Define the web root
	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}
}

# This subdomain will reverse proxy requests to a Proxmox web interface
server {
	listen 443 ssl;
	listen [::]:443 ssl;
	server_name proxmox.YOUR.DOMAIN;

        location / {
                proxy_pass              https://YOUR.PROXMOX.IP.ADDRESS:8006;
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection "upgrade";
        }
}

Once modified to suit your setup, use Control-S to save and Control-C to quit nano.

Enabling the new configuration file

We now have a new configuration file, and we are going to enable it by creating a symbolic link:

sudo ln -s /etc/nginx/sites-available/YOUR.DOMAIN /etc/nginx/sites-enabled/YOUR.DOMAIN

Testing the configuration

We can now run nginx -t in order to test the new configuration file:

sudo nginx -t

Assuming all is well, you should see an output similar to below:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Restarting NGINX

Once we've confirmed that the configuration file tests successfully, we can apply it by restarting the NGINX service:

sudo systemctl restart nginx

Testing port 443 with telnet

We already know that NGINX was listening on TCP port 80, but since we have just enabled SSL, we want to make sure that it's also listening on port 443:

telnet 127.0.0.1 443

The output should be similar to before:

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Nginx Proxy-Manager

Nginx Proxy-Manager

Securing NGinX Proxy Manager

Installing NGinX Proxy Manager

To install NPM you need to install docker and docker-compose, and create a new folder on the server you want to run it in.  Next, you'll create two files inside that folder:

  • config.json
  • docker-compose.yml

Inside the config.json file, you'll put the following:

{
  "database": {
    "engine": "mysql",
    "host": "db",
    "name": "npm",
    "user": "<your desired username>",
    "password": "<a strong password>",
    "port": 3306
  }
}

And inside the docker-compose.yml file you'll put:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./config.json:/app/config/production.json
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:10.4'
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: '<username from config.json>'
      MYSQL_PASSWORD: '<strong password from config.json>'
    volumes:
      - ./data/mysql:/var/lib/mysql

Make sure to replace the items with < and > around it in each file, and that the username and passwords in each file match.

Now run the command:

docker-compose up -d

Give it a minute to pull down everything, and get started, and then in your browser go to the IP address of your server.  You should get a Congratulations screen.

if you go tot he IP address at port 81 (http://192.168.1.x:81), you'll be prompted to login to NPM.

Default credentials are:

username: admin@example.com
passwrod: changeme

Make sure to update the email and password, from the default values, then log out, and back in usign the new values you entered.

Now, you're ready to start proxying traffic.

Securing NGinX Proxy Manger Admin Console

The simples and most direct way is to secure NPM to itself.  Yep, you just make a loop so that when you ask for a specific URL that you'll have created an A Record for, you get your NGinX Proxy Manager install will proxy the traffic to it's port 81 admin console.

Let's add a new Host entry, and on the dtails page enter the URL you want to use to access the admin console.

In my case, I called it "manage" and created an A Record to point to my public IP address, which is port forwarded 80, 443 to my NPM server.

In my Details tab, I'll enter "manage.example.com" (replace example.com with your domain of course).

Next, enter the IP address of your docker0 interface.  You can find this with either:

ifconfig

or

ip addr show docker0

Next, enter 81 for the port number.

Turn on the "Block Common Exploits" option, and Save.

We Save now so we can test it and make sure we are routed properly to our Admin login page.  This is still unencrypted, so don't log in, but make suer you get to the Admin login page by visiting your URL.

If you get to the page successfully, you can go back to NPM via the IP nad Port, and click the 3 dot icon at the right end of your 'manage' row.  Select 'Edit' andn move to the 'SSL' tab.

Choose "Request a New Certificate" from the first dropdown.

Turn on "Force SSL".

Fill in your email address.  LetsEnctrypt uses this to let you know if your Certificates have issues or will expire soon and haven't been renewed.

Select to 'Accept the Terms of Service'.

Click 'Save'.

Now, attempt again, to reach your URL.  You should be routed to an SSL encrypted site, and you can now login to your Admin console.

What About Keeping the Rest of the Internet Out?

Yep, you just created a publicly accessible URL for your NPM admin console.  Not to fear.  You can still secure it further.  Go to the "Access Lists" tab, and create a new Access List.

Give your new List a name, and then move to the Authorization tab.  Enter as many emails and passwords for users you want to have access to the site.  If you want to restrict to http basic auth, then save, and close your browser (Note: you may have to clear your cache).  Then, re-open, and visit your site, and you should get a prompt for Credentials before you get to the main login screen of NPM itself.

Want more than just basic authentication?

You can also add public IP addresses that will be allowed to access the site.  Edit your Access List, and move to the Access tab.  Enter yoru public IP address, then try to access the site from a machine not on your LAN, and you'll find you won't be able to.

Now, let's say you want to access the site with one or the other, Username and passsword, or Public IP.  Then on the Details tab of your Access List, and enable the option for 'Satisfy Any'.  This makes it so either User or IP will be allowed.  When this is disabled, then you must have both User credentials and be on an allowed Public IP.

Conclusion

You have amazing open source tools at your fingertips, and making them more secure is highly recommended.  Please use the tools and capabilities to run securely.

Nginx Proxy-Manager

Using NginX Proxy Manager for proper Website Routing

What's NginX?

NginX (pronounced Engine-X) is a web-server, and reverse proxy.  Basically, it can serve up web pages, and can provide a proxy service for incoming web requests.  It all sounds a bit generic, but that's because it is.  NginX can serve web pages, but can also direct requests for Web pages, Web Services, and Web Applications to the right place.  Essentially, it's a hub and router.  It receives a request for any number of web services, and routes the requests to the proper location.

NginX in and of itself, if configured through the terminal in configuration files.  It's not pretty, it's not overly difficult, but you definitely have to have a good feel for all of the options that can be set.

NginX Proxy Manager is a nice Graphical User Interface (GUI) for the user to utilize vs. having to edit and create a bunch of configurations.

Workflow of NginX Proxy Manager

When you want to route a user to a specific web page or site, NginX is a great tool for the job. NginX will listen on your server, and once it receives a request, will route the request to the appropriate service, server, page, or application.

Clarification of the term "Router"

I need to be clear about something here.  NginX is not an application router.  Many applications use routers to move you from page, or portion of a page or application, to another.  These are application level routers.   Also, NginX is not a hardware router, like the one on your home network that routes all of your network traffic to various machines, smart devices, etc.

NginX is a Proxy Router.  It acts as a proxy for the requested web page or site, and forwards that request on to the appropriate site on your server, then returns the response information to the browser.

Workflow Continued

Requests for websites come into a server on a standard port (generaly 80 or 443). When those requests are received, NginX will parse the request by name, and look through it's configuration files to see if any of them match for the request being made.

If I request fixitdelrio.com, NginX will look for a configuration file that tells it what to do with requests for that site.  If it finds a match it will then use the other information in that confiuration to push that request along to the appropriate server or service.

The configuration might tell NginX, "Hey, when you see fixitdelrio.com, send it to the IP 10.20.30.40 please."   So, since we asked so nicely, NginX does as requested.

For another site being run on the same server, like opensourceisawesome.com, NginX will send the request along to the same IP, but a different port.  While we make the request on the standard port 80, NginX knows that really that site is running on port 24356, and has in it's confguration file to push our request along to 10.20.30.40:24356.  Thus, we ask for opensourceisawesome.com, and don't have to know it's running on a special port.

What about SSL and Encryption?

NginX can also deal with SSL and Encryption, and can be quite helpful with it as well.

If I want to run lubbocklug.org on https instead of http, I can use NginX to help me do that.  I can use NginX-Proxy-Manager to tell the request for http://lubbocklug.org to always force the requestor over to https://lubbocklug.org, thus they never go to my site without encryption.

This is huge in today's world of unethical hackers.  Protecting our users is one of the most important steps we can take as self-hosters.

Okay, I'm tired of the Intro...tell me how to do it.

Information sourced from https://nginxproxymanager.com/setup/

First, you want to install Docker.  Docker CE (Community Edition) is a wonderful tool that uses a very lightweight virtualisation engine to run applications, web sites, and services.  You can hose many containers (a virtualized application server) on a single Docker install.

Once you have Docker installed, you will want to install NginX Proxy Manager.  This part is fairly straight-forward, so let's look at how it's done.

docker-compose.yml

Next, we need a docker-copose.yml (pronounced yamuhl) file.  This file tells docker what images to pull, what containers to start, what to call them, how they connect to each other if there is more than one, and all kinds of other information.  It's, again, pretty straight-forward, so let's jump into it.

Still in our nginx_proxy_manager folder, we now want to create a file called docker-compose.yml.  So enter the command

nano docker-compose.yml

Copy the code below using CTRL+C (Win, Linux, Unix) or CMD+C (MacOS).

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Now paste the text into the blank text editor window.  Use CTRL+Shift+V for Linux, Unix, Win; and usse CMD+V for MacOS.

Again, we need to edit come values in this file.  We want a couple of these values to match the values we changed in our config.json.  Using your arrow keys move down to the section titled # environment:.  Under that section you need to either remove the # symbol in front of the second line, or remove this entire section (3 lines).  

I suggest if you are not going to use IPv6, then make that section look like this.

environment:
      # Uncomment this if IPv6 is not enabled on your host
      DISABLE_IPV6: 'true'

If you intend to use IPv6, then change true to false, and ensure it's still surrounded by single quotes '.

Now use your arrow keys to move down to the section titled db:.  Below it, we want to chagne three values.

First let's change the value for MYSQL_ROOT_PASSWORD.  We, again, want to make this a strong, but different password from the config file earlier.

After that, change the MYSQL_USER value to match what we entered in our config.json file for "user", and our MYSQL_PASSWORD value to match what we entered in our config.json file for "password".  

Once those changes are made, save the file with CTRL+O, then press Enter / Return.  Next press CTRL+X to exit the nano editor.

Start the NginX Proxy Manager

Finally, we will use our docker-compose.yml file to fetch the docker images, and start our containers (yep, there are 2 conttainers - 1 for NginX Proxy Manager, and 1 for the MySql database for configs).

In the same terminal window, enter the command:

docker-compose up -d

if your user is not part of the `docker ` group, you may have to use

sudo docker-compose up -d

Then, enter your sudo password when prompted.

If all goes well, you should be able to browse to your server URL or IP address on port 81 to see the NginX-Proxy-Manager admin portal.

something like http://opensourceisawesome.com:81 <– of course using your own domain or IP.

If you see the admin portal, congratulations! You've got it setup!  Now NginX is listening on port 80 and port 443 for web-requests.  

The next part is setting up various sites for NginX to proxy.

Proxying Site Traffic with NGinX Proxy Manager

Now that NGinX Proxy Manager is up and running, let's setup a site.  Click on 'Proxy Hosts' on the dashboard.  The card will likely have a 0, and the view will be empty, or should, so we need to add a new host.  

Dashboard View

Now click on the 'Add Proxy Host' button on the upper right of the Proxy Hosts view.

You should see a modal (pop-up) window like the one below.

Add Proxy Host Modal Window

Enter the domain name you want NGinX to listen for in the "Domain Name" field. Domain names should be entered wtihout http or https on the front.  so only enter something like billybobsbassboatsandboots.com or if you are listening for a subdomain inventory.billybobsbassboatsandboots.com

Next, enter the hostname or IP address of the server where the site you entered in the previous step is running.  Finally, enter the port number on which that site is listening / hosting it's traffic.  If you're using Docker to host these sites, then you can see any port mapping using the docker ps or sudo docker ps command.

Click 'Save'.

If all goes well, the modal (pop-up) window will close, and you should see an entry in your Proxy Hosts view.

Now you can click on the domain name to have it open in a new tab.  If everything is setup properly, you should see your web site.

But what about SSL?

SSL is absolutely an option, and pretty easy to get setup with NginX Proxy Manager.  You do have to make sure that you've setup your domain to be reached on port 80.  Don't get confused.  The port you entered in the last step above, does not need to be 80, but the Domain Name you entered should not have a port added on the end of it...that's all it means.  

Essentially, you need to be able to get to billybobsbassboatandboots.com without having to add a specific port number.  So we don't want to have to do billybobsbassboatandboots.com:11232 or anything.

Once you are sure that your site comes up on port 80, you'll want to click on the three vertical dot icon at the right end of the line with your domain on it.

Click the 3-dot Menu Option

Select 'Edit' from the menu that is shown, and we'll edit our NginX entry.  In the modal (pop-up) window, we want to move to the second tab "Custom Locations".  In this section we just want to re-type the same domain name we entered on the first tab, but in the 'Location' field.

Next, click the drop-down menu under 'Scheme', and select "https".  Now enter the IP or Hostname address of the server we are proxying the traffic to (usually the same as what we entered on the first tab as well.  Finally, enter the port you mapped to 443 in the Port field.

Now we want to move to the third tab, "SSL".   Here you want to click where it says "None", and select "Request a new SSL Certificate".   If you want to force users to always go to the secure version of your site (which you almost always do), turn on the switch next to the "Force SSL" option.

Now enter your email address into the email field, and turn on the option next to "I agree to the LetsEncrypt Terms of Service".

Options to Request a LetsEncrypt SSL Certificate for your site.

Now click "Save".  It may take a minute or so, but if you are returned to the Proxy Hosts view, and no errors are displayed, then your site should now be available on https.

Conclusion

This process of proxying traffic through a single endpoint, is useful for controlling not only the traffic to and from your home or server, but also for allowing you to run multiple web-sites / hosts on a single server install.

Repeat the above steps for each site you are hosting, and over time you'll get a full list of sites being proxied by NginX.  You can add custom options as you become more familiar with NginX right inside the Edit modal as well (tab 4).  

Wordpress

Wordpress

Installer WordPress sur Debian 11

Dans cette procédure, je vais vous expliquer pas à pas comment installer WordPress sur une machine Debian 11. Après avoir suivi cette procédure vous aurez une machine Debian avec WordPress d’installer. En cas de soucis, je vous conseil de consulter le site officiel : https://wordpress.com/


logo_wordpress.png

Prérequis :

Installation de WordPress sur Debian 11

WordPress est un CMS qui utilise une base de données pour stocker tous les articles, utilisateurs et autres… Pour notre utilisation nous allons installer Mariadb, qui est très similaire avec Mysql.

MariaDB :

Connexion sur MariaDb :

mysql -u root -p

Création d’une nouvelle base de données :

CREATE DATABASE wordpress_db;

Création d’un nouvel utilisateur MariaDB et attribution des droits sur la nouvelle base de données :

GRANT ALL ON wordpress_db.* TO 'wordpress_user'@'localhost' IDENTIFIED BY 'password';

Appliquer les privilèges :

FLUSH PRIVILEGES;

Quitter MariaDB :

EXIT;

Se diriger dans le répertoire /var/www/html :

cd /var/www/html/

Installer WordPress sur Debian 11 :

Télécharger WordPress :

curl -O https://wordpress.org/latest.tar.gz

Décompression de l’archive de WordPress

tar -xvf latest.tar.gz

Suppression de l’archive :

rm latest.tar.gz

Attribution des droits au serveur Web :

chown -R www-data:www-data /var/www/html/wordpress

Rendez-vous dans le dossier WordPress :

cd wordpress

Copie du fichier de configuration :

cp wp-config-sample.php wp-config.php

Édition du fichier de configuration :

config-db-wordpress-debian.png

Suppression du fichier readme.html

rm /var/www/html/wordpress/readme.html

Installation de modules php pour WordPress :

apt install php-gd php-intl php-mbstring php-imagick

Aller modifier le fichier de config Apache et bouger la racine d'apache dans le dossier wordpress

Screenshot_1.png

Puis redémarrer Apache :

systemctl restart apache2

Depuis votre navigateur vous devriez accéder à la configuration de WordPress :

http://votreip/wordpress

Avant la publication de WordPress sur le Web, il est conseillé de faire quelques opérations en plus d’un serveur Web. La première chose à faire est d’activer une extension qui empêchera les tentatives d’attaque par brute force. La seconde sera de modifier l’accès admin par un autre emplacement, des extensions permettent de le faire. La troisième sera de ne pas avoir de comptes qui contiennent « admin » ou des mots de passe faibles.

Je déconseille l’hébergement d’un site WordPress sur votre réseau, le moindre oublie de sécurité peut laisser la possibilité à un attaquant de contrôler votre machine / réseau.

Wordpress

WordPress Désactiver wp_xmlrpc

Le XML-RPC permet à WordPress de pouvoir communiquer avec d’autres applications, le soucis de XML-RPC est qu’il est également utiliser pour les attaques sur les sites WordPress. Dans cette procédures, je vais vous montrer comment désactiver wp_xmlrpc dans WordPress. Si wp_xmlrpc n’est pas utilisé, il est impératif à désactiver car il représente une menace de sécurité.


logo_wordpress.png

Prérequis :

Désactiver wp_xmlrpc dans WordPress avec Apache :

Pour désactiver wp_xmlrpc dans WordPress, il faut interagir avec le fichier .htaccess qui se trouve à la racine de votre site, alors avant de modifier quoi que ce soit faites une copie de se fichier avant de le modifier. En cas de mauvaise manipulation vous aurez juste à restaurer le fichier de base pour revenir à la normale.

Commande pour copier le fichier :

cp .htaccess .htaccess.sauveguarde

Ensuite ouvrer le fichier .htaccess avec un éditeur de texte

nano .htaccess

Puis coller cette configuration à la fin de votre fichier :

# BEGIN Disable XML-RPC request
<Files xmlrpc.php>
   order allow,deny
   deny from all
</Files>
# END Disable XML-RPC

wordpress-desactiver-wp_xmlrpc-htaccess-apache.png

Une fois que vous avez changé cette configuration, wp_xmlrpc de votre site Web sera désactiver.

Sources :

https://ws.apache.org/xmlrpc/

Après avoir fait ces modifications dans le fichier .htaccess, il se peut que des services que vous utiliser ne fonctionnent plus.
Si vous souhaitez revenir en arrière, soit vous devez retirer la configuration qui a été ajouter dans le fichier .htaccess ou sinon il faudra restauré le fichier .htaccess.sauveguarde.
Ou vous pouvez également modifier votre structure de la manière suivant :

# BEGIN Disable XML-RPC request
<Files xmlrpc.php>
   order allow,deny
   deny from all
   allow from xxx.xxx.xxx.xxx
</Files>
# END Disable XML-RPC

En remplacent xxx.xxx.xxx.xxx par l’ip de votre service

Wordpress

WordPress référencement naturel (SEO)

Dans cette procédure, je vais vous expliquer comment améliorer son référencement naturel avec WordPress. Posséder un site WordPress n’est pas quelque chose de compliqué à obtenir. Mais par contre, avoir des visiteurs à l’aide de référencement naturel n’est aussi simple à mettre en œuvre. Le Référencement naturel est une pratique qui consiste à améliorer son positionnement dans les moteurs de recherche sans financer de la publicité (ex : Google Ads).


logo_wordpress.png

Prérequis pour améliorer son référencement naturel avec WordPress :

Optimiser son référencement naturel avec WordPress :

Le référencement naturel est aussi appelé SEO (Search Engine Optimisation), avoir un bon SEO nécessite quelques bonnes pratiques à mettre en œuvre.

Voici ma liste des pratiques à utiliser pour obtenir un meilleur positionnement :

Un chargement rapide du site Web :

Afin d’avoir un site rapide avec WordPress, il faut un hébergeur de qualité, mais pas seulement et compresser son contenu à l’aide d’outils tel que Gzip.
Il faut également se protéger contre les cyberattaques, je vous conseille d’utiliser les outils suivants : Crowdsec, Change wp-admin login et Limit Login Attempts Reloaded.
Ensuite, il faut utiliser des CDN pour délivrer son site plus rapidement.

Il est possible de mesurer la vitesse de son site à l’aide des outils suivants :

Du contenu inédit et régulier :

Je vous conseille de publier au moins une fois par semaine un article, que vous avez écrit vous-même (sans faire de copier/coller).

Il est préférable de rien poster plutôt que de faire un copier/coller d’un article de quelqu’un d’autre.

Cibler des mots-clés :

Utiliser les bons mots-clés permet d’obtenir plus d’impression/clics sur son article.

Certains outils mesurent les performances comme Ubersuggest ou Google Analytics / Matomo.

Effectuer des maillages interne et externe :

Dans vos pages et articles, n’hésitez pas à renvoyer le visiteur sur d’autres pages de votre site.

Vous pouvez par ailleurs renvoyer des visiteurs vers les sites de vos contacts afin de rediriger vos visiteurs.

Utiliser correctement les Images :

Pour utiliser correctement les images, il faut utiliser un nom de fichier qui correspond à l’image et au mot-clé de l’article.

Renseigner un Texte alternatif qui, comme le nom de l’image, correspond à l’image et au mot-clé de l’article.

Sources :

https://www.seo.fr/definition/seo-definition
Wordpress

WordPress Ajouter un Sitemap

Un Sitemap et une page qui permet de trouver l’ensemble des pages d’un site web. Il existe les Sitemap Xml utiliser pour le référencement et les Sitemap Html utilisé par les utilisateurs du site web. Dans cette procédure nous allons voir comment créer ces deux types de Sitemap sur un site WordPress à l’aide de plugins. Ajouter un Sitemap sur son site WordPress et utile pour le référencement SEO et faciliter l’utilisation du site pour les utilisateurs. Le Sitemap est aussi important pour indexer toutes les pages de son site web sans en oublier.


logo_wordpress.png

Prérequis :

WordPress Ajouter un Sitemap XML :

Pour ajouter un Sitemap XML sur son site, il faut installer et activer l’extension Yoast SEO

Ensuite, il faudra se rendre dans la catégorie SEO -> Réglages SEO -> Fonctionnalités

sitemap_yoast.png

sitemap_yoastseo_menu.png

Puis ensuite activé la fonctionnalité : Plans de site XML

yoast-seo-enable-sitemap.png

Ensuite le sitemap sera présent à l’emplacement : https://votresite.com/sitemap_index.xml

sitemap-xml.png

WordPress Ajouter un Sitemap HTML :

Pour ajouter un Sitemap HTML, il faudra installer et activer l’extension : WP Sitemap Page

Ensuite il faudra créer une nouvelle page dans cette page il faudra ajouter sur cette page le short code suivant :

[wp_sitemap_page] 

sitemap-wordpress-768x671.png

Ensuite le sitemap va être automatiquement générer sur la nouvelle page. Puis vous avez la possibilité de mettre dans votre footer un lien vers votre Sitemap.

Avoir un SiteMap Xml ou Html pour son site est important car il permet moteur de recherches d’indexer toutes les pages du site.
Un fois vos Sitesmaps générés vous pouvez les envoyer aux moteurs de recherches pour qu’ils puissent indexer toutes les pages de votre site web.
Il est possible de mettre un lien du Sitemap Html dans votre footer pour le rendre accessible à proximité des CGU.

Sources :

https://fr.wordpress.org/
Wordpress

WordPress et Google Analytics

Dans cette procédure, je vais vous montrer comment lier son site web WordPress et Google Analytics. La réalisation de cette procédure sera utiliser sans utiliser de plugins WordPress. Installer Google Analytics permet de suivre les actions des utilisateurs de son site Web.

logo-google-analytics.png

Prérequis :

Installation de Google Analytics sur WordPress

Pour commencer il faut se connecter un compte avec un compte Google sur le site de Google Analytics.

Une fois connecter sur Google Analytics il faut aller dans les paramètres en bas à gauche de la fenêtre.

Puis il faudra créer une propriété et répondre aux questions que Google Analytics va vous demander.

Une fois la propriété créer, rendez-vous sur l’assistant de configuration -> installation de la balise -> Ajouter un flux -> Web

Saisissez la configuration de votre site Web :

google-analytics-gtag-1024x499-2.png

Récupérer le contenue du Global site tag

google-analytics-gtag-1024x499.png

Puis ensuite il faudra ajouter une fonction dans votre thème enfant :

/**
* Ajout du code de suivi de Google Analytics dans le Header avant la fermeture de la balise Header
*/
add_action('wp_head', 'add_google_analytics');
function add_google_analytics() {
	?>
	<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-5P696FEXTB"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXXX');
</script>
<?php }
/**
* Fin Google Analitics 
*/

Puis remplacer ce script gtag.js par celui que Google Analytics vous a donné.

Les modifications seront effectives quelques minutes après la modification.

Sources :

https://fr.wordpress.org/
Wordpress

WordPress Thème enfant

Dans cette procédure je vais vous expliquer comment personnaliser un thème WordPress à l’aide d’un thème enfant. Après avoir suivit la procédure vous serez en mesure de personnaliser votre thème principale WordPress grâce a un thème enfant. L’utilisation d’un thème enfant permet de réaliser des modifications et de les conserver après les mises à jour thème.


logo_wordpress.png

Prérequis :

Création du Thème Enfant WordPress :

A l’aide des accès SSH ou FTP connectez vous à l’emplacement de votre site sur la machine qui héberge le site.

Puis rendez-vous dans l’emplacement : wp-content/themes

Ensuite créer un dossier qui s’appellera le-nom-de-votre-theme-child

Après la création de ce dossier, il faut créer deux fichiers dans ce dossier :

Puis dans le fichier « style.css », il faudra l’adapter à votre thème avec :

/*
Theme Name: astra-child
Description: Modification du theme parent.
Author: Cucherousset Aymeric
Author URI: https://aymeric-cucherousset.fr
Template: astra
Version: 1.0
*/

Après ce commentaire vous pouvez y ajouter vos modifications de CSS.

Ensuite il faut modifier le fichier functions.php pour activer le thème enfant :

Le code pour activer le thème peut être différent d’un thème parent à un autre.

<?php

/**
** activation theme
**/

add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
	wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
	wp_enqueue_style( 'astra-child', get_stylesheet_uri() );
}

?>

Pour rendre effectif le thème il ne reste plus qu’a se rendre dans le pannel admin de WordPress.

Il faut ensuite aller dans Apparences -> Thèmes.

Puis activer le thème enfant. Désormais les modifications faites sur le fichier (Accessible depuis Apparences -> Editeur de thèmes) du thème enfant serons prises en compte sur le thème et seront conservés au mises à jour du thème.

Sources :

https://fr.wordpress.org/

Caddy

Caddy

Introduction

Dans le monde de l’hébergement de sites web, choisir le bon serveur web peut faire toute la différence en termes de performance, de sécurité et de facilité de gestion. Caddy est un serveur web moderne et performant qui se distingue par sa simplicité d’utilisation et ses fonctionnalités avancées. Conçu pour automatiser les tâches fastidieuses comme la gestion des certificats SSL/TLS, Caddy permet aux administrateurs systèmes de se concentrer sur des aspects plus importants de leur infrastructure. Dans cet article, je vais vous présenter les caractéristiques principales de Caddy, son historique, les concepts de base, et quelques exemples de configurations pour que vous puissiez tirer le meilleur parti de ce serveur web innovant.

Historique de Caddy

Caddy a vu le jour en 2015, créé par Matt Holt avec une vision claire : simplifier la configuration et la gestion des serveurs web tout en intégrant des fonctionnalités modernes dès le départ. À l’époque, la gestion des certificats SSL/TLS était une tâche compliquée et chronophage pour les administrateurs systèmes. Matt Holt a voulu changer cela en intégrant le support automatique de Let’s Encrypt directement dans Caddy, rendant ainsi la sécurité web accessible à tous sans effort supplémentaire.

Dès sa sortie, Caddy s’est distingué par sa philosophie axée sur la simplicité et l’automatisation. En plus de la gestion automatisée des certificats SSL/TLS, Caddy a introduit une syntaxe de configuration claire et lisible, appelée le Caddyfile, facilitant ainsi la vie des développeurs et des administrateurs systèmes.

Au fil des années, Caddy a continué d’évoluer et d’innover, ajoutant des fonctionnalités comme le support des plugins pour étendre ses capacités, une meilleure gestion des performances et des améliorations constantes en termes de sécurité. La communauté autour de Caddy a également grandi, contribuant à son développement et à son adoption dans divers environnements, des petits sites web personnels aux grandes infrastructures d’entreprise.

Aujourd’hui, Caddy est reconnu non seulement pour sa simplicité et ses fonctionnalités intégrées, mais aussi pour sa robustesse et sa flexibilité, faisant de lui un choix populaire parmi les administrateurs systèmes cherchant une solution moderne et efficace pour leurs besoins en serveur web.

Fonctionnalités principales de Caddy

Caddy se distingue par un ensemble de fonctionnalités qui le rendent unique parmi les serveurs web. Voici quelques-unes des fonctionnalités principales qui font de Caddy un choix populaire pour les administrateurs systèmes et les développeurs :

L’une des forces de Caddy réside dans sa facilité de configuration. Il utilise un fichier de configuration appelé Caddyfile, qui est conçu pour être lisible et facile à écrire. Voici un exemple de Caddyfile minimaliste :



example.com {
    root * /var/www/html
    file_server
}

Dans cet exemple, Caddy sert le contenu du répertoire /var/www/html lorsque le domaine example.com est accédé.

HTTPS automatique

Caddy automatise entièrement la gestion des certificats SSL/TLS via Let’s Encrypt. Cela signifie que dès que vous configurez un domaine dans Caddy, il obtient automatiquement les certificats nécessaires et les renouvelle périodiquement sans intervention manuelle. Cette fonctionnalité simplifie grandement la sécurisation des sites web.

Extensibilité

Caddy est conçu pour être extensible grâce à un système de plugins. Ces plugins peuvent ajouter des fonctionnalités supplémentaires comme des authentifications spécifiques, des redirections avancées ou des intégrations avec d’autres services. La communauté développe activement des plugins pour répondre à divers besoins.

Performances élevées

Caddy est conçu pour être rapide et efficient en termes de ressources. Il utilise des techniques modernes pour gérer les connexions et les requêtes, ce qui permet de servir un grand nombre de requêtes simultanées sans sacrifier la performance.

Support natif des HTTP/2 et HTTP/3

Caddy prend en charge les protocoles HTTP/2 et HTTP/3 nativement, ce qui améliore la vitesse de chargement des pages et la sécurité. Ces protocoles sont conçus pour offrir une meilleure performance en termes de latence et de débit.

Gestion des fichiers statiques

Avec la directive file_server, Caddy peut facilement servir des fichiers statiques. Il peut également gérer les répertoires et fournir des listings de répertoires automatiquement.

Reverse proxy

Caddy peut agir en tant que revers-proxy, redirigeant les requêtes vers d’autres serveurs backend. Cette fonctionnalité est particulièrement utile pour les applications réparties sur plusieurs serveurs ou pour les microservices.

Redirections et réécritures d’URL

Caddy offre des fonctionnalités puissantes pour la redirection et la réécriture d’URL. Vous pouvez facilement configurer des redirections permanentes ou temporaires, ainsi que des réécritures d’URL complexes.

Journaux et surveillance

Caddy fournit des journaux détaillés et des outils de surveillance intégrés qui permettent de suivre l’activité du serveur et de diagnostiquer les problèmes. Ces outils sont essentiels pour maintenir une infrastructure stable et performante.

Sécurité renforcée

En plus de la gestion automatisée des certificats, Caddy intègre des fonctionnalités de sécurité telles que la prévention des attaques DDoS, la protection contre les scripts intersites (XSS) et bien d’autres.

Avec toutes ces fonctionnalités, Caddy se positionne comme un serveur web moderne et performant, idéal pour une variété de cas d’utilisation, des sites web simples aux infrastructures complexes nécessitant une gestion avancée des requêtes et des ressources.

Concepts de base

Pour tirer pleinement parti de Caddy, il est essentiel de comprendre quelques concepts de base. Ces concepts vous aideront à configurer et à gérer efficacement votre serveur web avec Caddy.

Caddyfile

Le Caddyfile est le fichier de configuration principal de Caddy. Il est conçu pour être simple et lisible, ce qui facilite la configuration des sites et des services. Un Caddyfile typique est structuré en blocs de configuration, chacun représentant un site ou un service distinct.

Voici un exemple de Caddyfile de base :


example.com {
    root * /var/www/html
    file_server
}

Dans cet exemple, le bloc example.com configure le domaine example.com pour servir le contenu du répertoire /var/www/html en utilisant la directive file_server.

Directives

Les directives sont des commandes spécifiques utilisées dans le Caddyfile pour configurer le comportement du serveur. Chaque directive a une fonction particulière, comme servir des fichiers statiques, rediriger des requêtes, ou configurer des paramètres de sécurité. Par exemple :


root * /var/www/html
file_server

Ces directives configurent le serveur pour servir des fichiers statiques à partir du répertoire /var/www/html.

Plugins

Caddy est conçu pour être extensible grâce à son support pour les plugins. Ces plugins permettent d’ajouter des fonctionnalités supplémentaires à Caddy, telles que l’authentification, la gestion des URL courtes ou des intégrations avec d’autres services. Les plugins peuvent être installés et configurés via le Caddyfile.

Routes et gestion des chemins

Les routes dans Caddy permettent de gérer comment les requêtes sont dirigées et traitées. Vous pouvez configurer des routes pour rediriger certaines requêtes vers des services backend, pour appliquer des réécritures d’URL, ou pour servir différents contenus selon le chemin de la requête. Voici un exemple de configuration de route pour un proxy inversé :


example.com {
reverse_proxy /api/* http://backend:8080
}

Dans cet exemple, toutes les requêtes vers example.com/api/* sont redirigées vers un serveur backend fonctionnant sur http://backend:8080.

Installation de Caddy

L’installation de Caddy est un processus simple et direct, que vous soyez sur un système d’exploitation Linux, macOS ou Windows. Dans cette section, je vais vous guider à travers les étapes d’installation de Caddy sur différents systèmes.

Installation sur Linux

Pour installer Caddy sur un système basé sur Debian (comme Ubuntu), vous pouvez suivre ces étapes :

Mettez à jour la liste des paquets et installez les prérequis :

sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https

Ajoutez la clé GPG de Caddy et le dépôt APT :


curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

Mettez à jour la liste des paquets et installez Caddy :


sudo apt update
sudo apt install caddy

Installation sur macOS

Pour installer Caddy sur macOS, vous pouvez utiliser Homebrew, un gestionnaire de paquets populaire pour macOS :

Installez Homebrew si ce n’est pas déjà fait. Vous pouvez le faire en suivant les instructions sur brew.sh ↗.

Installez Caddy en utilisant Homebrew :

brew install caddy

Installation sur Windows

Pour installer Caddy sur Windows, vous pouvez télécharger l’exécutable directement depuis le site officiel ou utiliser un gestionnaire de paquets comme Scoop ou Chocolatey.

Utilisation de Scoop

Installez Scoop si ce n’est pas déjà fait. Vous pouvez le faire en suivant les instructions sur scoop.sh ↗.

Installez Caddy en utilisant Scoop :

scoop install caddy

Utilisation de Chocolatey

Installez Chocolatey si ce n’est pas déjà fait. Vous pouvez le faire en suivant les instructions sur chocolatey.org ↗.

Installez Caddy en utilisant Chocolatey :

choco install caddy

Vérification de l’installation

Après avoir installé Caddy, vous pouvez vérifier que l’installation a réussi en exécutant la commande suivante dans votre terminal ou votre invite de commande :

caddy version

Cette commande doit afficher la version de Caddy installée sur votre système.

Démarrage et arrêt de Caddy

Pour démarrer Caddy en utilisant un fichier de configuration, utilisez la commande suivante :

caddy run --config /path/to/Caddyfile

Pour arrêter Caddy, vous pouvez utiliser Ctrl+C dans le terminal où Caddy est en cours d’exécution.

Exécution en tant que service

Sur les systèmes Linux, vous pouvez configurer Caddy pour qu’il s’exécute en tant que service système, ce qui permet de démarrer automatiquement Caddy au démarrage du système. Voici comment faire sur un système utilisant systemd :

Créez un fichier de service systemd pour Caddy :

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

Ajoutez les lignes suivantes dans ce fichier :

[Unit]
Description=Caddy web server
After=network.target


[Service]
ExecStart=/usr/bin/caddy run --config /etc/caddy/Caddyfile
Restart=always
User=caddy
Group=caddy


[Install]
WantedBy=multi-user.target

Rechargez systemd et démarrez le service Caddy :


sudo systemctl daemon-reload
sudo systemctl start cadd
sudo systemctl enable caddy

Avec ces instructions, vous êtes prêt à installer et à exécuter Caddy sur différentes plateformes. Dans la prochaine section, je vais vous montrer comment configurer Caddy pour servir des sites web et des applications.

Configuration de base

Une fois Caddy installé, la prochaine étape consiste à le configurer pour servir des sites web et des applications. Dans cette section, je vais vous montrer comment créer un fichier de configuration Caddyfile et expliquer les directives de base pour démarrer rapidement.

Création du Caddyfile

Le Caddyfile est le fichier de configuration principal de Caddy. Il est conçu pour être simple et lisible. Voici un exemple de Caddyfile minimaliste pour servir un site web statique :


example.com {
root * /var/www/html
file_server
}

Dans cet exemple :

Servir des fichiers statiques

Pour servir des fichiers statiques à partir d’un répertoire, utilisez la directive file_server. Voici un exemple de configuration complète :


example.com {
root * /var/www/html
file_server browse
}

Avec browse, Caddy générera automatiquement une liste des fichiers et des répertoires si l’index du répertoire n’est pas trouvé.

Utilisation de variables d’environnement

Caddy permet l’utilisation de variables d’environnement pour rendre la configuration plus flexible. Voici comment définir et utiliser une variable d’environnement dans le Caddyfile :


{$SITE_DOMAIN} {
root * /var/www/html
file_server
tls {$EMAIL}
}

Avant de démarrer Caddy, vous pouvez définir les variables d’environnement :


export SITE_DOMAIN=example.com
export EMAIL=email@example.com
caddy run --config /path/to/Caddyfile

Gérer les erreurs personnalisées

Caddy permet de définir des pages d’erreur personnalisées pour différents codes d’erreur HTTP. Voici comment configurer une page d’erreur personnalisée pour les erreurs 404 :


example.com {
root * /var/www/html
file_server
handle_errors {
@404 {
expression {http.error.status_code} == 404
}
rewrite @404 /html
file_server
}
}

Activer la compression

Pour améliorer les performances, vous pouvez activer la compression des réponses HTTP. Caddy prend en charge la compression gzip et zstd :


example.com {
root * /var/www/html
file_server
encode gzip zstd
}

Utilisation des directives de réécriture

Les directives de réécriture permettent de modifier les URL des requêtes avant qu’elles ne soient traitées. Voici un exemple de réécriture d’URL :


example.com {
root * /var/www/html
file_server
rewrite /old-path /new-path
}

Configuration des en-têtes HTTP

Caddy permet de définir des en-têtes HTTP personnalisés pour les réponses. Voici un exemple de configuration des en-têtes :


example.com {
root * /var/www/html
file_server
header {
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options "nosniff"
}
}

Rechargement de la configuration

Pour appliquer les modifications apportées au Caddyfile, vous devez recharger la configuration de Caddy. Cela peut être fait sans redémarrer le serveur en utilisant la commande suivante :

caddy reload --config /path/to/Caddyfile

Avec ces configurations de base, vous pouvez commencer à utiliser Caddy pour servir des sites web et des applications. La prochaine section abordera la gestion des certificats SSL/TLS de manière plus détaillée.

Gestion des certificats SSL/TLS

Une des fonctionnalités les plus appréciées de Caddy est sa capacité à gérer automatiquement les certificats SSL/TLS. Cette fonctionnalité simplifie grandement la sécurisation des sites web, éliminant la nécessité de gérer manuellement les certificats.

Obtention automatique des certificats

Caddy obtient automatiquement les certificats SSL/TLS pour vos domaines via Let’s Encrypt. Dès que vous configurez un domaine dans le Caddyfile, Caddy se charge d’obtenir et de renouveler les certificats sans intervention supplémentaire. Voici un exemple de configuration de base pour un site sécurisé :



example.com {
root * /var/www/html
file_server
tls email@example.com
}

Dans cet exemple, la directive tls avec une adresse email permet à Caddy de gérer les certificats SSL/TLS pour example.com.

Configuration avancée des certificats

Caddy offre des options avancées pour la gestion des certificats, comme l’utilisation de certificats personnalisés ou le contrôle des paramètres de TLS. Voici comment configurer des certificats personnalisés :


example.com {
root * /var/www/html
file_server
tls /path/to/cert.pem /path/to/key.pem
}

Dans cet exemple, Caddy utilise les fichiers cert.pem et key.pem pour le certificat et la clé privée.

Utilisation de DNS Challenge

Pour les domaines où le HTTP Challenge ne fonctionne pas (par exemple, les domaines wildcard), vous pouvez utiliser le DNS Challenge. Cela nécessite des configurations spécifiques pour le DNS provider. Voici un exemple pour Cloudflare :

Installez le plugin DNS correspondant :

xcaddy build --with github.com/caddy-dns/cloudflare

Configurez le DNS Challenge dans le Caddyfile :


example.com {
root * /var/www/html
file_server
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
}

Définissez la variable d’environnement avec votre token API Cloudflare :

export CLOUDFLARE_API_TOKEN=your-cloudflare-api-token
caddy run --config /path/to/Caddyfile

Renouvellement des certificats

Caddy gère le renouvellement automatique des certificats avant leur expiration. Vous n’avez donc pas besoin de vous inquiéter de l’expiration des certificats. Caddy surveille les certificats et les renouvelle au besoin.

Gestion des erreurs liées aux certificats

Il est important de surveiller les logs de Caddy pour détecter toute erreur liée aux certificats, comme l’échec de l’obtention ou du renouvellement des certificats. Voici comment configurer Caddy pour journaliser les erreurs liées aux certificats :



example.com {
root * /var/www/html
file_server
tls email@example.com
log {
output file /var/log/caddy/caddy.log
level ERROR
}
}

Paramètres TLS avancés

Pour les utilisateurs avancés, Caddy permet de configurer des paramètres TLS spécifiques, comme les suites de chiffrement ou les protocoles à utiliser. Voici un exemple de configuration TLS avancée :


example.com {
root * /var/www/html
file_server
tls email@example.com {
protocols tlstls3
ciphers TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
}
}

Dans cet exemple, Caddy est configuré pour utiliser uniquement TLS et avec des suites de chiffrement spécifiques.

Monitoring et gestion des certificats

Pour une gestion proactive, vous pouvez utiliser des outils de monitoring pour surveiller l’état des certificats SSL/TLS et recevoir des alertes en cas de problème. Des solutions comme Let’s Monitor ou des scripts personnalisés peuvent être intégrés à votre infrastructure de surveillance.

Avec ces fonctionnalités de gestion des certificats SSL/TLS, Caddy simplifie la sécurisation de vos sites web, en s’assurant que les certificats sont toujours à jour et configurés correctement. Dans la prochaine section, nous allons explorer l’utilisation des plugins pour étendre les capacités de Caddy.

Utilisation des plugins Caddy

Caddy est conçu pour être extensible et une des manières principales d’étendre ses fonctionnalités est par l’utilisation de plugins. Ces plugins permettent d’ajouter des fonctionnalités supplémentaires telles que l’authentification, la gestion des URL courtes, ou des intégrations avec d’autres services.

Les plugins pour Caddy sont disponibles sous forme de modules que vous pouvez inclure lors de la compilation de Caddy. Ils peuvent ajouter des fonctionnalités spécifiques ou modifier le comportement par défaut de Caddy. Vous pouvez trouver une liste des plugins disponibles sur le site officiel de Caddy.

Installation de plugins avec xcaddy

Pour installer des plugins, vous pouvez utiliser l’outil xcaddy, qui permet de compiler Caddy avec les plugins souhaités. Voici comment installer xcaddy et compiler Caddy avec un plugin :

Installez xcaddy :

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

Compilez Caddy avec un plugin, par exemple le plugin caddy-l4 pour le support de niveau 4 (TCP/UDP) :

xcaddy build --with github.com/mholt/caddy-l4

Une fois la compilation terminée, un nouveau binaire caddy est créé avec le plugin intégré.

Authentification

Le plugin http.authz permet d’ajouter des mécanismes d’authentification à vos sites web. Voici un exemple de configuration pour utiliser HTTP Basic Auth :


example.com {
root * /var/www/html
file_server


basicauth {
user hashed-password
}
}

Vous pouvez générer le mot de passe haché en utilisant une commande comme htpasswd :

htpasswd -nB user

Gestion des URL courtes

Le plugin http.urlshort permet de créer des redirections courtes. Voici un exemple de configuration :



example.com {
route /short {
redir /long-url
}
}

WebSocket

Pour ajouter le support WebSocket, vous pouvez utiliser le plugin caddy.websocket. Voici un exemple de configuration pour un serveur WebSocket simple :


example.com {
root * /var/www/html
file_server
reverse_proxy /ws localhost:8080 {
transport http {
versions h2c 2
}
}
}

Cloudflare DNS

Le plugin caddy-dns/cloudflare permet d’utiliser le DNS Challenge avec Cloudflare pour les certificats SSL/TLS. Voici un exemple de configuration :


example.com {
root * /var/www/html
file_server
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
}

Configuration des plugins dans le Caddyfile

Les plugins sont configurés dans le Caddyfile en utilisant des directives spécifiques à chaque plugin. Chaque plugin dispose de sa propre documentation pour les options de configuration disponibles. Voici un exemple de Caddyfile avec plusieurs plugins configurés :

example.com {
root * /var/www/html
file_server
 

# Basic Auth plugin
basicauth {
user hashed-password
}


# URL Shortener plugin
route /short {
redir /long-url
}


# WebSocket plugin
reverse_proxy /ws localhost:8080 {
transport http {
versions h2c 2
}
}


# Cloudflare DNS plugin
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
} 


Mise à jour et gestion des plugins

Pour mettre à jour Caddy avec les plugins, vous pouvez simplement recompiler Caddy avec xcaddy en spécifiant les versions mises à jour des plugins. Il est important de vérifier régulièrement les mises à jour de sécurité et les nouvelles fonctionnalités des plugins utilisés.

Dépannage des plugins

En cas de problèmes avec les plugins, consultez les logs de Caddy pour obtenir des informations sur les erreurs. Vous pouvez également consulter la documentation spécifique du plugin et les forums de support pour obtenir de l’aide.

Avec cette flexibilité offerte par les plugins, vous pouvez adapter Caddy à une multitude de scénarios et besoins spécifiques. La prochaine section traitera des meilleures pratiques pour la gestion et l’optimisation des performances de Caddy.

Gestion et optimisation des performances

Caddy est conçu pour être performant dès la sortie de la boîte, mais il existe des pratiques et des configurations supplémentaires qui peuvent améliorer encore plus ses performances. Dans cette section, je vais aborder les techniques de gestion et d’optimisation des performances pour tirer le meilleur parti de votre serveur Caddy.

Gestion de la mémoire et des ressources

Pour surveiller et gérer l’utilisation de la mémoire et des ressources CPU par Caddy, vous pouvez utiliser des outils de monitoring comme Prometheus et Grafana. Voici comment configurer Caddy pour exporter des métriques compatibles avec Prometheus :

Ajoutez le module Prometheus lors de la compilation de Caddy :

xcaddy build --with github.com/prometheus/client_golang/prometheus

Configurez le Caddyfile pour exporter les métriques :

{
    metrics {
        prometheus
    }
}

example.com {
    root * /var/www/html
    file_server
}

Configurez Prometheus pour scraper les métriques exportées par Caddy en ajoutant cette section dans le fichier de configuration de Prometheus (prometheus.yml) :


scrape_configs:
- job_name: "caddy"
static_configs:
- targets: ["localhost:2019"]

Compression et mise en cache

La compression et la mise en cache des réponses peuvent considérablement améliorer les performances de votre site web.

Compression

Pour activer la compression des réponses HTTP, utilisez la directive encode :


example.com {
root * /var/www/html
file_serve
encode gzip zstd
}

Mise en cache

Bien que Caddy ne propose pas de solution de mise en cache intégrée, vous pouvez utiliser des solutions externes comme Varnish ou des modules tiers pour gérer la mise en cache des réponses. Voici un exemple de configuration de Varnish avec Caddy :

Installez Varnish sur votre serveur.

Configurez Varnish pour écouter sur le port 80 et configurer Caddy pour écouter sur un port différent (par exemple, 8080).

Modifiez le fichier de configuration de Varnish (default.vcl) pour rediriger les requêtes vers Caddy :


vcl 0;


backend default {
.host = "1";
.port = "8080";
}


sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return (synth(405, "Not allowed."));
}
return (purge);
}
}


sub vcl_backend_response {
if (beresp.status == 200) {
set beresp.ttl = 10m;
}
}

Configurez le Caddyfile pour écouter sur le port 8080 :


example.com {
root * /var/www/html
file_server
encode gzip zstd
reverse_proxy localhost:8080
}

Optimisation des en-têtes HTTP

L’optimisation des en-têtes HTTP peut améliorer la sécurité et les performances de votre site web.

En-têtes de sécurité

Ajoutez des en-têtes de sécurité pour protéger votre site contre les attaques courantes :


example.com {
root * /var/www/html
file_server
header {
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "no-referrer"
Content-Security-Policy "default-src 'self'"
}
}

En-têtes de mise en cache

Configurez des en-têtes de mise en cache pour les ressources statiques :


example.com {
    root * /var/www/html
    file_server
    header /static/* {
        Cache-Control "public, max-age=31536000, immutable"
    }
}

Gestion des connexions

Configurer le nombre maximal de connexions et de workers peut aider à gérer la charge sur votre serveur :



example.com {
    root * /var/www/html
    file_server
    tls email@example.com
    max_conns 100
    max_header_bytes 1048576
}

Utilisation de HTTP/2 et HTTP/3

Caddy supporte HTTP/2 par défaut et peut également être configuré pour utiliser HTTP/3 pour des performances encore meilleures :

Activez HTTP/3 dans le Caddyfile :

example.com {
    root * /var/www/html
    file_server
    tls {
        alpn h3
    }
}


Vérifiez que votre serveur supporte HTTP/3 et que les ports UDP nécessaires sont ouverts.

Load Balancing

Pour gérer un trafic important, vous pouvez configurer Caddy en tant que load balancer :

example.com {
    reverse_proxy {
        to backend1:8080 backend2:8080 backend3:8080
        lb_policy round_robin
    }
}

Optimisation des logs

example.com {
    root * /var/www/html
    file_server
    log {
        output file /var/log/caddy/access.log {
            roll_size 50mb
            roll_keep 5
            roll_keep_for 48h
        }
        level INFO
    }
}

En appliquant ces techniques de gestion et d’optimisation des performances, vous pouvez garantir que votre serveur Caddy fonctionne efficacement et reste performant même sous des charges élevées. Dans la prochaine section, je conclurai notre exploration de Caddy et résumerai les points clés abordés.

Conclusion

Au fil de ce billet, j’ai détaillé les nombreuses fonctionnalités et avantages qu’offre Caddy en tant que serveur web moderne et performant. Nous avons exploré son historique, ses concepts clés et ses fonctionnalités principales telles que la gestion automatique des certificats SSL/TLS, la flexibilité du fichier de configuration Caddyfile et l’utilisation de plugins pour étendre ses capacités.

En conclusion, Caddy se positionne comme un choix robuste et flexible pour la gestion des serveurs web. Grâce à ses fonctionnalités intégrées et à son extensibilité, il offre une solution complète pour déployer et gérer des sites web sécurisés et performants. J’espère que ce billet vous a aidé à mieux comprendre les avantages de Caddy et comment l’utiliser efficacement dans vos projets.

Caddy

Set Up a CrowdSec Using OPNsense LAPI on Caddy

Prepare the OPNsense CrowdSec Configuration

Before setting up the Caddy reverse proxy, some settings for CrowdSec and firewall rules can be configured in OPNsense to prepare for a CrowdSec multi-server environment.

Update the Existing CrowdSec Plugin Configuration

The first thing you can do is change your CrowdSec plugin settings in OPNsense to allow other CrowdSec agents/bouncers to use the LAPI (Local API) on OPNsense. By default, the LAPI on OPNsense only listens on localhost (127.0.0.1).

In this example, I am setting the IP address to be on the LAN interface of 192.168.1.1. You may wish to put it on a different interface.

1.webp

You will need to start/stop the CrowdSec plugin for changes to take effect.

Create API Key for Caddy CrowdSec Bouncer

To prepare for setting up the CrowdSec bouncer for Caddy in a later step, you will need an API key generated for the bouncer.

Log into your OPNsense system via SSH or the console and issue the following command to create an API key. You may use any name you wish in place of caddyDmz. I used that name since this will be for a Caddy instance on the DMZ network.

sudo cscli bouncers add caddy

You should see the API key in the console output. Copy/paste this key until it is needed later.

API key for 'caddy':

   xxxxxxxxxxxxxxxxxxxxxxx

Please keep this key since you will not be able to retrieve it!

Build Caddy with the Desired Modules

In order to use DNS challenges with Let’s Encrypt and to use a CrowdSec bouncer, you will need to a build a custom Caddy executable to extend the base functionality. Fortunately, the build process is easy with xcaddy since you can build a Caddy executable with a single command.

I will be using the Cloudflare module for Let’s Encrypt but you may use a different provider. Replace github.com/caddy-dns/cloudflare with a provider from the list found on GitHub.

xcaddy build \
    --with github.com/caddy-dns/cloudflare \
    --with github.com/hslatman/caddy-crowdsec-bouncer/crowdsec

Delete the old file and move the file to the /usr/bin/ folder:

sudo rm /usr/bin/caddy
sudo mv caddy /usr/bin/

You should be able to run the caddy executable to ensure it can be found on the path.

caddy version

Modify Caddyfile

In the configuration file, you will need to enter the Cloudflare API key used for editing DNS zones for the acme_dns cloudflare option.

In addition to the DNS API key, newer versions of Caddy (v2.8.0+) require you to enter an email address for ZeroSSL (Caddy uses both Let’s Encrypt and ZeroSSL for issuing certificates).

Then in a crowdsec block, you will need to enter the API key what was generated from OPNsense earlier. The URL is for the CrowdSec LAPI on OPNsense which is 192.168.1.1:8080.

These first two settings should be contained in the global settings block as shown below.

{
        email nicolas.lespinasse@vainsta.fr
        acme_dns cloudflare xxxxxxxxxxxxxxxxxxxxxxxx
        admin :2019
        metrics
        crowdsec {
                api_key xxxxxxxxxxxxxxxx
                api_url http://192.168.1.1:8080/
        }
}

panel.vainsta.fr {
        log {
                output file /var/log/caddy/panel-access.log {
                        roll_size 100mb
                        roll_keep 20
                        roll_keep_for 720h
                }
                format json
                level INFO
        }
        reverse_proxy https://192.168.1.4:444 {
                transport http {
                        tls_insecure_skip_verify
                }
        }
}

There are two additional CrowdSec bouncer options you may include.

If you wish for the bouncer to check the LAPI each time instead of caching the decisions in memory and polling the LAPI every 10 seconds by default, you can disable streaming by adding the disable_streaming option to the crowdsec block. Streaming decision information is more efficient if you have a lot of requests, but it is possible there will be a slight increase in delay when decisions on the LAPI have changed.

...
        crowdsec {
            ...
            disable_streaming
...

There is an option to enable “hard fails” if there is an issue connecting to the CrowdSec LAPI. This feature might be nice if you wish to prevent your services from being accessed if something is wrong with the LAPI since they will be unprotected by CrowdSec. Of course, that would negatively affect uptime, but it would make it very apparent something bad has happened.

I noticed it takes about 30 seconds to fail after the CrowdSec service is stopped in OPNsense. I was starting to wonder if this option was working properly, but I simply was not patient enough during my testing.

...
        crowdsec {
            ...
            enable_hard_fails
...

Press “Ctrl + O”, “Enter”, and “Ctrl + X” to save and close the Caddyfile.

Install CrowdSec Agent on Caddy Server

The CrowdSec bouncer is what will block connections to services behind the reverse proxy, but the Caddy server will need a CrowdSec agent installed so it can run the parsers and scenarios on the server. The agent sends the information to the LAPI on OPNsense to make decisions on blocking content. For a single CrowdSec instance, this usually occurs on the same system, but in a multi-server configuration, the CrowdSec agent and bouncer communicates with the LAPI on a different server (in this case, OPNsense).

Install CrowdSec using the following commands. Basically the next step is following the CrowdSec installation guide. It is very simple to install.

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec

The CrowdSec agent needs to be registered with OPNsense CrowdSec LAPI.

sudo cscli lapi register -u http://192.168.1.1:8080

Copy the default CrowdSec systemd file from /lib/systemd/system to /etc/systemd/system so customizations can be made to the service file.

sudo cp /lib/systemd/system/crowdsec.service /etc/systemd/system/crowdsec.service

Edit the /etc/systemd/system/crowdsec.service to add the -no-api flag to the end of the ExecStart command. This disables the LAPI on the Caddy server since it is not needed because the LAPI on OPNsense will be used instead (see CrowdSec’s multi-server configuration example).

[Unit]
Description=Crowdsec agent
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=notify
Environment=LC_ALL=C LANG=C
ExecStartPre=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -t -error
ExecStart=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -no-api
#ExecStartPost=/bin/sleep 0.1
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target

You will need to reload the systemd service since changes to the service was made.

sudo systemctl daemon-reload

Do not reload the CrowdSec service just yet because with the LAPI on the Caddy server disabled, CrowdSec will error on startup until you have validated the Caddy machine on OPNsense. CrowdSec will be unable to connect to the LAPI on OPNsense until validation occurs. When there is no reachable LAPI, the CrowdSec agent will fail to load.

Validate the Caddy Machine in OPNsense

While logged into OPNsense via SSH or the console, list the machines which have been registered or requesting to be registered:

sudo cscli machines list

You should see similar output to below. Notice the status of the machine 02a3nfadce4ez4b19zh582e0f68f72a4CX4EzFJ2Th4PNkj1 shows the “No” symbol under “Status”.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 Name                                               IP Address       Last Update            Status   Version                   Auth Type   Last Heartbeat 
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 localhost                                          192.168.1.1      2024-03-11T14:11:50Z   ✔️        v1.6.0-freebsd-4b8e6cd7   password    21s            
 02a3nfadce4ez4b19zh582e0f68f72a4CX4EzFJ2Th4PNkj1   192.168.1.2    2024-03-11T13:55:29Z   🚫                                  password    ⚠️ 16m42s       
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

To validate the machine, you can enter the following command.

sudo cscli machines validate 02a3nfadce4ez4b19zh582e0f68f72a4CX4EzFJ2Th4PNkj1

Add Collection(s) to CrowdSec Agent on the Caddy Server

To add extra Caddy-specific parsers, you can add the following collection to your CrowdSec installation on your Caddy server. The Caddy collection includes a Caddy log parser and basic HTTP protections.

While the Caddy log parser may only be beneficial if you are using Caddy as a web server instead of a reverse proxy, the included basic HTTP protections should be helpful to protect web apps that are behind the reverse proxy.

sudo cscli collections install crowdsecurity/caddy

If you are hosting a public service (which great care must be taken to address security), it may not be a bad idea to also include the HTTP DoS collection to help detect denial of service attacks.

Of course, you should test this does not interfere with the normal operation of your app/service. I also do not know if this would be beneficial if you are using a Cloudflare proxy which includes DDoS protection.

sudo cscli collections install crowdsecurity/http-dos

You may now finally restart the CrowdSec agent on the Caddy server.

sudo systemctl reload crowdsec

After reloading CrowdSec, you should check if it is running properly.

sudo systemctl status crowdsec