Installation d’un serveur Web complet (LAMP) sur votre Freebox Delta / Delta(s) avec FireWall  (UFW) + HTTPS  SSL 1.2, 1.3,  HTTP2.

Mémoire RAM ( compatible : Crucial 8Go / Crucial 16Go )

Pour toutes manipulations en électronique ayez les matériels suivants :
Multimètre / Testeur électrique / si vous avez besoin d’intervenir sur la carte électronique (Arduino / Raspberry / etc…) et de vérifier les contacts. 
Dragonne de mise à la terre  / Empêche la formation d’électricité statique dans les environnements secs, vous protège contre les parasites et Protège votre équipement des dommages statiques.

#1 Commençons par accéder à Freebox os. 
Pour cela taper dans votre navigateur l’adresse ci-dessous. 

https://mafreebox.free.fr ou https://192.168.0.254

Une fois sur l’interface “En mode invité”

#2 En cliquant sur FREE en bas à gauche et Connexion.

#3 Entrer votre mot de passe

#3 Le mode connecté va vous permettre d’accéder à toutes les fonctionnalités de Freebox OS. 

Free a activer une fonctionnalité pour sa Freebox Delta qui permet l’hébergement de Machines Virtuelles (en anglais : Virtual Machines – VMs). Les détails sur cette mise à jour sont disponibles sur le site de la Freebox.

Suite à cela, j’ai pensé qu’il était intéressant de migrer l’hébergement de mon site personnel sur mon propre serveur (Directement à la maison).

Une Freebox Delta

Avant de commencer, il faut d’abord une Freebox Delta 🙂 avec une VM opérationnelle.

VM installé sur votre Freebox

Debian logo

J’ai choisi une VM avec Debian. Pour la suite, vous pouvez choisir n’importe quelle distribution Linux ca sera identique.

En ce qui concerne l’installation d’une VM sur la Freebox, je vous renvoie sur mon tutoriel.

Mise en Place du serveur Web.

1 – Tutoriel – Installation d’Apache, PHP et MYSQL sur Freebox Delta via une Machine Virtuelle

Installez le serveur Apache.

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install apache2

Installez le support PHP et MYSQL sur le serveur Apache.

sudo apt-get install libapache2-mod-php php-mysql
Modifiez le fichier de configuration Apache.
sudo nano /etc/apache2/mods-enabled/dir.conf

Voici le fichier, avant notre configuration.

<IfModule mod_dir.c>  
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm 
</IfModule>

Voici le fichier, après notre configuration.

<IfModule mod_dir.c> 
 DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm 
</IfModule>

Redémarrez le service Apache.

sudo service apache2 restart

Dans notre exemple, la version PHP 7.4 a été installée sur le serveur Apache.

Créez un fichier pour tester l’installation de PHP.

sudo nano /var/www/html/test.php

Voici le contenu du fichier.

<?php 
phpinfo();
?>

Ouvrez le navigateur et accédez à la page de test PHP.Dans notre exemple, l’URL suivante a été saisie dans le navigateur http://192.168.0.17/test.php
Le serveur Apache affichera les informations PHP.

Félicitations l’étape 1 est réalisée ! Vous avez installé Apache et PHP sur Ubuntu Linux

2 - Tutoriel Apache - Installation de MYSQL

Installez le serveur MYSQL.

sudo apt-get update
sudo apt-get install mariadb-server mariadb-client

Accédez à la ligne de commande MySQL.

sudo mysql -u root -p
Le compte ROOT MySQL n’a pas de mot de passe configuré.

Configurez le compte ROOT pour utiliser le plugin nommé MYSQL_NATIVE_PASSWORD.

ALTER USER root@localhost IDENTIFIED WITH mysql_native_password;
Configurez un mot de passe pour le compte ROOT du service MySQL.
ALTER USER root@localhost IDENTIFIED BY 'PASSWORD123';

Dans notre exemple, le mot de passe configuré était PASSWORD123.
Enregistrez votre configuration et quittez.

FLUSH PRIVILEGES;
exit;
Essayez d’accéder au service MySQL à l’aide du compte ROOT et du nouveau mot de passe.
mysql -u root -p
Vérifiez le plug-in d’authentification et le mot de passe configuré pour le compte utilisateur ROOT.
select Host,User,authentication_string,plugin from mysql.user;
Voici la sortie de la commande :
 
 exit;

