Auteur Sujet: Base: Installation et sécurisation d'Apache2  (Lu 6834 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« le: 14 octobre 2021 à 09:16:47 »
Le logiciel libre Apache HTTP Server est un des serveurs HTTP les plus populaire. Il est créé et maintenu au sein de la fondation Apache depuis 1995.

C'est un tutoriel qui sert de base pour d'autres tutoriels présent ici.




Tutoriel testé avec Ubuntu version 20.04 et 22.04

Pré-requis :
- Base: Installation et sécurisation d'un serveur Ubuntu

Le mpm prefork d'Apache n'est pas optimal pour les performances. Mon tutoriel se concentre donc sur le mpm event.




1/ Installation d'Apache

Deux possibilités : installer ou pas PHP. Merci de ne  suivre que la partie qui vous concerne
sudo -s : On passe en root, toutes les commandes nécessitent d'être super-utilisateur.




Section pour l'installation d'Apache sans PHP (Apache mpm event avec http/2) :
apt install apache2 apache2-utils ssl-cert
Poursuivre directe à la partie "Suite du tutoriel, commun avec ou sans PHP"




Section pour l'installation d'Apache avec PHP mode FastCGI + Apache (mpm event avec http/2) :
apt install apache2 php-fpm apache2-utils ssl-cert

