Manuel:Sécuriser les mots de passe de la base de données

This page is a translated version of the page Manual:Securing database passwords and the translation is 100% complete.

LocalSettings.php contient par défaut les identifiants et mots de passe de la base de données MySQL. Garder ces identifiants dans LocalSettings.php est risqué, car sous certaines et rares conditions, les fichiers PHP peuvent être servis en tant que texte brut, et révéler ces identifiants au monde entier :

  • PHP est désactivé sur le serveur
  • PHP est cassé
  • Vous avez le script CGI search.pl (un script de recherche très courant) quelque part sur ce domaine.

Description de l'exploit.

Si dans ces rares cas, vous souhaitez garder vos noms d'utilisateurs et mots de passe MySQL secrets, alors ils ne devraient pas faire partie du fichier LocalSettings.php.

Garder les mots de passe MySQL en dehors de la racine du web

Vous ne devriez jamais mettre vos mots de passe MySQL dans un fichier texte à la racine du web. Vous pouvez l'éviter en faisant ainsi:

  • Créer un dossier hors de votre racine web. Par exemple, si votre site web est situé à "/htdocs/www-wiki", créez un répertoire appelé "external_includes" en dehors de votre racine web :
    • mkdir /external_includes
  • Créez un fichier dans le répertoire que vous venez de créer, appelé le quelque chose comme "mysql_pw.php" et placez une variable sur une ligne séparée pour chacun de vos nom d'utilisateur, mot de passe, nom d'hôte et nom de base de données mysql, chaque variable étant définie sur les valeurs réelles. Par exemple, en utilisant nano comme éditeur :
    • nano /external_includes/mysql_pw.php
    • Tapez les lignes suivantes en utilisant les valeurs réelles, bien sûr à la place de "mysql_" entre crochets :
<?php
  $wgDBserver = "[mysql_host]";
  $wgDBname = "[mysql_db_name]";
  $wgDBuser = "[mysql_user]";
  $wgDBpassword = "[mysql_password]";
  
  // more confidential data...
?>
  • Veillez à ne laisser aucun espace (lignes vides) après le texte.
  • Enregistrez et fermez le fichier. Dans nano c'est : Ctr+O (sauvegarder) et Ctr+X (fermer)

Vérifiez auprès de votre fournisseur d'accès quel est l'utilisateur du serveur web. Cela varie et les exemples incluent "apache", "www-data", "nobody", "httpd". Définissez ensuite les autorisations pour le fichier des mots de passe de cette manière :

  • chgrp apache mysql_pw.php
  • chmod 640 mysql_pw.php (supprime les droits d'accès des autres et les droits d'écriture du serveur web)
  • (probablement répéter avec g-rxw ... pour LocalSettings.php)
  • Assurez-vous que le propriétaire du fichier a r (ou chmod 400 LocalSettings.php)
  • Modifiez votre fichier LocalSettings.php et ajoutez la ligne suivante au début du fichier :
require_once "/external_includes/mysql_pw.php"; //require_once "[FULL ABSOLUTE PATH TO mysql_pw.php]";
  • Supprimez maintenant ces variables de LocalSettings.php :
$wgDBserver
$wgDBname
$wgDBuser
$wgDBpassword

De cette façon, si quelqu'un est capable d'accéder et d'afficher LocalSettings.php, tout ce qu'ils verront, ce sont des paramètres plutôt que le mot de passe, le nom d'utilisateur, etc. de votre base de données MySQL et le vrai fichier contenant ces informations sont bloquées sur le serveur web. Vous devez toujours vous assurer que LocalSettings.php est en lecture seule pour l'utilisateur Apache comme décrit ci-dessus.

Si vous effectuez ces modifications et que vous n'avez pas accès aux utilisateurs parce que votre fournisseur de serveur Web ne vous le permet pas, alors, à partir du ftp, les droits minimaux que vous devez définir pour vos "external_includes" 2ont: drwx--x--x (711). Pour le fichier "mysql_pw.php", vous devrez définir rw-r--r-- (644), sinon votre wiki ne fonctionnera pas. Néanmoins, votre mot de passe est sécurisé car le fichier contenant des informations critiques n'est pas accessible sur le Web.
Si vous ne pouvez pas créer de fichiers en dehors de votre racine Web, vous pouvez toujours obtenir une certaine protection en suivant le processus ci-dessus et en utilisant un nom de fichier tel que .htdbpasswd dans votre racine Web au lieu de mysql_pw.php, car la plupart des serveurs Web sont configurés pour refuser l'accès à tous les fichiers commençant par .ht*

Voir aussi

  • Le paramètre $wgSMTP pour envoyer les courriels contient le nom de l'utilisateur et le mot de passe. Il peut être sécurisé de la même manière.