Modifier les droits d’accès au dossier www

 sudo chown -R user:www-data /var/www/

Remplacer “user” Par votre id

Félicitations l’étape 2 est réalisée ! Vous avez correctement installé le service MySQL sur le serveur Apache.

 
 

 

 

3- Installer PHPMyAdmin pour gérer plus facilement votre base de donnée.

 sudo apt-get install phpmyadmin

Suivez les instruction d’installation de PhpMyAdmin par défaut.

Ensuite, on va se connecter à l’instance MySQL/MariaDB pour donner les droits sur cette base de données à l’utilisateur “icrea35” :

mysql -u root -p

Une fois connecté avec le prompt “mysql>” à l’écran, exécutez les requêtes SQL suivantes :

CREATE USER 'iCrea35'@'localhost' IDENTIFIED BY 'MotdePasseComplexe';
GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'iCrea35'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Les informations (utilisateur ‘icrea35’ et mot de passe ‘MotdePasseComplexe) doivent correspondre aux valeurs définies dans le fichier de configuration.

Création d’un admin pour PhpMyAdmin

Nous allons profiter d’être connecté à la console MySQL pour créer un nouveau compte administrateur qui aura la main sur l’ensemble des bases de données. Nous utiliserons ce compte pour se connecter à PhpMyAdmin.

Voici les requêtes SQL à exécuter pour créer un utilisateur nommé “icrea35-admin” avec le mot de passe “MotdePasseComplexe2“.

CREATE USER 'iCrea35-admin'@'localhost' IDENTIFIED BY 'MotdePasseComplexe2';
GRANT ALL PRIVILEGES ON *.* TO 'iCrea35-admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Contrairement à l’utilisateur précédent, celui-ci a les droits sur toutes les BDD de l’instant MySQL, d’où le “*.*” dans la requête GRANT.

Intégration de PhpMyAdmin à Apache

PhpMyAdmin est installé et configuré mais il nous manque une étape cruciale : la publication de l’application via Apache afin de pouvoir y accéder avec un navigateur.

Nous allons créer un fichier de configuration propre à PhpMyAdmin :

sudo nano /etc/apache2/conf-available/phpmyadmin.conf

le code par defaut

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php

# limit libapache2-mod-php to files and directories necessary by pma
<IfModule mod_php7.c>
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/usr/share/doc/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/:/>
</IfModule>

# PHP 8+
<IfModule mod_php.c>
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/usr/share/doc/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/:/>
</IfModule>

</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
Require all denied
</Directory>

 

Voici le contenu à intégrer au fichier de configuration (peut-être adapté) :

Alias /PmA /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
  Options SymLinksIfOwnerMatch
  DirectoryIndex index.php

  # Autoriser accès depuis certaines adresses IP / sous-réseau
  Order deny,allow
  Deny from all
  Allow from 192.168.0.0/24

  <IfModule mod_php.c>
    <IfModule mod_mime.c>
      AddType application/x-httpd-php .php
    </IfModule>
    <FilesMatch ".+\.php$">
      SetHandler application/x-httpd-php
    </FilesMatch>

    php_value include_path .
    php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
    
    php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
    
    php_admin_value mbstring.func_overload 0
  </IfModule>

</Directory>

# Désactiver accès web sur certains dossiers
<Directory /usr/share/phpmyadmin/templates>
  Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
  Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
  Require all denied
</Directory>

Quelques explications :

  • En ajoutant « Alias /PmA /usr/share/phpmyadmin » dans la configuration d’Apache, vous indiquez qu’il faudra ajouter « /PmA » à la fin de l’URL pour accéder à PhpMyAdmin. Vous pouvez utiliser un autre mot, mais il est conseillé de ne pas utiliser « phpmyadmin » pour éviter d’être trop évident. Cela est particulièrement important si votre PhpMyAdmin est accessible en mode public, car des robots effectuent des scans sur le web à la recherche d’interfaces PhpMyAdmin.
  • On bloque l’accès aux dossiers “templates”, “libraries” et “setup/lib”.
  • On limite l’accès à PhpMyAdmin aux seuls hôtes connectés au LAN « 192.168.1.0/24 », car dans cet exemple, PhpMyAdmin n’est pas accessible publiquement. Il est recommandé de limiter l’accès autant que possible. Pour retirer cette restriction, il suffit de supprimer les trois lignes correspondantes sous « Autoriser l’accès depuis certaines adresses IP / sous-réseau ». Nous verrons prochainement comment accéder à la base de données MySQL depuis l’extérieur, même avec les restrictions mises en place, en utilisant le VPN de FreeboxOS, dans un prochain tutoriel.

