En regardant la structure de la plupart des sites Web basés sur PHP / MySQL que j'ai vus, il semble qu'il n'est pas très difficile de discerner le mot de passe de la base de données si vous creusez un peu, car il y a toujours un fichier d'installation ou de configuration quelque part qui stocke les informations pour la journalisation dans la DB. Outre la précaution de base de m'assurer que les privilèges de ma base de données sont correctement restreints pour les requêtes distantes, quelles options sont disponibles que je pourrais implémenter dans mes propres projets pour protéger ces informations?
18
Réponses:
Pas une réponse directe sur le stockage des mots de passe, mais j'utilise généralement au moins deux connexions à la base de données lors de la création d'applications Web - l'une est utilisée à 99% du temps pour les activités liées à l'utilisateur, avec des privilèges restreints, et l'autre est utilisée pour la fonctionnalité «admin» (supprimer des utilisateurs, etc.).
Dans quelques cas, où j'installe le package de quelqu'un d'autre, j'installe deux instances ... une instance ouverte au public qui n'a accès à la base de données que pour effectuer les tâches générales de type utilisateur, et une deuxième instance limitée par IP à mon sous-réseau local (peut-être même sur une autre machine) qui doit être utilisé pour toutes les activités de type «admin». Aucun des deux n'a accès à la modification des tables, etc., cependant ... Je préfère entrer via les outils de base de données natifs plutôt que de permettre à la webapp d'exécuter ses propres tâches de mise à jour qui n'ont pas été vérifiées.
Vous pouvez aller encore plus loin et ajouter plus de connexions spécifiquement pour des tâches données ... afin que les tâches de création d'utilisateur et de gestion des mots de passe passent par un utilisateur qui a des privilèges supplémentaires sur les tables d'utilisateurs, la connexion a des privilèges de base de données à authentifier et pas grand-chose d'autre , etc.
De cette façon, s'il y a une attaque par injection sql, sur la plupart des pages Web, il ne peut pas vraiment faire quoi que ce soit de significatif - ne peut pas voir les hachages de mot de passe, ne peut pas ajouter un nouvel utilisateur administrateur (pas qu'ils pourraient le faire) quoi que ce soit de toute façon), etc. Cela n'aidera toujours pas s'ils parviennent à obtenir un shell sur votre machine, mais cela les ralentira.
la source
Utilisez des mots de passe à usage unique , Kerberos , LDAP ou autre pour stocker vos données de compte et authentifier / autoriser les utilisateurs. Les services d'annuaire sont un bon moyen de stocker des informations sur les utilisateurs et de les utiliser comme backend pour les données de compte.
la source
Je suis un grand fan de l'utilisation de l'authentification 'Ident' de PostgreSQL sur les sockets locaux chaque fois que je le peux. De cette façon, les utilisateurs locaux sont directement mappés aux utilisateurs Unix / Windows de l'ordinateur local, et je n'ai pas du tout à me soucier de stocker des mots de passe. Cependant, je ne pense pas que ce soit une option dans MySQL.
Lorsque la base de données et le serveur Web se trouvent sur deux machines distinctes, j'utilise des mots de passe MD5 sur SSL: si un hostile a accès à mon serveur frontal, ce n'est qu'une question de temps avant qu'il ne comprenne comment il communique avec la base de données.
la source
Si vous utilisez le .NET Framework, vous pouvez envisager d'utiliser des chaînes de connexion chiffrées. Je ne sais pas si une telle chose est possible dans d'autres langages / frameworks, mais ce serait une autre sauvegarde pour s'assurer que vos connexions ne sont pas compromises.
En dehors de l'utilisation de chaînes de connexion chiffrées, l'utilisation de LDAP / Kerberos / Active Directory sera votre option la plus sûre.
la source
Si vos mots de passe sont stockés en texte brut, utilisez les hachages (MD5, SHA), Luke!
la source
Selon votre langage de programmation, vous pouvez crypter les informations d'identification de connexion, mais si vous exécutez un langage interprété, il n'y a aucun moyen de garantir que quelqu'un ne puisse pas comprendre les informations d'identification s'il accède au système.
Si vous exécutez C ++ ou similaire, je vous recommande de créer / trouver une fonction de cryptage / décryptage salée et d'exécuter les informations d'identification à travers cela et de stocker le hachage résultant sous forme de fichier sur le système.
Si vous exécutez PHP ou similaire, je vous recommande d'écrire un wrapper pour le
mcrypt_encrypt()
et de saler les informations d'identification, puis d'exécuter un obscurcissement de code pour ralentir les pirates s'ils parviennent à accéder au système.la source