Attention : Dans le cas où libapache2-mod-php a été précédemment installé, il faut faire une petite manipulation pour désactiver le php intégré à Apache pour changer de mpm :
a2dismod php7.2 php7.4 php8.1 (Il faut désactiver php pour désactiver mpm_prefork. La ligne de commande va retourner des erreurs, c'est normal, car j'ai spécifié plusieurs versions de PHP pour fonctionner sur plusieurs versions d'Ubuntu) puis a2dismod mpm_prefork ; a2enmod mpm_event setenvif

Activation de PHP-FPM : (FPM pour FastCGI Process Manager)
Ubuntu 22.04 :
a2enmod proxy_fcgi (fournit le support du protocole FastCGI pour PHP-FPM)
systemctl start php8.1-fpm (pour le démarrer immédiatement)
systemctl enable php8.1-fpm (pour le démarrer au démarrage du serveur)
a2enconf php8.1-fpm
Ubuntu 20.04 :
a2enmod proxy_fcgi (fournit le support du protocole FastCGI pour PHP-FPM)
systemctl start php7.4-fpm (pour le démarrer immédiatement)
systemctl enable php7.4-fpm (pour le démarrer au démarrage du serveur)
a2enconf php7.4-fpm

Configuration de php.ini : On se déplace dans le dossier de PHP-FPM :
- Pour PHP 8.1 (Ubuntu 22.04 LTS ): cd /etc/php/8.1/fpm/
- Pour PHP 7.4 (Ubuntu 20.04 LTS ): cd /etc/php/7.4/fpm/
- Pour PHP 7.2 (Ubuntu 18.04 LTS ): cd /etc/php/7.2/fpm/

1/ Augmentation de la limite mémoire de 128 à 256 Mo : sed -i -e "s/memory_limit = 128M/memory_limit = 256M/g" php.ini
2/ Augmentation du post_max_size de 8Mo à 8 Go : sed -i -e "s/post_max_size = 8M/post_max_size = 8000M/g" php.ini
3/ Augmentation du upload_max_filesize de 2Mo à 6 Go : sed -i -e "s/upload_max_filesize = 2M/upload_max_filesize = 6000M/g" php.ini
4/ Configuration du date.timezone : sed -i -e "s/;date.timezone =/date.timezone = \"Europe\/Paris\"/g" php.ini
5/ Configuration du date.timezone : sed -i -e "s/;date.default_latitude = 31.7667/date.default_latitude = 48.8534/g" php.ini
6/ Configuration du date.timezone : sed -i -e "s/;date.default_longitude = 35.2333/date.default_longitude = 2.3488/g" php.ini

Vérification des 6 modifications : grep -e memory_limit -e post_max_size -e upload_max_filesize -e "date.timezone =" -e date.default_latitude -e date.default_longitude php.ini

memory_limit = 256M
post_max_size = 8000M
upload_max_filesize = 6000M
date.timezone = "Europe/Paris"
date.default_latitude = 48.8534
date.default_longitude = 2.3488

Configuration de pool.d/www.conf :
1/ sed -i -e "s/pm.max_children = 5/pm.max_children = 40/g" pool.d/www.conf
2/ sed -i -e "s/pm.start_servers = 2/pm.start_servers = 6/g" pool.d/www.conf
3/ sed -i -e "s/pm.min_spare_servers = 1/pm.min_spare_servers = 3/g" pool.d/www.conf
4/ sed -i -e "s/pm.max_spare_servers = 3/pm.max_spare_servers = 9/g" pool.d/www.conf
5/ sed -i -e "s/;pm.max_requests = 500/pm.max_requests = 500/g" pool.d/www.conf
6/ sed -i -e "s/;request_terminate_timeout = 0/request_terminate_timeout = 60s/g" pool.d/www.conf

Vérification des 6 modifications : grep -e "pm.max_children =" -e "pm.start_servers =" -e "pm.min_spare_servers =" -e "pm.max_spare_servers =" -e "pm.max_requests =" -e "request_terminate_timeout =" pool.d/www.conf

pm.max_children = 40
pm.start_servers = 6
pm.min_spare_servers = 3
pm.max_spare_servers = 9
pm.max_requests = 500
request_terminate_timeout = 60s

Redémarrer PHP-FPM :
- Pour PHP 8.1 (Ubuntu 22.04 LTS ): systemctl restart php8.1-fpm
- Pour PHP 7.4 (Ubuntu 20.04 LTS ): systemctl restart php7.4-fpm
- Pour PHP 7.2 (Ubuntu 18.04 LTS ): systemctl restart php7.2-fpm

Dans le cas où libapache2-mod-php a été précédemment installé, il faut le supprimer :
apt purge libapache2-mod-php libapache2-mod-php7.2 libapache2-mod-php7.4 libapache2-mod-php8.1
apt autoremove
apt autoremove va supprimer le mod-php installé, par exemple libapache2-mod-php8.1 pour Ubuntu 22.04.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #1 le: 14 octobre 2021 à 09:18:23 »
2/ Suite du tutoriel, commun avec ou sans PHP :

a2enmod ssl : activation de TLS pour https
a2enmod http2 : activation d'http/2

Optimisation des buffers applicatifs (coté Apache2) pour HTTP/2
Il faut une cohérence avec les buffers configurés pour TCP sur le système d'exploitation pour ne pas avoir une dégradation des débits upload de fichiers vers le serveur web.
Rajouter H2WindowSize 33554432 et H2StreamMaxMemSize 33554432 dans le fichier de configuration de HTTP/2 :
nano /etc/apache2/mods-available/http2.conf

<IfModule !mpm_prefork>
    Protocols h2 h2c http/1.1
    H2WindowSize 33554432
    H2StreamMaxMemSize 33554432
</IfModule>

Configuration du MPM Event avec 2500 connexions maximum :
1/ sed -i -e "s/StartServers\t\t\t 2/StartServers\t\t\t 9\n\tServerLimit\t\t\t 100/g" /etc/apache2/mods-available/mpm_event.conf
2/ sed -i -e "s/MinSpareThreads\t\t 25/MinSpareThreads\t\t 145/g" /etc/apache2/mods-available/mpm_event.conf
3/ sed -i -e "s/MaxSpareThreads\t\t 75/MaxSpareThreads\t\t 435/g" /etc/apache2/mods-available/mpm_event.conf
4/ sed -i -e "s/ThreadLimit\t\t\t 64/ThreadLimit\t\t\t 25/g" /etc/apache2/mods-available/mpm_event.conf
5/ sed -i -e "s/MaxRequestWorkers\t  150/MaxRequestWorkers\t  2500\n\tAsyncRequestWorkerFactor\t 2\n\tGracefulShutdownTimeout\t\t 3600/g" /etc/apache2/mods-available/mpm_event.conf

Expliquer les choix réalisés dans cette configuration du MPM Event prend de la place, j'ai préféré le déplacer dans un PDF :
(cliquez sur la miniature ci-dessous - le document est au format PDF)


Vérification des 5 modifications : grep -e "StartServers" -e "ServerLimit" -e "MinSpareThreads" -e "MaxSpareThreads" -e "ThreadLimit" -e "ThreadsPerChild" -e "MaxRequestWorkers" -e "AsyncRequestWorkerFactor" -e "GracefulShutdownTimeout" -e "MaxConnectionsPerChild" /etc/apache2/mods-available/mpm_event.conf
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of requests a server process serves
StartServers 9
ServerLimit 100
MinSpareThreads 145
MaxSpareThreads 435
ThreadLimit 25
ThreadsPerChild 25
MaxRequestWorkers   2500
AsyncRequestWorkerFactor 2
GracefulShutdownTimeout 3600
MaxConnectionsPerChild   0
Si vous n'obtenez pas ce résultat, vous pouvez consulter ce fichier mpm_event.conf qui intègre la configuration.

systemctl restart apache2

Facultatif, pour certains usages uniquement :
- a2enmod headers (nécessaire pour pour tous les sites, sauf si c'est uniquement un test de débit)
- a2enmod socache_shmcb (nécessaire pour SSLStaplingCache avec shmcb, normalement, il est déjà activé)
- a2enmod rewrite (nécessaire la ré-écriture d'URL)




3/ Rajouter les types MIME (Multipurpose Internet Mail Extensions) pour les nouveaux formats d'images :

Nécessaire pour que les images (WebP et autres nouveaux formats d'images) s’affichent correctement, quand on fait "ouvrir l'image dans un nouvel onglet"). Sans cela, soit il affiche des hiéroglyphes (données brutes), soit il télécharge l'image (et affiche le file:// avec le lien vers l'image en local sur le PC).

Ubuntu 18.04 LTS et 20.04 LTS :
nano /etc/mime.types

copier / coller les lignes suivantes à la fin du fichier
image/webp webp
image/heif heif
image/heif-sequence heifs
image/avif avif hif
image/avif-sequence avifs
image/jxl jxl

Ubuntu 22.04 LTS :
nano /etc/mime.types

copier / coller les lignes suivantes à la fin du fichier
image/webp webp
image/avif-sequence avifs

Vérification : cat /etc/mime.types | grep -e "webp" -e "heif" -e "avif" -e "jxl" : Chaque type doit n'être listé qu'une seule fois.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #2 le: 14 octobre 2021 à 09:18:57 »
4/ Recommandation BCP-162 / RFC6302 : Rajouter le port source dans les log d'Apache2

cf BCP-162: logs, CGNat et cybercriminalité
nano /etc/apache2/conf-available/log-personnalise.conf : Création d'une configuration de log qui inclue le port source, appelé "combiport"

Copier / coller le texte ci-dessous dans le fichier :
# Customized log with display of TCP source port (%{remote}p) and the SSL protocol version (TLSv1.2, TLSv1.3) for https or "-" for http (%{SSL_PROTOCOL}x)
LogFormat "%h %{remote}p %{SSL_PROTOCOL}x %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combiport

a2enconf log-personnalise : Activation du fichier mis en place (il faut touefois appeler "combiport" lors du log)
sed -i -e "s/CustomLog \${APACHE_LOG_DIR}\/other_vhosts_access.log vhost_combined/CustomLog \${APACHE_LOG_DIR}\/other_vhosts_access.log vhost_combined/g" /etc/apache2/conf-available/other-vhosts-access-log.conf : configuration "combiport" pour ce fichier de log.

Exemple de log générés :

192.168.2.2 51020 - [10/May/2022:10:31:15 +0000] "GET /250Mi.iso HTTP/1.1" 200 262144279 "-" "curl/7.81.0"
192.168.2.2 40994 TLSv1.3 [10/May/2022:10:31:19 +0000] "GET /250Mi.iso HTTP/1.1" 200 262870026 "-" "curl/7.81.0"
192.168.2.2 40996 TLSv1.3 [10/May/2022:10:31:22 +0000] "GET /250Mi.iso HTTP/2.0" 200 262144209 "-" "curl/7.81.0"
192.168.1.3 50514 TLSv1.3 [10/May/2022:10:46:52 +0000] "GET / HTTP/2.0" 200 2078 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0"
Le port destination n'est pas présent dans les logs, mais on le récupère avec la version du protocole SSL. 3 cas sont possible :
  • - : c'est du http (donc le port 80)
  • TLSv1.2 : c'est du https (donc le port 443)
  • TLSv1.3 : c'est du https (donc le port 443)
La version du protocole SSL peut aider à séparer les requêtes inhabituelles de celles émanent de navigateurs web, tous avec TLS1.3 aujourd'hui.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #3 le: 14 octobre 2021 à 09:19:21 »
5/ Sécurisation d'Apache contre les attaques :

Activations des options du fichier security.conf :
1/ sed -i -e "8s/#<Directory \/>/<Directory \/>/" /etc/apache2/conf-available/security.conf
2/ sed -i -e "9s/#   AllowOverride None/   AllowOverride None/" /etc/apache2/conf-available/security.conf
3/ sed -i -e "10s/#   Require all denied/   Require all denied/" /etc/apache2/conf-available/security.conf
4/ sed -i -e "11s/#<\/Directory>/<\/Directory>/" /etc/apache2/conf-available/security.conf
5/ sed -i -e "s/ServerTokens OS/ServerTokens Prod/g" /etc/apache2/conf-available/security.conf
6/ sed -i -e "s/ServerSignature On/ServerSignature Off/g" /etc/apache2/conf-available/security.conf
Vérification : sed -e '/^#\|^$/d' /etc/apache2/conf-available/security.conf

<Directory />
   AllowOverride None
   Require all denied
</Directory>
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Si vous n'obtenez pas ce résultat, vous pouvez consulter ce fichier apache2-security.conf qui intègre la configuration.

Réduction des timeout :
1/ sed -i -e "s/Timeout 300/Timeout 30/g" /etc/apache2/apache2.conf : Réduction du timeout de 300 secondes à  30 secondes. C'est magique contre les attaques slow DDOS.
2/ sed -i -e "s/KeepAliveTimeout 5/KeepAliveTimeout 2/g" /etc/apache2/apache2.conf : Réduction du timeout KeepAlive de 5 secondes à 2 secondes
Vérification : sed -e '/^#\|^$/d' /etc/apache2/apache2.conf | grep -e Timeout Le retour doit être celui-ci :

Timeout 30
KeepAliveTimeout 2

Configuration du virtualhost par défaut, utilisé quand on ne spécifie pas le nom de domaine :
L'objectif est de bloquer les attaques par IP (sans spécification du nom de domaine) qui n'auront pas accès au site mais à une page statique.
wget -O /var/www/html/index.html https://soft.lafibre.info/download/web/apache2/default-index.html : Page qui sera affichée à l'attaquant
wget -O /etc/ssl/certs/ssl-cert-default.pem https://soft.lafibre.info/download/web/apache2/ssl-cert-default.pem : Certificat local qui ne sera pas valide, pour les accès sur le port 443
wget -O /etc/ssl/private/ssl-cert-default.key https://soft.lafibre.info/download/web/apache2/ssl-cert-default.key
wget -O /etc/apache2/sites-available/000-default.conf https://soft.lafibre.info/download/web/apache2/apache2-000-default.conf

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #4 le: 14 octobre 2021 à 09:19:40 »
Note : Mise à jour juin 2023 avec ajout de DHE-RSA-CHACHA20-POLY1305 (compatible Ubuntu 20.04 et Ubuntu 22.04)

6/ Configuration SSL d'Apache 2.4, pour avoir un chiffrement https qui respecte les bonnes pratiques :

La configuration proposée est celle du Mozilla SSL Configuration Generator, outil de référence. La version minimale des clients supportés : OpenSSL 1.0.1 (mars 2012), IE 11 (octobre 2013), Chrome 31 (novembre 2013), Android 4.4.2 (décembre 2013), Firefox 27 (février 2014), Opera 20 (mars 2014), Java 8u31 (janvier 2015), Safari 9 (septembre 2015) et Edge toutes versions (juillet 2015).
nano /etc/apache2/mods-available/ssl.conf
On se place a la fin du fichier, juste avant </IfModule>
Copier / coller le bloc qui est optimisé pour Ubuntu 20.04 (Apache 2.4.41 / OpenSSL 1.1.1f) ou Ubuntu 22.04 (Apache 2.4.52 / OpenSSL 3.0.2) :

        #Modif optimisaiton SSL
        SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
        SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
        SSLHonorCipherOrder off
        SSLCompression off
        SSLSessionTickets off
        # OCSP Stapling
        SSLUseStapling on
        SSLStaplingResponderTimeout 5
        SSLStaplingReturnResponderErrors off
        SSLStaplingCache shmcb:${APACHE_RUN_DIR}/stapling_cache(128000)
La configuration proposée active OCSP Stapling Cache, qui permet de stocker dans un cache les réponses OCSP incluses dans la négociation TLS. Cela permet un gain de vitesse pour la première connexion au serveur et un petit gain de sécurtié.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #5 le: 14 octobre 2021 à 09:20:13 »
7/ Redémarrage d'Apache 2 et vérifications que tout est ok :

systemctl restart apache2
Vérification qu'Apache fonctionne bien : systemctl status apache2

Si vous n'avez aucun message après « systemctl restart apache2 », c’est que tout s’est bien passé.

Si vous avez un message « Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details. » c’est qu’il y a un problème dans votre configuration.

Vous pouvez tenter un  « systemctl status apache2.service » pour avoir plus d‘information. La bonne méthode pour trouver ce qui ne convient pas est de commenter les lignes que vous pensez problématiques et de faire un « systemctl start apache2 » pour démarrer Apache2.

Si rien ne s’affiche, c’est que cela a fonctionné. Vous pouvez ensuite tenter de rajouter / modifier des lignes commentées, avant de tenter un nouveau « systemctl restart apache2 ».

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #6 le: 14 octobre 2021 à 09:20:36 »
8/ Optimiser les logs pour réduire les écritures sur un SSD et prolonger sa durée de vie

Facultatif : Création d'un ramdisque pour les log qui ne sont pas important (Cela vise à réduire l'usure du SSD avec des écritures inutiles).
rm /var/log/apache2/*
echo "# RamDisque pour les log Apache2" >> /etc/fstab
echo "tmpfs /var/log/apache2 tmpfs defaults,size=40% 0 0" >> /etc/fstab
reboot

se reconnecter
sudo -s

Facultatif : Rotation des logs Apache : réduction à 4 jours les log peu importants de /var/log/apache2
sed -i -e "s/rotate 14/rotate 4/g" /etc/logrotate.d/apache2
sed -i '/delaycompress/d' /etc/logrotate.d/apache2
sed -i -e "s/compress/nocompress/g" /etc/logrotate.d/apache2
sed -i -e "s/create 640 root adm/create 666 root adm/g" /etc/logrotate.d/apache2

Vérification du contenu du fichier : nano /etc/logrotate.d/apache2

Facultatif : Rotation des logs PHP : réduction à 4 jours les log peu importants de /var/log/phpX.X-fpm.log
Ubuntu 22.04 :
sed -i -e "s/weekly/daily/g" /etc/logrotate.d/php8.1-fpm
sed -i -e "s/rotate 12/rotate 4/g" /etc/logrotate.d/php8.1-fpm
sed -i '/delaycompress/d' /etc/logrotate.d/php8.1-fpm
sed -i -e "s/compress/nocompress/g" /etc/logrotate.d/php8.1-fpm

Vérification du contenu du fichier : nano /etc/logrotate.d/php8.1-fpm

Ubuntu 20.04 :
sed -i -e "s/weekly/daily/g" /etc/logrotate.d/php7.4-fpm
sed -i -e "s/rotate 12/rotate 4/g" /etc/logrotate.d/php7.4-fpm
sed -i '/delaycompress/d' /etc/logrotate.d/php7.4-fpm
sed -i -e "s/compress/nocompress/g" /etc/logrotate.d/php7.4-fpm

Vérification du contenu du fichier : nano /etc/logrotate.d/php7.4-fpm

Question : A quelle heure se fait la rotation des logs ?
La réponse se trouve dans /etc/crontab, c'est l'heure de l'appel de /etc/cron.daily

La chaîne est la suivante :
- /etc/crontab : appel de /etc/cron.daily
- /etc/cron.daily/logrotate : appel de "/usr/sbin/logrotate /etc/logrotate.conf"
- /etc/logrotate.conf : inclusion des fichiers "include /etc/logrotate.d"
- Enfin est appelé /etc/logrotate.d/apache2 et /etc/logrotate.d/php7.4-fpm

Exemple de fichier /etc/logrotate.d/apache2 avec deux durée différentes de conservation des logs :

/var/log/apache2/*.log {
daily
missingok
rotate 3
nocompress
notifempty
create 666 root adm
sharedscripts
postrotate
                if invoke-rc.d apache2 status > /dev/null 2>&1; then \
                    invoke-rc.d apache2 reload > /dev/null 2>&1; \
                fi;
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}

/home/log/*/*.log {
daily
missingok
rotate 40
nocompress
notifempty
create 666 root adm
sharedscripts
postrotate
                if invoke-rc.d apache2 status > /dev/null 2>&1; then \
                    invoke-rc.d apache2 reload > /dev/null 2>&1; \
                fi;
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #7 le: 14 octobre 2021 à 09:21:25 »
9/ Installation des pré-requis pour avoir un certificat TLS Let's Encrypt

On va maintenant installer « Certbot », pour avoir un certificat TLS Let's Encrypt. « Certbot » est un programme de gestion de certificats en Python qui réclame le certificat, effectue le processus de validation de domaine, installe le certificat et dans un second temps, renouvelle le certificat (le certificat est valable 3 mois et il est renouvelé 30 jours avant son expiration).
Certbot est diffusé sous forme d'un paquet Snap (application est confinées dans une  sandbox, c’est à dire isolée du kernel via AppArmor permettant un gain de sécurité : Les Snap n'ont pas accès à tout le serveur, mais juste aux éléments nécessaires à leur fonctionnement.).

Installation de Certbot :
snap install core
snap refresh core
installe et met à jour « core », la base logicielle commune à de nombreux paquets snap.
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot


La génération d'un certificat et la configuration d'Apache sera utilisée d'autres tutoriels.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #8 le: 14 octobre 2021 à 09:21:33 »
Annexes :


Quelques commandes pour gérer les applications snap :

  • snap info logiciel affiche une description de l’application et les versions disponibles.
  • snap list permet de lister les paquets snap installés.
  • snap list --all permet de lister les paquets, les lignes avec la mention « désactivé » désigne habituellement l’ancienne version, snap gardant la version n et n-1 d’un programme, ce qui permet une mise à jour en douceur (les mises à jour sont installées automatiquement).
  • snap refresh --time permet de voire a 1/fréquence de mise à jour (4 fois par jour par défaut), 2/quand la dernière mise à jour s'est produite 3/quand la suivante est planifiée.
  • snap refresh --list permet de voir quels snaps vont être mis à jour avec la prochaine mise à jour.
  • sudo snap refresh permet de forcer une mise à jour immédiatement. Il n’est pas nécessaire de faire un snap refresh --list avant.
  • snap saved liste les instantanés - les derniers profils conservés quand on supprime un snap
  • snap remove logiciel supprimera le logiciel, mais conservera le profil utilisateur pendant 30 jours (instantané, snapshot)
  • snap remove --purge logiciel : supprimera complètement le logiciel ainsi que les profils utilisateurs relatifs.

La liste des applications disponible est sur https://snapcraft.io/

snap info certbot :

$ snap info certbot
name:      certbot
summary:   Automatically configure HTTPS using Let's Encrypt
publisher: Certbot Project (certbot-eff✓)
store-url: https://snapcraft.io/certbot
contact:   https://github.com/certbot/certbot/issues
license:   unset
description: |
  The objective of Certbot, Let's Encrypt, and the ACME (Automated
  Certificate Management Environment) protocol is to make it possible
  to set up an HTTPS server and have it automatically obtain a
  browser-trusted certificate, without any human intervention. This is
  accomplished by running a certificate management agent on the web
  server.
 
  This agent is used to:
    - Automatically prove to the Let's Encrypt CA that you control the website
    - Obtain a browser-trusted certificate and set it up on your web server
    - Keep track of when your certificate is going to expire, and renew it
    - Help you revoke the certificate if that ever becomes necessary.
commands:
  - certbot
services:
  certbot.renew: oneshot, enabled, inactive
snap-id:      wy7i66qPx4neXr6m9rTh7Y40h8EhtZFh
tracking:     latest/stable
refresh-date: Il y a 22 jours, à 05 h 2 HNR
channels:
  latest/stable:    1.29.0      2022-07-06 (2192) 45MB classic
  latest/candidate: ↑                                 
  latest/beta:      1.29.0      2022-07-06 (2192) 45MB classic
  latest/edge:      1.30.0.dev0 2022-07-29 (2252) 46MB classic
installed:          1.29.0                 (2192) 45MB classic

Exemple sur un PC Ubuntu 18.10 resté plus de deux ans sans connexion Internet : (de juillet 2019 à octobre 2021)
$ snap list
Name                  Version                     Rev   Tracking  Publisher   Notes
core                  16-2.39.3                   7270  stable    canonical✓  core
core18                20190709                    1066  stable    canonical✓  base
gnome-3-26-1604       3.26.0.20190705             90    stable/…  canonical✓  -
gnome-3-28-1804       3.28.0-10-gaa70833.aa70833  67    stable    canonical✓  -
gnome-calculator      3.32.1                      406   stable/…  canonical✓  -
gnome-characters      v3.32.1+git2.3367201        296   stable/…  canonical✓  -
gnome-logs            3.32.0-4-ge8f3f37ca8        61    stable/…  canonical✓  -
gnome-system-monitor  3.32.1-3-g0ea89b4922        100   stable/…  canonical✓  -
gtk-common-themes     0.1-22-gab0a26b             1313  stable/…  canonical✓  -

On lance la mise à jour :
$ sudo snap refresh
2021-10-22T13:20:10+02:00 INFO Waiting for restart...
2021-10-22T13:27:41+02:00 INFO Waiting for conflicting change in progress: conflicting slot snap core, task
"connect"
gtk-common-themes 0.1-59-g7bca6ae from Canonical✓ refreshed
core 16-2.52.1 from Canonical✓ refreshed
core18 20210722 from Canonical✓ refreshed
gnome-3-26-1604 3.26.0.20210629 from Canonical✓ refreshed
gnome-3-28-1804 3.28.0-19-g98f9e67.98f9e67 from Canonical✓ refreshed
gnome-characters 40.0-10-gd54a7df73d from Canonical✓ refreshed
gnome-calculator 3.38.2+git3.1d166209 from Canonical✓ refreshed
gnome-logs 3.36.0 from Canonical✓ refreshed
gnome-system-monitor 40.1-2-ga819fb4b55 from Canonical✓ refreshed

Le résultat : de nouvelles dépendances installées comme "bare", "core20", "gnome-3-34-1804", "gnome-3-38-2004" et la mise à jour des snap :
$ snap list
Name                  Version                     Rev    Tracking         Publisher   Notes
bare                  1.0                         5      latest/stable    canonical✓  base
core                  16-2.52.1                   11993  latest/stable    canonical✓  core
core18                20210722                    2128   latest/stable    canonical✓  base
core20                20210928                    1169   latest/stable    canonical✓  base
gnome-3-26-1604       3.26.0.20210629             104    latest/stable/…  canonical✓  -
gnome-3-28-1804       3.28.0-19-g98f9e67.98f9e67  161    latest/stable    canonical✓  -
gnome-3-34-1804       0+git.3556cb3               72     latest/stable    canonical✓  -
gnome-3-38-2004       0+git.6ba6040               76     latest/stable    canonical✓  -
gnome-calculator      3.38.2+git3.1d166209        884    latest/stable/…  canonical✓  -
gnome-characters      40.0-10-gd54a7df73d         726    latest/stable/…  canonical✓  -
gnome-logs            3.36.0                      106    latest/stable/…  canonical✓  -
gnome-system-monitor  40.1-2-ga819fb4b55          163    latest/stable/…  canonical✓  -
gtk-common-themes     0.1-59-g7bca6ae             1519   latest/stable/…  canonical✓  -

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #9 le: 14 octobre 2021 à 09:22:07 »
Outils indispensables pour de nombreux outils PHP :

- apt install php-zip ; phpenmod zip : Permet à PHP de gérer des fichiers ZIP (par exemple pour exporter une base dans phpMyAdmin)
- apt install php-curl ; phpenmod curl : Permet à PHP d'interagir avec différents types de serveurs utilisant différents protocoles.
- apt install php-json ; phpenmod json : Permet d’utiliser et manipuler un fichier JSON dans PHP.
- apt install php-mbstring ; phpenmod mbstring : Un module pour gérer les chaînes non ASCII et convertir les chaînes en différents encodages
- apt install php-gd ; phpenmod gd : Permet de prendre en charge la bibliothèque graphique GD qui permet de manipuler les formats GIF, PNG, JPEG, WBMP, XBM et XPM.
- apt install imagemagick php-imagick ; phpenmod imagick : Permet de manipuler les images. imagick est de meilleure qualité que GD pour le redimensionnement des photos. Wordpress par exemple utilise imagick, s'il est installé, et en cas d’absence Wordpress va tenter d’utiliser GD.
- apt-get install php-intl ; phpenmod intl

Augmenter l'espace disque pour imagemagick si vous devez stocker de nombreuses photos :
nano /etc/ImageMagick-6/policy.xml
remplacer

<policy domain="resource" name="disk" value="1GiB"/>par
<policy domain="resource" name="disk" value="20GiB"/>
Redémarrer PHP-FPM :
- Pour PHP 8.1 (Ubuntu 22.04 LTS ): systemctl restart php8.1-fpm
- Pour PHP 7.4 (Ubuntu 20.04 LTS ): systemctl restart php7.4-fpm
- Pour PHP 7.2 (Ubuntu 18.04 LTS ): systemctl restart php7.2-fpm

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #10 le: 14 octobre 2021 à 09:22:22 »
Génération d'un certificat :

Exemple : Pour demande un certificat qui sera utilisé pour 3 domaines :
- nom-de-domaine
- www.nom-de-domaine (permet de faire une redirection de www.nom-de-domaine vers nom-de-domaine en https, sans ce certificat, la redirection ne pourra pas se faire en https)
- ipv6.nom-de-domaine : exemple de sous-domaine supplémentaire.
Les différents domaines d'un certificat sont séparés par des virgules. Le maximum est de 100 domaines par certificat.

(le DNS doit pointer les IP vers le serveur sans quoi cela sera un échec)
certbot --apache --domains nom-de-domaine,www.nom-de-domaine,ipv6.nom-de-domaine certonly

Pendant la procédure, il va vous proposer de rentrer un e-mail, cela permettra de vous avertir avant l'expiration si votre certificat n'est pas renouvelé à temps.

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a

-------------------------------------------------------------------------------
Would you be willing 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 EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: y



Visualiser les certificats sur un serveur :

sudo certbot certificates


Ajouter un domaine à un certificat LetsEncrypt existant
On ne peut pas ajouter ou supprimer juste un domaine, il faut tous les repréciser

certbot certonly --apache --cert-name nomducertificat --domains scaleway.testdebit.info,ipv4.scaleway.testdebit.info,ipv6.scaleway.testdebit.info




Commande pour supprimer un certificat inutilisé :

Si le certificat est encore valide :
sudo certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem --reason cessationofoperation

Si le certificat n'est plus valide :
sudo certbot delete --cert-name example.com

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Base: Installation et sécurisation d'Apache2
« Réponse #11 le: 14 octobre 2021 à 09:23:12 »
Vérification de l'activation du mode http/2 en https et en http

curl -I --http2 -s https://nom.de.domaine/ | grep HTTP : test http/2 en https : la négociation du protocole (http2 vs http1.1) est fait à travers les extensions TLS (ALPN)
curl -I --http2 -s http://nom.de.domaine/ | grep HTTP : test http/2 en http, ici curl passe par un Connection: Upgrade, HTTP2-Settings / Upgrade: h2c
curl -I --http2-prior-knowledge -s http://nom.de.domaine/ | grep HTTP : test http/2 en http, ici curl parle directement l'http2, sans passer par la phase d'upgrade




Accès à server-status sécurisé par mot de passe :

C'est une page qui donne des informations sur le fonctionnement d'Apache. Remplacer login par le login de votre choix.
htpasswd -cB /etc/apache2/acces.pwd login
nano /etc/apache2/mods-available/status.conf

Rajouter le paragraphe suivant sous le paragraphe <Location /server-status> [...] </Location> :

<Location /status-secure>
SetHandler server-status
AuthType Basic
AuthName "Mot de passe necessaire ici !!"
AuthUserFile "/etc/apache2/acces.pwd"
Require valid-user
</Location>
Il suffit ensuite sur n'importe quel page du site d'aller sur nom-de-domaine/status-secure pour avoir accès aux informations.



Note :

La commande htpasswd -cB /etc/apache2/acces.pwd login crée le fichier et le supprime s'il existe déjà. (option -c)

Pour créer d'autres comptes utilisateurs :
htpasswd -B /etc/apache2/acces.pwd login2
htpasswd -B /etc/apache2/acces.pwd login3

L'option -B permet d'utiliser Bcrypt, la fonction de hachage la plus sécurisée proposée par htpasswd. En plus de l'utilisation d'un sel pour se protéger des attaques par table arc-en-ciel, bcrypt est une fonction adaptative, c'est-à-dire que l'on peut augmenter le nombre d'itérations pour la rendre plus lente. Ainsi elle continue à être résistante aux attaques par force brute malgré l'augmentation de la puissance de calcul.

Pour afficher le mot de passe et ne pas le mettre dans un fichier :
htpasswd -nB user