web-dev-qa-db-fra.com

Comment sécuriser les mots de passe de base de données en PHP?

Quand une application PHP établit une connexion à une base de données, elle doit bien sûr généralement passer un identifiant et un mot de passe. Si j'utilise un seul identifiant et une autorisation minimale pour mon application, alors le PHP doit savoir cet identifiant et ce mot de passe quelque part. Quel est le meilleur moyen de sécuriser ce mot de passe? Il semble que le fait d'écrire dans le code PHP n'est pas une bonne idée.

387
user18359

Plusieurs personnes ont mal interprété cela comme une question sur la manière de stocker les mots de passe dans une base de données. C'est faux. Il s'agit de la façon de stocker le mot de passe qui vous permet d’obtenir to la base de données.

La solution habituelle consiste à déplacer le mot de passe du code source dans un fichier de configuration. Laissez ensuite l’administration et la sécurisation de ce fichier de configuration à vos administrateurs système. De cette manière, les développeurs n'ont pas besoin de connaître les mots de passe de production et le mot de passe n'est pas enregistré dans votre contrôle de code source.

228
user11318

Si vous hébergez sur le serveur de quelqu'un d'autre et que vous n'avez pas accès en dehors de votre racine Web, vous pouvez toujours mettre votre mot de passe et/ou votre connexion à la base de données dans un fichier, puis verrouiller le fichier à l'aide d'un fichier .htaccess:

<files mypasswdfile>
order allow,deny
deny from all
</files>
100
kellen

Le moyen le plus sûr est de ne pas avoir les informations spécifiées dans votre code PHP.

Si vous utilisez Apache, cela signifie définir les détails de la connexion dans votre fichier de fichier httpd.conf ou hôtes virtuels. Si vous faites cela, vous pouvez appeler mysql_connect () sans aucun paramètre, ce qui signifie que PHP ne fournira jamais vos informations.

Voici comment vous spécifiez ces valeurs dans ces fichiers:

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.Host      server

Ensuite, vous ouvrez votre connexion mysql comme ceci:

<?php
$db = mysqli_connect();

Ou comme ceci:

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.Host"));
41
Lars Nyström

Stockez-les dans un fichier en dehors de la racine Web.

39
da5id

