Microsoft a mis à jour PowerShell 7 dans le but de corriger deux failles de sécurité, l'une permet d'exécuter du code arbitraire sur la machine en outrepassant la fonctionnalité de sécurité Windows Defender Application Control (WDAC), tandis que l'autre permet de récupérer des identifiants en clair sur les machines non-Windows.
Actuellement, il y a deux branches maintenues par Microsoft au niveau de PowerShell 7 (anciennement appelé PowerShell Core) : 7.0 et 7.1. Microsoft a publié deux nouvelles versions pour corriger ces vulnérabilités, à savoir PowerShell 7.0.8 et PowerShell 7.1.5. Pour rappel, ces versions de PowerShell sont multiplateformes : Windows, Linux et macOS.
La fonctionnalité WDAC, en français Contrôle d'application Windows Defender, permet de protéger la machine locale contre l'exécution de logiciels malveillants, mais aussi de pilotes malveillants. L'idée étant d'autoriser seulement les exécutables de confiance. Lorsqu'elle est active, PowerShell est exécuté en mode restreint (Constrained Language Mode), ce qui agit comme une bride afin de réduire le champ d'action de la console PowerShell.
En exploitant la vulnérabilité CVE-2020-0951 pas récente vu le nom de la référence), il devient possible de contourner cette restriction appliquée par WDAC et d'exécuter des commandes malveillantes sur la machine. Toutefois, Microsoft précise qu'il faut disposer d'un accès local en tant qu'administrateur pour exploiter cette faille, ce qui complexifie l'attaque.
La seconde faille référencée CVE-2021-41355, touche directement .NET Core et elle permet à l'attaquant d'obtenir des identifiants en clair. C'est à cause de la fonction System.DirectoryServices.Protocols.LdapConnection qui envoie des identifiants en clair, seulement lorsqu'elle s'exécute sur des machines non-Windows.
En résumé, sachez que la CVE-2020-0951 affecte aussi bien PowerShell 7 que PowerShell 7.1, alors que la CVE-2021-41355 impacte seulement PowerShell 7.1.
Utilisez la commande ci-dessous dans une console PowerShell pour connaître votre version actuelle :
Windows Server 2022 est disponible depuis plusieurs semaines. Dans cet article, nous allons nous intéresser aux différentes éditions de Windows Server 2022 car il y a du changement.
Chaque sortie de Windows Server s'accompagne de son lot de changements et nouveautés. Au-delà des nouveautés fonctionnelles de Windows Server 2022, il y a aussi des changements sur les éditions proposées.
Voici la liste des éditions de Windows Server 2022, avec les spécificités de chacune :
Windows Server 2022 Standard
L'édition Standard elle celle que l'on connaît depuis toujours et elle le reste, il n'y a pas de changement notable.
Windows Server 2022 Essentials
L'édition Essentials évolue avec Windows Server 2022 puisqu'elle est limitée à 25 utilisateurs, 50 appareils et 1 seul CPU physique avec 10 cœurs au maximum. Par contre, Essentials ne sera plus une édition à part avec des fonctions spéciales (tableau de bord, access anywhere, plus de rôle "Windows Server Essentials Experience" etc.). Il s'agit désormais d'une version Standard mais bridée.
Windows Server 2022 Datacenter
L'édition Datacenter est une version Standard avec des fonctionnalités spécifiques en supplément, comme Software-defined Networking, Storage Replica et Storage Spaces Direct.
Windows Server 2022 Datacenter: Azure Edition
L'édition "Datacenter: Azure Edition" intègre des fonctionnalités inédites et elle tourne seulement dans le Cloud Azure. Elle bénéficie de la fonctionnalité "hotpatching in Core" qui permet d'appliquer des mises à jour correctives à chaud, c'est-à-dire qu'il n'est plus nécessaire de redémarrer après l'installation des mises à jour ! C'est un détail mais cela a son importance car un redémarrage peut être synonyme de coupure de la production, etc.... Et aussi d'une remise à zéro de l'uptime. Ahah.
Par ailleurs, la fonctionnalité "SMB over QUIC" est une exclusivité de cette édition, et elle permet d'accéder à des fichiers stockés sur un serveur de fichiers Windows Server 2022 de façon sécurisée, à partir d'Internet, grâce à des connexions basées sur TLS 1.3 (une version active par défaut), en UDP sur le port 443 (HTTPS). Cela signifie que le flux SMB n'utilise pas le port 445.
Il est à noter qu'avec Windows Server 2022, il n'y a pas de version Hyper-V Server où l'on peut installer directement un serveur Hyper-V avec un accès en ligne de commande. Pour le moment, l'alternative consiste à passer chez la concurrence, sur Azure Stack HCI ou à rester sur Hyper-V Server 2019.
Pour finir :
Pour rappel si vous êtes sur Windows Server 2012 ou Windows Server 2012 R2, le support prendra fin le 10 octobre 2023 (sauf sur Azure où il y a 3 ans de plus).
Que ce soit pour les éditions Standard ou Datacenter, Microsoft précise qu'au niveau des ressources matérielles, Windows Server 2022 supporte un maximum de 48 To de RAM sur l'hôte physique (contre 24 To pour Windows Server 2019), 2048 processeurs logiques (coeurs - contre 512 avec WS 2019).
Dans ce tutoriel, nous allons apprendre à cacher la version du serveur web Apache dans les en-têtes HTTP envoyées par notre serveur Apache mais aussi sur les pages d'erreurs.
Pourquoi cacher la version de son serveur web ?
La version d'un serveur web ou d'une autre application serveur est une information très utile aux pirates, car en fonction de la version utilisée, ils peuvent tester diverses attaques et failles connues sur ces versions. Si vous utilisez Apache en version 2.4.49, le pirate pourra rechercher les failles existantes et connues sur cette version, ce qui lui facilite la tâche.
La meilleure protection face à cela étant bien entendu de garder son serveur web à jour, mais il est aussi possible afin de rendre la tâche des attaquants plus longue, et donc plus difficile, de cacher la version de son serveur web Apache. C'est simple à mettre en place, alors pourquoi s'en priver ?
II. Afficher le numéro de version d'Apache
En tant qu'administrateurs, nous avons accès au serveur en direct. Il est alors facile d'afficher dans la console le numéro de version correspondant à notre serveur Apache local.
En local sur le serveur Apache
Sous Debian, on peut afficher la version installée avec la commande suivante :
apt-cache policy apache2
Nous aurons alors un résultat comme celui-ci :
Exemple - apt-cache policy apache2
Nous voyons donc bien que la version installée est la "2.2.22-13".
Mais, on peut aussi utiliser la commande apachectl, intégrée à Apache avec l'option "-v" ou "-V" (plus de détails). Personnellement, j'utilise plutôt cette méthode.
sudo apachectl -v
Ce qui donne :
Afficher la version d'Apache avec apachectl -v
On peut voir, là aussi, que mon serveur est en version 2.4.51.
À distance, en tant que visiteur
Depuis une machine distante sous Linux et du paquet Curl, on peut interroger notre serveur Web (par son nom de domaine ou son adresse IP) et obtenir sa version grâce aux informations de l'en-tête HTTP.
curl -I 192.168.100.120
Ce qui donne :
Encore plus simple, on peut générer une page d'erreur à partir d'un navigateur. Par exemple, en accédant à une page qui n'existe pas :
http://192.168.100.120/blabla.html
Au sein de cette page d'erreur 404 (Not Found), on peut voir "Apache/2.4.51" !
Afficher la version d'Apache avec une simple page introuvable
III. Cacher la version d'Apache
Pour cacher la version d'Apache, il faut changer quelques options dans sa configuration qui se situe par défaut dans "/etc/apache2". Dans ce dossier racine, il y a plusieurs sous-dossiers et fichiers. Le fichier de configuration principal "apache2.conf" appelle les fichiers du dossier "conf-enabled".
Le fichier "/etc/apache2/conf-enabled/security.conf" contient les options ServerTokens et ServerSignature que nous allons modifier. On peut aussi modifier ces options directement via "apache2.conf" en ajoutant ces directives à la fin du fichier.
Modifiez ce fichier (ou ajoutez les lignes à la fin de "apache2.conf") :
sudo nano /etc/apache2/conf-enabled/security.conf
On va venir remplacer :
ServerTokens OS
Par le niveau le plus restrictif :
ServerTokens Prod
Cela va permettre de masquer la version d'Apache. Néanmoins il restera toujours la mention "Apache Server".
En complément, si l'on veut masquer la mention "Apache Server", il faut venir remplacer :
ServerSignature On
Par :
ServerSignature Off
On enregistre et on ferme le fichier de configuration. Après toute modification, il faut recharger la nouvelle configuration du serveur Apache pour qu'elle soit prise en compte :
sudo systemctl restart apache2
On voit donc bien que la version du serveur Apache n'est plus affichée, tout comme la mention "Apache Server".
Voilà, votre serveur n'affichera plus la version d'Apache lorsqu'il sera interrogé. Même si la signature du serveur est masquée, c'est-à-dire la mention "Apache" sans la version, dans certains cas on peut l'obtenir malgré tout (comme avec l'outil Curl).
Dans ce tutoriel, nous allons voir comment mettre en place un serveur Web "LAMP" sous Debian 11, afin de pouvoir héberger un site Internet (WordPress, Joomla, Drupal, etc...) ou une application (NextCloud, etc.).
Au fait, c'est quoi un serveur LAMP ? Il s'agit d'un serveur qui s'appuie sur 4 composants : L pour Linux, c'est-à-dire le système d'exploitation (Debian, dans notre cas), A pour Apache, c'est-à-dire le serveur Web, M pour MySQL/MariaDB, c'est-à-dire le système de gestion de bases de données, et P pour PHP, c'est-à-dire le moteur de scripts.
Pour suivre ce tutoriel, vous avez besoin d'une machine sous Debian, ou une distribution basée sur Debian.
Pour installer un serveur LAMP sur WSL (Linux sur Windows), suivez ce tutoriel : Tutoriel - LAMP sur WSL
II. Serveur LAMP sous Debian 11
A. Installer Apache sous Debian 11
On commence par mettre à jour le cache des paquets :
sudo apt-get update
Ensuite, on installe le paquet "apache2" afin d'obtenir la dernière version d'Apache 2.4.
sudo apt-get install -y apache2
Pour qu'Apache démarre automatiquement en même temps que Debian, saisissez la commande ci-dessous (même si normalement c'est déjà le cas) :
systemctl enable apache2
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable apache2
Suite à l'installation du paquet, le serveur Apache démarre directement. On devrait pouvoir accéder à sa page par défaut. Pour cela, il suffit de récupérer l'adresse IP du serveur :
ip address
Puis, à l'aide d'une machine équipée d'un navigateur, on peut accéder à notre serveur Apache :
http://192.168.100.120
Apache en ligne, sous Debian 11
Pour visualiser la version d'Apache que vous venez d'installer, c'est tout simple : exécutez la commande suivant :
apache2ctl -v
Server version: Apache/2.4.51 (Debian)Server built: 2021-10-07T17:49:44
Apache 2.4.51 est la dernière version d'Apache au moment où j'écris cet article.
Avant d'aller plus loin, je vous recommande d'activer quelques modules d'Apache qui sont indispensables, notamment pour faire tourner un site Internet. Commençons par le module utilisé pour la réécriture d'URL :
a2enmod rewrite
L'occasion de découvrir la commande "a2enmod" qui sert à activer un module. A l'inverse, la commande "a2dismod" sert à désactiver un module.
Activons trois :autres modules :
"deflate" pour la gestion de la compression, notamment en gzip, pour utiliser la mise en cache des pages sur votre site
"headers" afin de pouvoir agir sur les en-têtes HTTP
"ssl" pour gérer les certificats SSL et donc l'utilisation du protocole HTTPS
a2enmod deflate
a2enmod headers
a2enmod ssl
Après avoir activé ou désactivé un module, ou modifié la configuration d'Apache, il faut redémarrer le service apache2 :
systemctl restart apache2
Où se situent la configuration d'Apache et des sites dans tout ça ?
Le fichier de configuration d'Apache 2 est le suivant :
Note : pour la configuration qui concerne PHP, le fichier de configuration est différent : "/etc/php/7.4/apache2/php.ini"
Tandis que pour déclarer les hôtes virtuels, en anglais "Virtual hosts", ce qui correspond aux différents sites hébergés par Apache (oui, un serveur Apache peut gérer plusieurs sites indépendamment), il faudra s'intéresser à ces deux dossiers :
Dossier qui contient les fichiers de configuration des sites disponibles : /etc/apache2/sites-available/
Dossier qui contient les fichiers de configuration (via un lien symbolique), des sites actifs : /etc/apache2/sites-enabled
Par défaut, nous accédons à la page d'accueil d'Apache grâce à l'hôte virtuel déclaré dans le fichier "/etc/apache2/sites-enabled/000-default.conf", qui écoute sur le port 80 (HTTP) et dont la racine est le dossier "/var/www/html".
Je vous invite à lire mon tutoriel dédié à la configuration d'un Virtual Host pour en savoir plus :
Enfin, si vous souhaitez mettre en place l'authentification basique sur votre site, vous avez besoin de l'outil "htpasswd" inclus dans le paquet "apache2-utils" (comme d'autres outils). Vous pouvez l'installer à tout moment d'une simple commande :
sudo apt-get install -y apache2-utils
B. Installer PHP sous Debian 11
PHP va venir se greffer sur notre serveur Apache, comme une extension, afin de pouvoir traiter les scripts intégrés aux pages ".php". Afin d'y aller progressivement, installons le paquet "php" en lui-même :
sudo apt-get install -y php
On peut voir que cette commande va installer une multitude de paquets :
C'est très bien, nous avons quelques modules de base indispensables et "libapache2-mod-php7.4" qui permet l'intégration avec Apache.
Actuellement, c'est PHP 7.4 qui est dans les dépôts de Debian, même si PHP 8 est déjà disponible, toutes les applications ne sont pas encore compatibles. Il faut savoir que le support de PHP 7.4 assure les mises à jour de sécurité jusqu'au 28 novembre 2022. Ce qui laisse un peu de temps, mais il faut garder en tête qu'il faudra envisager de passer sur PHP 8.
Avant d'aller plus loin, nous allons installer quelques paquets supplémentaires pour compléter l'installation de PHP sur notre serveur. Par exemple, pour permettre les interactions entre PHP et notre instance MariaDB.
Maintenant, pour nous assurer que notre moteur de script PHP est bien actif, nous allons créer un fichier "phpinfo.php" (ou un autre nom) à la racine de notre site Web :
sudo nano /var/www/html/phpinfo.php
Dans ce fichier, indiquez le code suivant :
<?php
phpinfo();
?>
Elle sera accessible à partir de cette adresse :
http://192.168.100.120/phpinfo.php
Cette page donne énormément d'informations sur toute la configuration de PHP et de notre serveur Apache. Il est fortement recommandé de la mettre en place seulement quand c'est nécessaire. Autrement dit, vous ne devez pas laisser cette page accessible par n'importe qui.
C. Installer MySQL/MariaDB sous Debian 11
MariaDB est un fork communautaire de MySQL et il présente l'avantage d'être open source et sous licence GPL, à la différence de MySQL qui est un logiciel propriétaire de chez Oracle, mais qui reste gratuit malgré tout. Il y a un excellent suivi pour MariaDB et c'est réellement un système très performant, vous pouvez miser sur ce composant sans aucun problème !
Pour installer MariaDB sous Debian 11, voici la commande à exécuter :
sudo apt-get install -y mariadb-server
Suite à l'installation, je vous invite à exécuter le script "mariadb-secure-installation" afin de sécuriser un minimum votre installation de MariaDB.
sudo mariadb-secure-installation
En résumé, vous allez pouvoir définir un mot de passe pour le compte "root" de MariaDB, empêcher les connexions distantes sur votre instance à l'aide du compte "root", empêcher les connexions anonymes et supprimer la base de test.
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] Y
New password: **************
Re-enter new password: **************
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Voilà, l'interrogatoire est terminé.
Pour obtenir le numéro de version de MariaDB, on peut utiliser cette commande :
mariadb -V
mariadb Ver 15.1 Distrib 10.5.12-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
Ou celle-ci en consultant le gestionnaire de paquets Aptitude (apt) :
Il est à noter que même si l'on a installé MariaDB, on peut utiliser la commande "mysql", notamment pour afficher le numéro de version avec "mysql -V" ou ouvrir une console MySQL/MariaDB.
Avant de passer à la suite, vérifiez que vous parvenez à vous connecter à votre instance MariaDB :
sudo mariadb -u root -p
Saisissez le mot de passe "root". Ensuite, vous avez accès à la console MariaDB / MySQL. Vous pouvez saisir vos requêtes SQL ici. Par exemple, pour lister les bases de données de votre instance :
show databases;
Première connexion à MariaDB en ligne de commande
Pour sortir de la console, saisissez la commande suivante :
exit
Il faudra revenir dans cette console lorsque vous allez déployer votre application sur votre serveur LAMP, par exemple WordPress, NextCloud, etc.... Afin de créer une base de données dédiée et un utilisateur dédié à cette application. Une alternative consiste à déployer PhpMyAdmin sur son serveur dans le but d'administrer MariaDB à partir d'une interface Web.
Après un changement de configuration de MariaDB, vous devez redémarrer le service :
systemctl restart mariadb
III. Conclusion
Voilà, votre serveur LAMP est installé ! Pour la suite de la configuration, cela dépend de l'application que vous souhaitez déployer, ou peut-être même qu'il s'agit d'un projet que vous avez vous-même développé.
Généralement, on commence par créer un nouvel hôte virtuel sur Apache pour accueillir les sources d'installation de l'application. Ensuite, on crée une base de données dédiée à cette application, avec son propre utilisateur (qui aura les droits seulement sur cette base), et on lance l'installation.
Microsoft a décidé d'intégrer la suite d'outils Sysinternals au Microsoft Store. Cela permet de réaliser l'installation facilement depuis le Store mais aussi de bénéficier des mises à jour automatique, comme les autres applications du Microsoft Store.
La suite d'outils Sysinternals contient des utilitaires très intéressants pour les administrateurs système et certains d'entre eux sont très connus, notamment PSExec, Sysmon, Process Monitor et Process Explorer. D'ailleurs, PSExec est un utilitaire qui permet d'exécuter des commandes sur un système distant, et il est parfois utilisé par certains malwares. Quant à Sysmon, je vous rappelle qu'il y a quelques jours, Microsoft a publié une version open source sur GitHub à destination de Linux !
Ces outils sont téléchargeables dans un package unique nommé Sysinternals Suite ou un par un, c'est au choix. Dans tous les cas, il n'était pas possible d'obtenir des mises à jour automatiques de ces outils. Désormais, les choses vont changer puisque la suite Sysinternals est disponible dans le Microsoft Store, aussi bien sur Windows 10 que sur Windows 11.
La suite Sysinternals dans le Microsoft Store
Lorsqu'une prochaine version sera disponible, le paquet sera mis à jour sur le Store et il sera possible de bénéficier de la mise à jour automatiquement. Désormais, ce paquet est également disponible avec WinGet, le gestionnaire de paquets développé par Microsoft.
Pour le moment, l'inconvénient c'est que vous devez installer toute la suite Sysinternals pour bénéficier des mises à jour automatiques. Il n'est pas possible de récupérer seulement Process Explorer via cette méthode, par exemple.