Enregistrez le fichier et activez ce fichier de config :

sudo a2enconf phpmyadmin.conf

Validez la configuration, et si c’est OK rechargez Apache :

sudo apachectl configtest

et si c’est OK rechargez Apache :

sudo systemctl reload apache2

Le moment est venu de tester l’accès à PhpMyAdmin !

Accéder à PhpMyAdmin

Ouvrez un navigateur et accédez à l’adresse suivante :

http://<ip-du-serveur>/PmA

Je vous rappelle que la valeur « PmA » dépend de l’alias défini précédemment dans la configuration d’Apache. Lorsque vous accédez à cette adresse, vous arriverez sur une page de connexion, où vous devrez vous connecter avec le compte « iCrea35-admin » créé précédemment.

Félicitations l’étape 3 est réalisée !

4- Tutoriel Apache - Désactiver la liste des fichiers de tout les répertoires

Désactivez le module Apache responsable de la liste des répertoires.

sudo a2dismod --force autoindex
Redémarrez le service Apache.
sudo service apache2 restart
À titre de test, créez un répertoire sans fichier d’index.
mkdir /var/www/html/essais
echo essais1 > /var/www/html/essais/essais1.txt
echo essais2 > /var/www/html/essais/essais2.txt
Essayez d’accéder au répertoire sans le fichier d’index.
curl -I http://<ip-du-serveur>/essais/

Voici la sortie de la commande

HTTP/1.1 404 Not Found
Date: Thu, 19 Jan 2023 23:38:49 GMT
Server: Apache/2.4.54 (Debian)
Content-Type: text/html; charset=iso-8859-1

Félicitations l’étape 4 est réalisée !

5- Tutoriel Apache - Désactiver la signature du serveur

Vérifiez la version Apache configuré et qui s’affiche.

curl -v --silent http://127.0.0.1/notest.html --stderr - | grep address | cut -d ">" -f 2 | cut -d "<" -f 1
 

Voici la sortie de la commande.

Apache/2.4.54 (Debian) Server at 127.0.0.1 Port 80
Vérifiez l’en-tête Apache.
curl -I http://127.0.0.1/notest.html  --stderr - | grep -i server
Voici la sortie de la commande.
server: Apache/2.4.54 (Debian)
Modifiez le fichier de configuration Apache.
sudo nano /etc/apache2/conf-available/security.conf
Voici le fichier, avant notre configuration.
ServerTokens OS
ServerSignature On
TraceEnable Off
Voici le fichier, après notre configuration.
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Redémarrez le service Apache.
sudo service apache2 restart
L’en-tête Apache n’affichera que les informations de base.
Server: Apache

Ci-dessous l’en-tête Apache configuré par defaut, il affiche le minimum d’informations. Mais déjà trop d’information pour un Hacker. 

Dans notre cas, nous avons désactivé l’en-tête de signature du serveur Apache. dont voici le résultat. Ceci supprimera les information de version et donc évitera de mettre les hacker sur la piste de ce que vous utilisez.

Félicitations l’étape 5 est réalisée ! Vous avez terminé la configuration de l’en-tête Apache.

Installation de UFW, le Firewall pour sécuriser votre serveur !

Sur Débian, UFW n’est pas pré-installé. il suffit d’installer le paquet ufw. en suivant les étapes ci-dessous
sudo apt-get install ufw
A ce stade, IFW est installé mais n’est pas activé. Nous allons vérifier l’état du firewall grâce à la commande status :
sudo ufw status verbose
  • status permet de savoir si le pare-feu est activé ou désactivé,
  • logging permet de connaitre le niveau de traçabilité de ce que l’on trouvera dans/var/log/ufw.log
  • default permet de savoir si par défaut (en l’absence de règle), on autorise ou refuse toutes connexions entrantes ou sortantes
