Sécurisation basique de votre serveur¶
Dernière mise à jour: mai 2022. Destiné aux utilisateurs chevronnés. De solides compétences techniques sont requises
Avertissement
Aucun système n'est sûr. Ceci est le premier de deux chapitres sur la sécurité de serveur. Bien qu'il présente des mesures basiques visant à protéger votre serveur Ubuntu contre la majorité des menaces immédiates, n'importe quel pirate ou organisme compétent disposant de ressources suffisantes trouvera vraisemblablement un moyen pour accéder à votre système.
Le pare-feu¶
Un serveur interagit en permanence avec des appareils situés à l'intérieur et à l'extérieur de son réseau. Il doit être protégé par un système de sécurité appelé pare-feu (en anglais, « firewall »), qui contrôle tout trafic entrant et sortant. Le « Uncomplicted Firewall » (ufw) est un choix de pare-feu populaire pour les serveurs Ubuntu. Vous trouverez plus de détails ci-dessous.
Montrez-moi le guide étape par étape
Installation¶
Installez le « Uncomplicated Firewall », lancez-le automatiquement après chaque redémarrage, et vérifiez qu'il fonctionne (le statut doit être Active
) :
sudo apt install ufw
sudo ufw enable
sudo systemctl status ufw
Règles du pare-feu¶
Refusez tout trafic entrant et sortant par défaut :
sudo ufw default deny outgoing
sudo ufw default deny incoming
Assurez-vous que le pare-feu n'autorise que le trafic indispensable. Pour ce faire, ouvrez les points de communication appropriés, également appelés ports. Dans le cadre de ce tutoriel, nous n'en ouvrirons que quelques-uns. Adaptez ces règles en fonction de vos propres besoins :
sudo ufw allow 80,443/tcp
sudo ufw allow 22/tcp
sudo ufw allow 123/udp
sudo ufw allow in from any to any port 53
sudo ufw allow out 80,443/tcp
sudo ufw allow out 22/tcp
sudo ufw allow out 123/udp
sudo ufw allow out from any to any port 53
Voici quelques informations supplémentaires sur ces ports :
Port | Description |
---|---|
80 | Requêtes HTTP : ce port est attribué au protocole de communication Internet le plus utilisé, le protocole de transfert hypertexte (HTTP). Votre serveur peut l'utiliser pour envoyer et recevoir des données sur la toile. |
443 | Requêtes HTTPS : port standard pour tout trafic HTTP sécurisé (HTTPS). Votre serveur peut l'utiliser pour envoyer et recevoir du trafic chiffré. |
22 | Requêtes SSH : ce port est généralement utilisé pour exécuter le protocole « Secure Shell (SSH) ». Votre serveur peut l'utiliser pour les connexions à distance. |
123 | Synchronisation NTP : ce port permet de synchroniser l'heure entre plusieurs ordinateurs. |
53 | Requêtes DNS : ce port est utilisé pour la résolution des noms de domaine. Votre serveur peut l'utiliser pour traduire les noms de domaine en adresses IP. |
Pour finir, vérifiez si les règles du pare-feu sont correctement configurées :
sudo ufw status numbered
Voici à quoi devraient ressembler les règles :
Status: active
To Action From
-- ------ ----
[ 1] 80,443/tcp ALLOW IN Anywhere
[ 2] 22/tcp ALLOW IN Anywhere
[ 3] 123/udp ALLOW IN Anywhere
[ 4] 53 ALLOW IN Anywhere
[ 5] 80,443/tcp ALLOW OUT Anywhere
[ 6] 22/tcp ALLOW OUT Anywhere
[ 7] 123/udp ALLOW OUT Anywhere
[ 8] 53 ALLOW OUT Anywhere
[ 9] 80,443/tcp (v6) ALLOW IN Anywhere (v6)
[10] 22/tcp (v6) ALLOW IN Anywhere (v6)
[11] 123/udp (v6) ALLOW IN Anywhere (v6)
[12] 53 (v6) ALLOW IN Anywhere (v6)
[13] 80,443/tcp (v6) ALLOW OUT Anywhere (v6)
[14] 22/tcp (v6) ALLOW OUT Anywhere (v6)
[15] 123/udp (v6) ALLOW OUT Anywhere (v6)
[16] 53 (v6) ALLOW OUT Anywhere (v6)
Réglages du routeur¶
Vous pouvez également vérifier les réglages de votre routeur et vous assurer que tous les ports inutilisés sont désactivés. Consultez le manuel du routeur pour plus d'informations.
Montrez-moi une vidéo récapitulative (1min)
Heure du serveur¶
De nombreux protocoles de sécurité reposent sur l'heure du système. Une heure incorrecte peut avoir des répercussions négatives en matière de sécurité. Le protocole de temps réseau (en anglais, « Network Time Protocol » ou NTP) permet de s'assurer que l'heure du serveur reste synchronisée avec des ordinateurs de référence. Aussi appelés serveurs NTP, ces ordinateurs sont organisés en couches hiérarchiques, ou strates. Vous trouverez ci-dessous plus de renseignements pour configurer le protocole NTP sur votre serveur.
Couche | Description |
---|---|
Strate 0 | Horloges matérielles, par exemple des horloges atomiques, des GPS ou des horloges radio-pilotées. |
Strate 1 | Ordinateurs avec une connexion directe aux horloges matérielles. |
Strate 2 | Ordinateurs synchronisés en réseau avec les serveurs de la strate 1. |
Clients NTP | Ordinateurs demandant périodiquement l'heure aux serveurs NTP. |
Montrez-moi le guide étape par étape
Configuration¶
Sauvegardez le fichier de configuration :
sudo cp --archive /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf-COPY-$(date +"%Y%m%d%H%M%S")
Ouvrez le fichier :
sudo vi /etc/systemd/timesyncd.conf
Modifiez-en le contenu pour accéder aux serveurs NTP publics et open-source exploités par le projet pool.ntp.org ou Ubuntu :
[Time]
NTP=0.pool.ntp.org 1.pool.ntp.org
FallbackNTP=ntp.ubuntu.com
Sauvegardez et fermez le fichier (:wq!
). Puis, redémarrez le service systemd-timesyncd
et assurez-vous qu'il fonctionne (le statut devrait être Active
) :
sudo systemctl restart systemd-timesyncd
sudo systemctl status systemd-timesyncd
Fuseau horaire¶
Configurons à présent le fuseau horaire du serveur :
timedatectl | grep Time
En supposant que vous habitiez près de Budapest, le terminal devrait afficher quelque chose semblable à :
Time zone: Europe/Budapest (CEST, +0200)
Si ce n'est pas le cas, configurez le fuseau horaire correct (ajustez celui-ci en fonction de votre propre localisation) :
sudo timedatectl set-timezone Europe/Budapest
Montrez-moi une vidéo récapitulative (1min)
Sécuriser le protocole SSH¶
Nous avons expliqué dans un chapitre précédent comment se connecter à distance au serveur depuis un autre ordinateur. Vous trouverez ci-dessous des instructions pour sécuriser davantage cette connexion à distance :
Mesure de sécurité | Description |
---|---|
Port SSH | Changez le port SSH de 22 à une autre valeur. Dans ce tutoriel, nous choisirons le port 2222 ; toute autre valeur peut convenir, assurez-vous toutefois d'ajuster les commandes correspondantes en conséquence. |
Restrictions de connexion | Limitez le nombre de tentatives de connexion. |
Restrictions d'accès | Autorisez un seul utilisateur à se connecter. Dans notre cas, il s'agit de l'administrateur gofossadmin (adaptez le nom de l'administrateur en conséquence). |
Enregistrement | Gardez la trace de chaque connexion. |
Restrictions « Root » | Bloquez l'accès SSH distant au compte « root ». |
Authentification | Utilisez des clés d'authentification protégées par mot de passe plutôt qu'une authentification par mot de passe. |
Déconnexion | Activez la déconnexion automatique après 5 minutes d'inactivité. |
Clés de chiffrement | Supprimez les clés de chiffrement courtes pour une sécurité accrue. |
Notice légale | Ajoutez une notice légale pour avertir les utilisatrices et utilisateurs non habilités. |
Montrez-moi le guide étape par étape
Port SSH & réglages de sécurité¶
Ouvrez le nouveau port SSH 2222 (ajustez en conséquence) :
sudo ufw allow 2222/tcp
sudo ufw allow out 2222/tcp
Sauvegardez le fichier de configuration SSH. Si quelque chose devait mal tourner, vous serez toujours en mesure de récupérer les paramètres initiaux :
sudo cp --preserve /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +"%Y%m%d%H%M%S")
Ouvrez le fichier de configuration SSH :
sudo vi /etc/ssh/sshd_config
Supprimez le contenu du fichier en tapant :%d
. Puis saisissez ou copiez/collez le contenu suivant, tout en veillant à ajuster les paramètres si nécessaire (par exemple, le port SSH ou le nom d'utilisateur de l'administrateur) :
# algorithmes HostKey supportés par ordre de préférence :
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
# divers paramètres de sécurité :
Port 2222 # change le port SSH standard 22 (ajuster en conséquence)
LogLevel VERBOSE # enregistre l'empreinte de la clé de l'utilisateur lors de la connexion afin d'avoir une trace claire de la clé utilisée pour se connecter
Protocol 2 # utilise uniquement le nouveau protocole, plus sûr
PermitUserEnvironment no # empêche les utilisateurs de définir des variables d'environnement
PermitRootLogin no # bloque la connexion de l'utilisateur root
PubkeyAuthentication yes # autorise l'authentification avec une clé publique
PasswordAuthentication no # empêche l'authentification avec un mot de passe
PermitEmptyPasswords no # empêche la connexion si le mot de passe de l'utilisatrice ou de l'utilisateur est vide
MaxAuthTries 3 # nombre maximum de tentatives de connexion
MaxSessions 2 # nombre maximum de sessions ouvertes
X11Forwarding no # désactive le transfert X11
IgnoreRhosts yes # ignore .rhosts et .shosts
UseDNS no # vérifie que le nom d'hôte correspond à l'IP
ClientAliveCountMax 0 # nombre maximum de messages « client vivant » envoyés sans réponse
ClientAliveInterval 300 # délai en secondes avant une demande de réponse
AllowUsers gofossadmin # autorise uniquement l'utilisateur gofossadmin à se connecter à distance (ajustez en conséquence)
# désactiver le transfert de port :
AllowAgentForwarding no
AllowTcpForwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no
# journal des accès aux fichiers sftp (lecture/écriture/etc.) :
Subsystem sftp /usr/lib/openssh/sftp-server
# autres paramètres de sécurité :
Compression no
PrintMotd no
TCPKeepAlive no
ChallengeResponseAuthentication no
UsePAM yes
AcceptEnv LANG LC_*
Sauvegardez et fermez le fichier de configuration SSH (:wq!
). Redémarrez le serveur SSH et vérifiez que le nouveau port SSH est défini comme 2222 (ou le port que vous avez choisi) :
sudo systemctl restart sshd
sudo ss -tlpn | grep ssh
Déconnexion de sessions inactives¶
Assurez-vous que toute connexion SSH distante est désactivée après 5 minutes d'inactivité :
echo 'TMOUT=300' >> .bashrc
tail .bashrc
Suppression des clés de chiffrement courtes¶
SSH utilise l'algorithme Diffie-Hellman pour établir une connexion sécurisée. Pour des raisons de sécurité, il est recommandé d'utiliser des clés d'au moins 3072 bits.
Sauvegardez le fichier de configuration SSH. Si quelque chose devait mal tourner, vous serez toujours en mesure de récupérer les paramètres initiaux :
sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
Supprimez les clés plus courtes que 3072 bits :
sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
Notice légale¶
Un message d'avertissement devrait être affiché à tout utilisateur essayant de se connecter à distance au serveur. Ouvrez le fichier suivant :
sudo vi /etc/issue.net
Ajoutez une notice légale, comme celle-ci par exemple :
Ce système est réservé aux utilisateurs autorisés.
Les personnes qui utilisent ce système informatique sans autorisation, ou au-delà de leur autorisation, sont susceptibles de voir toutes leurs activités sur ce système surveillées et enregistrées par le personnel du système.
Les activités des utilisateurs autorisés peuvent également être contrôlées dans le cadre de la surveillance des personnes qui utilisent ce système de manière inappropriée ou dans le cadre de la maintenance du système.
Toute personne utilisant ce système consent expressément à une telle surveillance et est informée que si cette surveillance révèle des preuves possibles d'une activité criminelle, le personnel du système peut fournir ces preuves aux autorités policières.
Vérification & clôture du port 22¶
Et voilà ! À partir de maintenant, vous pouvez utiliser en toute sécurité votre ordinateur client pour vous connecter à distance au serveur. Ouvrez simplement un terminal, basculez vers le compte administrateur et connectez-vous au serveur en utilisant votre mot de passe. N'oubliez pas d'ajuster le nom d'utilisateur, l'adresse IP et le port SSH selon votre configuration :
su - gofossadmin
ssh -p 2222 gofossadmin@192.168.1.100
Essayez-le plusieurs fois. Si tout fonctionne comme prévu, fermez le port 22 inutilisé :
sudo ufw delete allow 22/tcp
sudo ufw delete allow out 22/tcp
Montrez-moi une vidéo récapitulative (2min)
Securiser MySQL¶
Les bases de données MySQL servent de « back-end » à de nombreux services web. Pour protéger les informations conservées par MySQL contre tout accès non autorisé, suivez les instructions ci-dessous.
Montrez-moi le guide étape par étape
Renforcer MySQL¶
Lancez MySQL:
sudo mysql
Changez les paramètres d'authentification pour l'utilisateur root. Assurez-vous de remplacer la chaîne StrongPassword
par un mot de passe fort et unique :
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'StrongPassword';
Quittez MySQL:
exit
Exécutez maintenant le script de renforcement de MySQL :
sudo mysql_secure_installation
Suivez les instructions affichées à l'écran :
- pas besoin de changer le mot de passe root, qui vient d'être défini
- supprimez l'utilisateur anonyme
- interdisez à l'utilisateur « root » de se connecter à distance
- supprimez la base de données de test
- rechargez la table des privilèges
Empêcher tout accès non autorisé¶
Sauvegardez le fichier de configuration MySQL. Si quelque chose devait mal tourner, vous serez toujours en mesure de récupérer les paramètres initiaux :
sudo cp --archive /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf-COPY-$(date +"%Y%m%d%H%M%S")
Ouvrez le fichier de configuration :
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
Désactivez l'accès distant à MySQL et empêchez l'accès non autorisé aux fichiers locaux en ajoutant ou en modifiant les deux lignes suivantes :
bind-address = 127.0.0.1
local-infile = 0
Sauvegardez et fermez le fichier de configuration MySQL (:wq!
).
Autorisations des utilisateurs¶
Il est recommandé de créer un utilisateur dédié avec des privilèges limités pour chaque application nécessitant d'accéder à MySQL. Par exemple, le stockage en nuage ou la photothèque que nous mettrons en place ultérieurement auront chacun leur propre utilisateur MySQL. De cette façon, les applications restent isolées et ne peuvent accéder qu'aux bases de données nécessaires à leur fonctionnement.
Montrez-moi une vidéo récapitulative (1min)
Sécuriser Apache¶
Apache est le serveur web le plus utilisé au monde. Vous trouverez ci-dessous des instructions pour le configurer correctement et renforcer sa sécurité.
Montrez-moi le guide étape par étape
Activer les modules de sécurité¶
Installez les deux modules Apache suivants:
sudo apt install libapache2-mod-security2 libapache2-mod-evasive
Activez les modules de sécurité, ainsi que d'autres modules requis pour ce tutoriel, et redémarrez Apache :
sudo a2enmod security2
sudo a2enmod evasive
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_html
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
sudo a2enmod xml2enc
sudo a2enmod expires
sudo systemctl restart apache2
Voici quelques informations supplémentaires sur ces modules :
Module | Description |
---|---|
Security2 | Protège votre serveur contre de nombreuses attaques, telles que l'injection SQL, le détournement de session, le « cross-site scripting », les agents utilisateurs malveillants, etc. |
Evasive | Fournit des actions d'évitement en cas d'attaque par déni de service (en anglais, « Denial of Service » ou DoS) ou par déni de service distribué (en anglais, « Distributed Denial of Service » ou DDoS), ou d'attaque par force brute. |
Rewrite | Permet de réécrire les URL pour activer les redirections, par exemple de http:// vers https:// . |
Headers | Permet de contrôler et de modifier les requêtes HTTP et les en-têtes de réponse. |
SSL | Active le chiffrement via SSL et TLS. |
Proxy, proxy_html, proxy_http | Crée un proxy/une passerelle pour votre serveur, garantit que les liens fonctionnent pour les utilisateurs en dehors du proxy et transmet les requêtes HTTP et HTTPS. |
Xml2enc | Fournit un support amélioré pour l'internationalisation. |
Expires | Améliore le temps de chargement des pages en déterminant la durée de stockage d'une image par le navigateur. |
Cacher des informations sensibles¶
Par défaut, le serveur envoie des en-têtes HTTP contenant des informations sur la version d'Apache, les modules, le système d'exploitation, etc. Ces données peuvent être utilisées pour exploiter des vulnérabilités. Créez un fichier de configuration Apache personnalisé pour masquer ces informations sensibles :
sudo vi /etc/apache2/conf-available/custom.conf
Ajoutez le contenu suivant :
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Options all -Indexes
Header always unset X-Powered-By
Sauvegardez et fermez le fichier (:wq!
).
Appliquez la configuration personnalisée, vérifiez qu'il n'y a pas d'erreurs de syntaxe (le terminal devrait afficher OK
) et redémarrez Apache :
sudo a2enconf custom.conf
sudo apachectl configtest
sudo systemctl restart apache2
Voici quelques informations supplémentaires sur ces paramètres :
Paramètre | Description |
---|---|
ServerTokens Prod | Ne renvoie que « Apache » dans l'en-tête du serveur. |
ServerSignature Off | Masque la version du serveur sur les pages générées par Apache. |
TraceEnable Off | Désactive la méthode HTTP TRACE, qui peut exposer votre serveur à des attaques de type cross-site scripting. |
Options all -Indexes | Désactive l'affichage de répertoire. |
Header always unset X-Powered-By | Cache l'information « X-Powered-By ... » et évite d'afficher le logiciel utilisé. |
Configurer ModSecurity¶
ModSecurity est un pare-feu applicatif à code source ouvert. Ce logiciel peut protéger votre serveur contre diverses attaques. Pour cela, commencez par ouvrir le fichier de configuration :
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo vi /etc/modsecurity/modsecurity.conf
Modifiez/ajoutez les paramètres suivants :
SecRuleEngine On
SecResponseBodyAccess Off
SecRequestBodyLimit 8388608
SecRequestBodyNoFilesLimit 131072
SecRequestBodyInMemoryLimit 262144
Sauvegardez et fermez le fichier (:wq!
).
Voici quelques informations supplémentaires sur ces paramètres :
Paramètre | Description |
---|---|
SecRuleEngine On | Active ModSecurity en utilisant les règles de base par défaut. |
SecResponseBodyAccess Off | Désactive la mise en mémoire tampon des requêtes pour utiliser moins de RAM et de CPU. |
SecRequestBodyLimit 8388608 | Définit la taille maximale pour la mise en mémoire tampon des requêtes à 8 Mo. |
SecRequestBodyNoFilesLimit 131072 | Définit la taille maximale pour la mise en mémoire tampon des données à 128 Ko. |
SecRequestBodyInMemoryLimit 262144 | Définit la taille maximale de la requête stockée dans la mémoire vive à 256 Ko. |
Activez le dernier « OWASP ModSecurity Core Rule Set (CRS) », un ensemble de règles génériques de détection d'attaques maintenu sur GitHub :
sudo rm -rf /usr/share/modsecurity-crs
sudo apt install git
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/share/modsecurity-crs
cd /usr/share/modsecurity-crs
sudo mv crs-setup.conf.example crs-setup.conf
Sauvegardez le fichier de configuration ModSecurity. Si quelque chose devait mal tourner, vous serez toujours en mesure de récupérer les paramètres initiaux :
sudo cp --archive /etc/apache2/mods-enabled/security2.conf /etc/apache2/mods-enabled/security2.conf-COPY-$(date +"%Y%m%d%H%M%S")
Ouvrez le fichier de configuration :
sudo vi /etc/apache2/mods-enabled/security2.conf
Supprimez son contenu avec la commande :%d
et ajoutez ou copiez/collez les lignes suivantes :
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs/*.conf
IncludeOptional /usr/share/modsecurity-crs/rules/*.conf
</IfModule>
Sauvegardez et fermez le fichier (:wq!
). Vérifiez qu'il n'y a pas d'erreurs de syntaxe (le terminal devrait afficher OK
) et redémarrez Apache pour appliquer la nouvelle configuration :
sudo apachectl configtest
sudo systemctl restart apache2
Sauvegardez le fichier de configuration ModEvasive. Si quelque chose devait mal tourner, vous serez toujours en mesure de récupérer les paramètres initiaux :
sudo cp --archive /etc/apache2/mods-enabled/evasive.conf /etc/apache2/mods-enabled/evasive.conf-COPY-$(date +"%Y%m%d%H%M%S")
Configurez ModEvasive pour protéger votre serveur contre les attaques par déni de service (en anglais, « Denial of Service » ou DoS) ou par déni de service distribué (en anglais, « Distributed Denial of Service » ou DDoS), et contre les attaques par force brute.
Ouvrez le fichier de configuration :
sudo vi /etc/apache2/mods-enabled/evasive.conf
Modifiez ou ajoutez les paramètres suivants :
<IfModule mod_evasive20.c>
DOSPageCount 5
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600
DOSLogDir "/var/log/mod_evasive"
</IfModule>
Sauvegardez et fermez le fichier (:wq!
). Les commandes suivantes créent un répertoire pour les fichiers journaux, vérifient l'absence d'erreurs de syntaxe (le terminal devrait afficher OK
), redémarrent Apache et vérifient si le statut est Active
:
sudo mkdir /var/log/mod_evasive
sudo chown -R www-data: /var/log/mod_evasive
sudo apachectl configtest
sudo systemctl restart apache2
sudo systemctl status apache2
Montrez-moi une vidéo récapitulative (2min)
Securiser PHP¶
PHP est un langage de programmation couramment utilisé pour les services web. Configurez-le correctement pour renforcer la sécurité de votre serveur. Plus de détails ci-dessous.
Montrez-moi le guide étape par étape
Version PHP¶
PHP supporte différentes versions. Au moment d'écrire ces lignes, PHP 8.1 est inclus par défaut dans les dépôts d'Ubuntu 22.04. Vérifiez quelle version est installée sur votre système :
php -v
Modules PHP¶
Installez certains modules PHP nécessaires pour ce tutoriel, en appliquant le même numéro de version que ci-dessus :
sudo apt install php8.1-common php8.1-mbstring php8.1-xmlrpc php8.1-gd php8.1-xml php8.1-intl php8.1-mysql php8.1-cli php8.1-ldap php8.1-zip php8.1-curl php8.1-pgsql php8.1-opcache php8.1-sqlite3
Paramètres de sécurité de PHP¶
Les fichiers de configuration php.ini
contiennent tous les paramètres de sécurité de PHP. Tout d'abord, déterminons où sont stockés ces fichiers :
sudo find / -name php.ini
Selon la version de PHP installée, la commande devrait retourner quelque chose comme :
/etc/php/8.1/apache2/php.ini
/etc/php/8.1/cli/php.ini
Le fichier /etc/php/8.1/apache2/php.ini
est utilisé par le serveur Apache, tandis que le fichier /etc/php/8.1/cli/php.ini
est utilisé par le programme PHP CLI.
Sauvegardez les deux fichiers de configuration. Si quelque chose devait mal tourner, vous serez toujours en mesure de récupérer les paramètres initiaux :
sudo cp --archive /etc/php/8.1/apache2/php.ini /etc/php/8.1/apache2/php.ini-COPY-$(date +"%Y%m%d%H%M%S")
sudo cp --archive /etc/php/8.1/cli/php.ini /etc/php/8.1/cli/php.ini-COPY-$(date +"%Y%m%d%H%M%S")
Ouvrez le premier fichier de configuration :
sudo vi /etc/php/8.1/apache2/php.ini
Modifiez ou ajoutez les paramètres suivants :
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
display_errors = Off
mail.add_x_header = Off
disable_functions = show_source,system,passthru,phpinfo,proc_open,allow_url_fopen,curl_exec
max_execution_time = 90
max_input_time = 90
memory_limit = 1024M
Sauvegardez et fermez le fichier (:wq!
).
Ouvrez le second fichier de configuration :
sudo vi /etc/php/8.1/cli/php.ini
Modifiez ou ajoutez les paramètres suivants :
expose_php = Off
allow_url_fopen = Off
Sauvegardez et fermez le fichier (:wq!
).
Voici quelques informations supplémentaires sur ces paramètres :
Paramètre | Description |
---|---|
expose_php = Off | Cache la version de PHP dans les en-têtes. |
allow_url_fopen = Off | Désactive l'exécution de code PHP à distance pour réduire les vulnérabilités par injection de code. |
allow_url_include = Off | Désactive l'exécution de code PHP à distance pour réduire les vulnérabilités par injection de code. |
display_errors = Off | Désactive l'affichage d'erreur. |
mail.add_x_header = Off | Supprime l'en-tête PHP des courriels. |
disable_functions = show_source, system, passthru, phpinfo, proc_open, allow_url_fopen, curl_exec | Désactive les fonctions PHP potentiellement dangereuses. Les trois fonctions suivantes n'ont pas été désactivées, car cela perturbe Pihole v5.2 : exec , shell_exec , popen . |
max_execution_time = 90 | Définit la durée maximale d'exécution d'un script (en secondes). |
max_input_time = 90 | Définit la durée maximale pendant laquelle un script peut analyser des données (en secondes). |
memory_limit = 1024M | Définit la quantité maximale de mémoire allouée à un script. |
Montrez-moi une vidéo récapitulative (2min)
Mises à jour de sécurité¶
Le serveur doit être mis à jour régulièrement pour réduire les failles de sécurité. Activez les mises à jour automatiques des principaux correctifs de sécurité, comme indiqué ci-dessous.
Montrez-moi le guide étape par étape
Activez les mises à jour automatiques :
sudo apt install unattended-upgrades
Créez un fichier de configuration :
sudo vi /etc/apt/apt.conf.d/51myunattended-upgrades
Ajoutez le contenu suivant pour configurer les mises à jour non surveillées :
// Active le script de mise à jour (0=désactiver)
APT::Periodic::Enable "1";
// Exécute "apt-get update" automatiquement tous les n-jours (0=désactiver)
APT::Periodic::Update-Package-Lists "1";
// Exécute "apt-get upgrade --download-only" tous les n-jours (0=désactiver)
APT::Periodic::Download-Upgradeable-Packages "1";
// Exécute "apt-get autoclean" tous les n-jours (0=désactiver)
APT::Periodic::AutocleanInterval "7";
// Envoi d'un rapport à « root »
// 0: pas de rapport (ou chaîne de caractères nulle)
// 1: rapport d'activité (toute chaîne de caractères)
// 2: + résultats des commandes (supprime -qq, supprime 2>/dev/null, ajoute -d)
// 3: + tracage traçage
APT::Periodic::Verbose "2";
APT::Periodic::Unattended-Upgrade "1";
// Mise à jour automatique des paquets
Unattended-Upgrade::Origins-Pattern {
"o=Ubuntu,a=stable";
"o=Ubuntu,a=stable-updates";
"origin=Ubuntu,codename=${distro_codename},label=Ubuntu-Security";
};
// Spécifiez vos propres paquets à ne pas mettre automatiquement à jour ici
Unattended-Upgrade::Package-Blacklist {
};
// Exécute dpkg --force-confold --configure -a si un état dpkg impropre est détecté pour s'assurer que les mises à jour sont installées même si le système a été interrompu lors d'une exécution précédente
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
// Effectue les mises à jour lorsque la machine est en marche, car votre serveur ne sera pas arrêté souvent
Unattended-Upgrade::InstallOnShutdown "false";
// Envoie un courriel à l'adresse indiquée avec des informations sur les paquets mis à jour
Unattended-Upgrade::Mail "root";
// Toujours envoyer un courriel
Unattended-Upgrade::MailOnlyOnError "false";
// Supprime toutes les dépendances inutilisées une fois la mise à jour terminée
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// Supprime toutes les nouvelles dépendances inutilisées après la fin de la mise à jour
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
// NE PAS redémarrer automatiquement SANS CONFIRMATION si le fichier /var/run/reboot-required est trouvé après la mise à jour
Unattended-Upgrade::Automatic-Reboot "false";
// NE PAS redémarrer automatiquement, même si des utilisateurs sont connectés
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";
Sauvegardez et fermez le fichier (:wq!
). Effectuez un essai pour vous assurer que tout fonctionne correctement :
sudo unattended-upgrade -d --dry-run