Pour les systèmes extrêmement sécurisés, nous chiffrons le mot de passe de la base de données dans un fichier de configuration (lui-même sécurisé par l'administrateur système). Au démarrage de l'application/du serveur, l'application demande ensuite à l'administrateur système la clé de déchiffrement. Le mot de passe de la base de données est ensuite lu à partir du fichier de configuration, déchiffré et stocké en mémoire pour une utilisation ultérieure. Toujours pas 100% sécurisé car il est stocké dans la mémoire déchiffrée, mais vous devez l'appeler "suffisamment sécurisé" à un moment donné!

34
pdavis

Cette solution est générale, en ce sens qu’elle est utile pour les applications à source ouverte et à source fermée.

  1. Créez un utilisateur de système d'exploitation pour votre application. Voir http://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. Créer une variable d'environnement de système d'exploitation (non-session) pour cet utilisateur, avec le mot de passe
  3. Exécuter l'application en tant qu'utilisateur

Avantages:

  1. Vous ne vérifierez pas vos mots de passe dans le contrôle de source par accident, car vous ne pouvez pas
  2. Vous ne bousillerez pas accidentellement les autorisations de fichiers. Eh bien, vous pourriez, mais cela n'affectera pas cela.
  3. Ne peut être lu que par root ou cet utilisateur. Root peut lire tous vos fichiers et clés de cryptage de toute façon.
  4. Si vous utilisez le cryptage, comment stockez-vous la clé en toute sécurité?
  5. Fonctionne sur la plate-forme x
  6. Veillez à ne pas transmettre l'envvar à des processus enfants non fiables.

Cette méthode est suggérée par Heroku, qui a beaucoup de succès.

14
Neil McGuigan

s'il est possible de créer la connexion à la base de données dans le même fichier où les informations d'identification sont stockées. Insérez les informations d'identification dans l'instruction de connexion.

mysql_connect("localhost", "me", "mypass");

Sinon, il est préférable de supprimer les informations d'identification après l'instruction de connexion, car les informations d'identification qui ne sont pas en mémoire ne peuvent pas être lues à partir de la mémoire ;)

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  
10
Bob Fanger

Vos choix sont en quelque sorte limités car vous avez besoin du mot de passe pour accéder à la base de données. Une approche générale consiste à stocker le nom d'utilisateur et le mot de passe dans un fichier de configuration séparé plutôt que dans le script principal. Assurez-vous ensuite de le stocker en dehors de l'arborescence Web principale. C'était s'il y a un problème de configuration Web qui laisse vos fichiers php simplement affichés sous forme de texte plutôt que d'être exécutés, vous n'avez pas exposé le mot de passe.

En dehors de cela, vous êtes sur les bonnes lignes avec un accès minimal au compte utilisé. Ajouté à cela

  • N'utilisez pas la combinaison nom d'utilisateur/mot de passe pour autre chose
  • Configurez le serveur de base de données pour n'accepter que les connexions de l'hôte Web pour cet utilisateur (localhost est encore meilleur si la base de données se trouve sur le même ordinateur). machine.
  • Obfusquer le mot de passe (même ROT13 le fera), il ne mettra pas beaucoup de défense en garde si certains ont accès au fichier, mais au moins, cela empêchera de le consulter de manière fortuite.

Peter

7
Vagnerr

Si vous utilisez PostgreSQL, le système recherche automatiquement les mots de passe dans ~/.pgpass. Voir le manuel pour plus d'informations.

7
Jim

Auparavant, nous stockions des utilisateurs/pass de base de données dans un fichier de configuration, mais nous avons depuis lors atteint le mode paranoïaque - en adoptant une politique de défense en profondeur .

Si votre application est compromise, l'utilisateur aura un accès en lecture à votre fichier de configuration. Il est donc possible qu'un pirate informatique lise ces informations. Les fichiers de configuration peuvent également être pris dans le contrôle de version ou copiés sur des serveurs.

Nous sommes passés au stockage utilisateur/pass dans les variables d’environnement définies dans Apache VirtualHost. Cette configuration est uniquement lisible par root. J'espère que votre utilisateur Apache ne fonctionne pas en tant que root.

Le problème avec ceci est que maintenant le mot de passe est dans une variable globale PHP.

Pour atténuer ce risque, nous prenons les précautions suivantes:

  • Le mot de passe est crypté. Nous étendons la classe PDO à la logique de décryptage du mot de passe. Si quelqu'un lit le code où nous établissons une connexion, il ne sera pas évident que la connexion est établie avec un mot de passe crypté et non le mot de passe lui-même.
  • Le mot de passe crypté est déplacé des variables globales vers une variable privée L'application le fait immédiatement pour réduire la fenêtre indiquant que la valeur est disponible dans l'espace global.
  • phpinfo() est désactivé. PHPInfo est une cible facile à utiliser pour obtenir une vue d'ensemble de tout, y compris des variables d'environnement.
5
Courtney Miles

Placez le mot de passe de la base de données dans un fichier, en lecture seule pour l'utilisateur qui fournit les fichiers.

À moins que vous n'ayez certains moyens d'autoriser uniquement le processus du serveur php à accéder à la base de données, c'est quasiment tout ce que vous pouvez faire.

5
Chris

Si vous parlez du mot de passe de la base de données, par opposition au mot de passe d'un navigateur, la pratique habituelle semble être de le placer dans un fichier de configuration PHP sur le serveur.

Vous devez simplement vous assurer que le fichier php contenant le mot de passe dispose des autorisations appropriées. C'est à dire. il ne doit être lisible que par le serveur Web et par votre compte utilisateur.

4
Jason Wadsworth

Nous l'avons résolu de cette façon:

  1. Utilisez memcache sur le serveur, avec une connexion ouverte depuis un autre serveur de mots de passe.
  2. Enregistrez dans memcache le mot de passe (ou même tout le fichier password.php chiffré) plus la clé de déchiffrement.
  3. Le site Web appelle la clé memcache contenant la phrase secrète du fichier de mots de passe et décrypte en mémoire tous les mots de passe.
  4. Le serveur de mots de passe envoie un nouveau fichier de mots de passe crypté toutes les 5 minutes.
  5. Si vous utilisez password.php chiffré sur votre projet, vous placez un audit qui vérifie si ce fichier a été touché de manière externe - ou visualisé. Lorsque cela se produit, vous pouvez automatiquement nettoyer la mémoire, ainsi que fermer le serveur pour l'accès.
3
Asi Azulay

Une astuce supplémentaire consiste à utiliser un fichier de configuration séparé PHP qui ressemble à ceci:

<?php exit() ?>

[...]

Plain text data including password

Cela ne vous empêche pas de définir correctement les règles d'accès. Mais si votre site Web est piraté, un "requis" ou un "inclure" quittera simplement le script à la première ligne, ce qui rendra encore plus difficile l'obtention des données.

Néanmoins, ne laissez jamais les fichiers de configuration dans un répertoire accessible via le Web. Vous devriez avoir un dossier "Web" contenant votre code de contrôleur, css, images et js. C'est tout. Tout le reste est placé dans des dossiers hors connexion.

3
e-satis

Le meilleur moyen est de ne pas stocker le mot de passe du tout!
Par exemple, si vous utilisez un système Windows et que vous vous connectez à SQL Server, vous pouvez utiliser l'authentification intégrée pour vous connecter à la base de données sans mot de passe, en utilisant l'identité du processus en cours.

Si vous devez vous connecter avec un mot de passe, commencez par encrypt, en utilisant un cryptage renforcé (par exemple, en utilisant AES-256, puis protégez la clé de cryptage, ou en utilisant un cryptage asymétrique et laissez le système d'exploitation protéger le cert) , puis enregistrez-le dans un fichier de configuration (en dehors du répertoire Web) avec ACL fortes.

3
AviD

Il suffit de le placer dans un fichier de configuration quelque part, comme cela se fait habituellement. Assurez-vous simplement de:

  1. interdire l'accès à la base de données à partir de serveurs extérieurs au réseau,
  2. veillez à ne pas montrer accidentellement le mot de passe aux utilisateurs (dans un message d'erreur ou via PHP fichiers accidentellement servis au format HTML, etc.)
3
Marijn