La première chose à faire est de configurer les règles par défaut. Nous définissons que toutes connexions entrantes et sortantes sont bloquées. En effet, nous vous conseillons d’appliquer le principe de blacklist,c’est à dire de tout bloquer puis d’autoriser au cas par cas les services nécessaires.
sudo ufw default deny incoming
sudo ufw default deny outgoing
Autorisons les connexions au serveur web. Pour cela, nous devons autoriser les connexions entrantes (IN) vers le port 80 (HTTP) et 443 (HTTPS)
sudo ufw allow in 80/tcp
sudo ufw allow in 443/tcp
En plus de spécifier le port pour les connexions entrantes, vous pouvez également choisir le protocole de transport des paquets. Le choix entre TCP ou UDP dépend du type de service. Les services qui peuvent tolérer des pertes de données utilisent généralement UDP (comme la téléphonie, la vidéo, les jeux en ligne, etc.) tandis que les services qui doivent garantir l’intégrité des données utilisent TCP (comme le web, les e-mails, etc.). Vous vous en doutez surement mais votre serveur a également besoin d’accéder à internet en HTTP ou HTTPS. Il peut avoir besoin de contacter un webservice, de télécharger des fichiers ou simplement de se mettre à jour. Il faut donc autoriser le serveur à sortir (OUT) vers Internet :
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
Actuellement connecté à votre serveur en SSH. Une connexion SSH vous permet d’exécuter des commandes à distance, de monter des tunnels ou d’envoyer des fichier en SFTP. Nous allons donc autoriser le SSH(22) en entrant
sudo ufw allow in 22/tcp
Votre serveur aura également besoin d’envoyer des emails. Il ne pourra toutefois pas recevoir de mails ou être utilisé comme relai. Nous pouvons donc autoriser les connexions SMTP (25) sortantes uniquement
sudo ufw allow out 25/tcp
Comme tous les serveurs, votre serveur va avoir besoin de résoudre des noms de domaine, c’est à dire de convertir un nom de domaine en adresse IP.  Nous devons donc autoriser la connexion sortante en DNS (53)
sudo ufw allow out 53/udp
Vous aurez remarqué que nous n’avons pas ouvert le port de MySQL. En effet, notre serveur de base de données doit être joignable localement par PHP qui est sur le même serveur mais ne doit pas être exposé sur internet. Étant donné que nous avons bloqué tous les ports par défaut, il se retrouve protégé sans règle particulière. Vous pourrez toutefois vous connecter à votre serveur MySQL depuis l’extérieur avec un VPN que l’on configurera un peu plus tard dans le tutoriel et grâce à lui vous serez connecter sur votre réseaux local à distance et ainsi depuis votre ordinateur en utilisant votre connexion SSH vous pourrez vous connecter a votre base MySQL. Notre configuration initiale étant terminée, nous pouvons maintenant activer le firewall
sudo ufw enable
Vérifions maintenant notre paramétrage
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), disabled (routed)
New profiles: skip
To                         Action      From
--                         ------      ----
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp                     ALLOW IN    Anywhere 
80/tcp                     ALLOW IN    Anywhere (v6)
443/tcp                    ALLOW IN    Anywhere (v6)
22/tcp                     ALLOW IN    Anywhere (v6)

80/tcp                     ALLOW OUT   Anywhere
443/tcp                    ALLOW OUT   Anywhere
25/tcp                     ALLOW OUT   Anywhere
53/udp                     ALLOW OUT   Anywhere
80/tcp                     ALLOW OUT   Anywhere (v6)
443/tcp                    ALLOW OUT   Anywhere (v6)
25/tcp                     ALLOW OUT   Anywhere (v6)
53/udp                     ALLOW OUT   Anywhere (v6)

Comment protéger les ports ouverts ?

Nous avons réussi à fermer tous les ports pouvant donner accès à des services ne nécessitant d’être exposés sur internet. Maintenant, regardons comment améliorer la sécurité des ports ouverts surtout le port 22 (SSH). UFW permet de limiter les tentatives de connexion, prenons l’exemple du SSH. De manière très simple, nous pouvons activer un quota de connexion SSH.
sudo ufw limit 22/tcp comment 'Autorise 6 connexions sur 30 secondes'
[FALCUTATIF]  UFW permet également de restreindre un port à certaines IPs. Nous pouvons donc imaginer que seulement quelques adresses IP aient accès à la connexion SSH. Supprimons la règle qui ouvrait SSH pour tout le monde et spécifions une plage d’adresse IP autorisée.
sudo ufw delete allow in 22/tcp
sudo ufw allow from 192.168.0.0 to any port 22

Félicitations l’étape 6  est réalisée !

Apache Let’s Encrypt - installation OpenSLL

Installez le serveur Apache et les paquets requis.

 sudo apt-get update
 sudo apt-get install apache2 openssl

Normalement si vous avez suivie toutes les étapes précédente le module openssl est déjà installer et vous aurez ceci.

apache2 is already the newest version (2.4.54-1~deb11u1).
openssl is already the newest version (1.1.1n-0+deb11u3+rpt1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Activez le module Apache nommé : Mod_ssl.

sudo a2enmod ssl

Activez le module Apache nommé : Mod_rewrite

sudo a2enmod rewrite
Modifiez le fichier de configuration Apache.
sudo nano /etc/apache2/apache2.conf

Ajoutez les lignes suivantes à la fin de ce fichier.

<Directory /var/www/html>
AllowOverride All
</Directory>
Créez une clé privée et le certificat du site Web à l’aide de la commande OpenSSL
sudo mkdir /etc/apache2/certificate
cd /etc/apache2/certificate
sudo openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out apache-certificate.crt -keyout apache.key
Entrée les informations demandées
Generating a RSA private key
............++++
.......................................................++++
writing new private key to 'apache.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:BRETAGNE
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]: ICREA35
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: 123.123.123.123
Email Address []:

Sur l’option nommée COMMON_NAME, vous devez entrer l’adresse IP ou le nom d’hôte.
Dans notre exemple, nous avons utilisé l’adresse IP 123.123.123.123

Modifiez le fichier de configuration Apache pour le site Web par défaut.

sudo nano /etc/apache2/sites-enabled/000-default.conf

Voici le fichier, avant notre configuration.

<VirtualHost *:80> ServerAdmin webmaster@localhost 
     DocumentRoot /var/www/html 
     ErrorLog ${APACHE_LOG_DIR}/error.log 
     CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Voici le fichier, après notre configuration.
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/certificate/apache-certificate.crt
SSLCertificateKeyFile /etc/apache2/certificate/apache.key
</VirtualHost>
Vous pouvez éventuellement rediriger les utilisateurs HTTP vers la version HTTPS de votre site Web.
Dans ce cas, utilisez la configuration suivante.
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
</virtualhost>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/certificate/apache-certificate.crt
SSLCertificateKeyFile /etc/apache2/certificate/apache.key
</VirtualHost>
Redémarrez le service Apache.
sudo service apache2 restart

Ouvrez votre navigateur et accédez à la version HTTPS de votre site Web.
Dans notre exemple, l’URL suivante a été saisie dans le navigateur :
• https://<votre_IP>
Le serveur Apache affichera la version HTTPS de votre site Web.

Félicitations l’étape 7 est réalisée !

Apache Let’s Encrypt - Configuration DNS

[A partir de cette étape vous devez posséder votre nom de domaine]
si vous en avez pas, je vous conseil d’accédez au site Web de ONLINE.NET (Scaleway DEDIBOX) site du Groupe Iliad qui gère Free et achetez un nom de domaine DNS. il les propose à un prix intéressant.

Dans notre exemple, nous avons acheté un domaine nommé : test.icrea35.fr

Vous pouvez utiliser n’importe quel site Web pour acheter un domaine DNS, ONLINE.NET est juste mon choix personnel.

Créez une entrée DNS pointant votre site Web vers l’ordinateur exécutant Apache.
Dans notre exemple, nous avons créé une entrée DNS pointant TEST.ICREA35.FR à Vers l’ipV6 du serveur qui héberge le serveur Apache. 

redirectionDNSTESTicrea35

Utilisez la commande NSLOOKUP pour tester votre configuration DNS.

sudo apt-get update
sudo apt-get install dnsutils
nslookup test.icrea35.fr
Félicitations l’étape 8  est réalisée ! Vous avez terminé la configuration DNS requise.
 
 

 

 

Tutoriel Let’s Encrypt - Installation d’Apache

Installez le serveur Apache et les paquets requis.

sudo apt-get update
sudo apt-get install apache2 openssl

Activez le module Apache nommé : Mod_ssl.
Activez le module Apache nommé : Mod_rewrite.

sudo a2enmod ssl
sudo a2enmod rewrite

Modifiez le fichier de configuration Apache.

sudo nano /etc/apache2/apache2.conf

Ajoutez les lignes suivantes à la fin de ce fichier.

<Directory /var/www/html>
AllowOverride All
</Directory>

Créez des répertoires pour stocker les nouveaux fichiers et journaux du site Web.

sudo mkdir /websites/icrea35/www -p
sudo mkdir /websites/icrea35/logs -p
sudo chown www-data:www-data /websites/icrea35 -R

Les fichiers du site Web seront stockés dans le répertoire suivant:

/websites/icrea35/www

Les journaux du site Web seront stockés dans le répertoire suivant:

/websites/icrea35/logs

Créez un fichier de configuration Apache pour le nouveau site Web.

sudo nano /etc/apache2/sites-available/icrea35.conf

Voici le fichier avec notre configuration.

<VirtualHost *:80>
ServerAdmin webmaster@loaclhost
DocumentRoot /websites/icrea35/www
ServerName test.icrea35.fr

<Directory /websites/icrea35/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

ErrorLog /websites/icrea35/logs/error.log
CustomLog /websites/icrea35/logs/access.log combined
LogLevel error
</VirtualHost>

Activez le nouveau site Web.

sudo a2ensite icrea35.conf

Redémarrez le service Apache.

sudo service apache2 restart

Ouvrez votre navigateur et essayez d’accéder à la version HTTP du site Web.
Dans notre exemple, l’URL suivante a été saisie dans le navigateur :
• http://test.icrea35.fr

Vous avez terminé la configuration de l’hôte virtuel sur le serveur Apache.

Apache Let’s Encrypt - Installation du certificat

Nous allons installer un certificat SSL gratuit fourni par let’s encrypt.
Nous devons également rediriger automatiquement tout le trafic HTTP vers la version HTTPS du site Web nous l’avion fait précédemment mais sans certificat SSL .

Installez la liste des packages requis.

sudo apt-get update
sudo apt-get install certbot python3-certbot-apache

Installer le certificat ssl gratuit Apache

sudo certbot --apache -d test.icrea35.fr

• Entrer votre adresse mail quand il vous le demande et valider avec la touche (entrer).
• Appuyez sur (Y) pour partager votre e-mail et recevoir des newsletters.
• Appuyez sur (Y) pour rediriger automatiquement votre site Web HTTP vers la version HTTPS.

If you really want to skip this, you can run the client with
--register-unsafely-without-email but you will then be unable to receive notice
about impending expiration or revocation of your certificates or problems with
your Certbot installation that will lead to failure to renew.

Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): votre_email@mail.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for test.icrea35.fr
Performing the following challenges:
http-01 challenge for test.icrea35.fr
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/icrea35-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/icrea35-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/icrea35-le-ssl.conf
Redirecting vhost in /etc/apache2/sites-enabled/icrea35.conf to ssl vhost in /etc/apache2/sites-available/icrea35-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://test.icrea35.fr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Subscribe to the EFF mailing list (email: votre_email@mail.com).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/test.icrea35.fr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/test.icrea35.fr/privkey.pem
   Your certificate will expire on 2023-04-23. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again with the "certonly" option. To non-interactively
   renew *all* of your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Le système installera automatiquement un certificat gratuit.

Il configurera également le serveur Apache pour rediriger tous les accès HTTP vers la version HTTPS de votre site Web.

Dans notre exemple, le système a créé un fichier de configuration d’hôte virtuel.

/etc/apache2/sites-available/icrea35-le-ssl.conf

Voici le contenu du fichier.

<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /websites/icrea35/www
ServerName test.icrea35.fr
<Directory /websites/icrea35/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

ErrorLog /websites/icrea35/logs/error.log
CustomLog /websites/icrea35/logs/access.log combined
LogLevel error

SSLCertificateFile /etc/letsencrypt/live/test.icrea35.fr/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test.icrea35.fr/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

On vérifie en se connectant sur test.icrea35.fr

On obtient bien un petit cadenas devant l’adresse web et si on clique dessus ça nous informe bien que le site est sécurisé. 


Le fichier KEY contient votre clé privée de certificat et doit être conservé dans un endroit sûr tout le temps.
Dans notre exemple, le fichier KEY a été stocké dans :

/etc/letsencrypt/live/test.icrea35.fr/privkey.pem

Le système modifie automatiquement le fichier de configuration de l’hôte virtuel Apache d’origine.
Il redirigera automatiquement toutes les requêtes HTTP vers la version HTTPS de votre site Web.
Félicitation ! Vous venez d’installé votre certificat Let’s Encrypt sur le serveur Apache.

Apache Let’s Encrypt - Renouvellement de certificat

Sachant que le certificat gratuit installé est valable 90 jours.

Nous allons crée une tâche planifiée pour renouveler automatiquement tout certificat dans les trente jours suivant son expiration. Ainsi vous aurez pas a vous souciez de cela.

Le nom de la tâche planifiée est CERTBOT et se trouve dans le fichier suivant :

sudo nano crontab -e

Voici le contenu du fichier.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

Utilisez la commande suivante pour simuler le processus de renouvellement de certificat.

sudo certbot renew --dry-run

Voici la sortie de la commande.

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/test.icrea35.fr.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Simulating renewal of an existing certificate for test.icrea35.fr
Performing the following challenges:
http-01 challenge for test.icrea35.fr
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/test.icrea35.fr/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/test.icrea35.fr/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Félicitations! Vous avez configuré le renouvellement automatique du certificat Let’s Encrypt.

Apache - Activer et installer HTTP2

Installez le serveur Apache avec le support HTTP2 et PHP.
sudo apt-get update
sudo apt-get install apache2 php-fpm
Activez les modules et les fichiers de configuration requis.
sudo a2enmod proxy_fcgi
sudo a2enconf php7.4-fpm
sudo a2enmod proxy_fcgi
Si PHP était installé dans votre installation Apache, vous devez désactiver le module PHP Apache standard.
sudo a2dismod php7.4
Activez le nouveau module PHP. Désactivez le MPM Apache par défaut. Activez le nouveau MPM Apache.
sudo a2dismod mpm_prefork
sudo a2dismod mpm_worker
sudo a2enmod mpm_event
Apache 2 a introduit des modules multi-traitement ou MPM. Les MPM modifient la façon dont Apache gère les demandes des clients. Activez le module Apache HTTP2.
 sudo a2enmod http2
Modifiez le fichier de configuration Apache.
sudo nano /etc/apache2/apache2.conf
Activez la prise en charge de HTTP2 sur Apache en ajoutant la ligne suivante à la fin du fichier de configuration.
Protocols h2 http/1.1
Redémarrez le service PHP-FPM.
sudo service php7.4-fpm status
Redémarrez le service Apache.
sudo service apache2 restart
Vous avez terminé l’installation de HTTP2 sur Apache. Maintenant, nous allons tester si notre installation Apache prend vraiment en charge HTTP2. Installez le logiciel requis pour tester la prise en charge d’Apache HTTP/2.
sudo apt-get update
sudo apt-get install wget curl
Utilisez la commande suivante pour tester la prise en charge d’Apache HTTP2 à l’aide de WGET. Gardez à l’esprit que vous devez changer test.icrea35.fr à l’adresse IP de votre serveur.
sudo wget -S http://test.icrea35.fr/
Voici la sortie de la commande.
HTTP request sent, awaiting response...
  HTTP/1.1 301 Moved Permanently
  Date: Mon, 23 Jan 2023 09:56:15 GMT
  Server: Apache/2.4.54 (Debian)
  Location: https://test.icrea35.fr/
  Content-Length: 232
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: text/html; charset=iso-8859-1
Location: https://test.icrea35.fr/ [following]
--2023-01-23 10:56:15--  https://test.icrea35.fr/
Connecting to test.icrea35.fr (test.icrea35.fr)|2a01:e34:0000:0000:0000:0000:000:0000|:443... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 200 OK
  Date: Mon, 23 Jan 2023 09:56:15 GMT
  Server: Apache/2.4.54 (Debian)
  Upgrade: h2,h2c
  Connection: Upgrade, Keep-Alive
  Vary: Accept-Encoding
  Keep-Alive: timeout=5, max=100
  Transfer-Encoding: chunked
  Content-Type: text/html; charset=UTF-8
Length: unspecified [text/html]
Saving to: ‘index.html’
Si vous avez la ligne upgrade: h2, H2c c’est que le http2 est fonctionnel sur votre serveur. Félicitations, vous avez testé avec succès le support HTTP2 sur Apache.