web-dev-qa-db-fra.com

Quelle est la meilleure façon de conserver les mots de passe configurables, sans les mettre trop facilement à la disposition du lecteur humain occasionnel?

J'ai une base de données à laquelle de nombreuses applications clientes différentes (une poignée de services Web, certaines Java et quelques applications dot net)) se connectent. Toutes ne fonctionnent pas sur Windows (Malheureusement, sinon cela rendrait cela une question de réponse facile avec juste l'activation de l'authentification Windows pour les connexions à la base de données. Pour le moment, les mots de passe sont stockés dans divers fichiers de configuration/propriétés situés autour des systèmes. Idéalement, seul le personnel de support a accès aux serveurs où le les fichiers sont en cours d'exécution, mais si quelqu'un d'autre accède à l'un des serveurs, il disposerait de suffisamment d'autorisations de base de données pour obtenir un bon nombre de données en l'état.

Ma question est alors la suivante: quelle est la meilleure façon de conserver les mots de passe configurables sans les mettre trop facilement à la disposition du lecteur humain occasionnel?

Edit Juste pour clarifier, le serveur de base de données est Windows Server 2003, exécutant MSSQL 2005.

PS: Je ne vois aucune question que cela reproduise, mais s'il y en a, n'hésitez pas à fermer celle-ci.

40
AshtonKJ

Je suppose que vous voulez cacher les mots de passe aux observateurs occasionnels. S'ils étaient mauvais, des observateurs aux yeux d'acier ayant accès à tout le code source sur l'une des machines qui se connectent, ils peuvent obtenir le mot de passe avec un peu d'ingénierie inverse.

N'oubliez pas que vous n'avez pas besoin d'utiliser la même protection pour chaque client différent. Quelques pas:-

  1. Créez différents comptes de base de données pour différents systèmes qui accèdent à votre base de données
  2. Limitez l'accès à la base de données uniquement à ce dont ils ont besoin à l'aide de vos subventions de base de données intégrées
  3. Stockez une triple DES (ou autre) clé dans une classe de gestionnaire de mots de passe sur votre base de données. Utilisez-la pour déchiffrer une valeur chiffrée dans votre fichier de propriétés.

Nous avons également envisagé de demander à l'application une phrase secrète au démarrage, mais nous ne l'avons pas mise en œuvre, car cela semble difficile et votre personnel d'exploitation doit alors connaître le mot de passe. C'est probablement moins sécurisé.

17
WW.

Supposons le scénario commun suivant:

  • Vous utilisez la même base de code pour tous les environnements et votre base de code a les mots de passe de base de données pour chaque environnement.

  • Le personnel (administrateurs système, gestionnaires de configuration) qui a accès à votre serveur d'applications de production est autorisé à connaître les mots de passe de la base de données de production et personne d'autre.

  • Vous ne voulez pas que quiconque ayant accès au code source sache quels sont les mots de passe de production.

Dans un scénario comme celui-ci, vous pouvez crypter et stocker les mots de passe de production dans des fichiers de propriétés que votre application. Dans l'application, vous pouvez inclure une classe qui lit les mots de passe du fichier de propriétés et les déchiffre avant de les transmettre au pilote de base de données. Cependant, la clé et l'algorithme utilisés pour déchiffrer le mot de passe ne font pas partie du code source mais sont plutôt transmis à l'application en tant que propriété système lors de l'exécution. Cela dissocie la connaissance de la clé du code source de l'application et toute personne ayant accès uniquement au code source de l'application ne sera plus en mesure de décrypter le mot de passe car elle n'a pas accès à l'environnement d'exécution de l'application (serveur d'application).

Si vous utilisez Java jetez un œil à this pour un exemple plus concret. L'exemple utilise Spring et Jasypt. Je suis convaincu qu'une telle chose peut être extrapolée à d'autres environnements comme .Net

10
neesh

Sur mon ancien lieu de travail, nous avions un système par lequel tous les mots de passe étaient cryptés (en utilisant Triple DES ou tout ce que nous utilisions à l'époque). Les mots de passe étaient souvent stockés dans des fichiers de propriétés (c'était dans un Java).

Lorsque le mot de passe devait être changé, nous pouvions simplement utiliser "! Texte en clair" comme valeur, puis notre code le chargeait, le chiffrait et stockait la valeur chiffrée dans le fichier de propriétés.

Cela signifiait qu'il était possible de changer le mot de passe sans savoir quelle était la valeur d'origine - je ne sais pas si c'est le genre de chose que vous demandiez!

4
user7094

Il semble qu'il n'y ait pas de réponse facile (en raison des différents types d'applications qui se connectent) ... vraiment, le seul problème que je vois est les Java applications qui semblent se connecter directement à votre base de données . Est-ce exact?

Si oui, voici ce que vous pouvez faire:

1) Modifiez toutes les applications côté client qui se connectent directement à la base de données pour passer par un service. (S'ils ont pour se connecter directement, alors donnez-leur au moins une première étape pour "obtenir le mot de passe" d'un service, alors ils peuvent se connecter directement).

2) Stockez les mots de passe dans le fichier web.config (si vous avez choisi de faire des services Web .Net), puis chiffrez la section "chaînes de connexion" du fichier.

3
Timothy Khouri

N'utilisez pas de mots de passe, l'authentification de serveur à serveur peut généralement être effectuée à l'aide d'un fichier de clé ou d'un certificat client ou d'une autre manière qu'un mot de passe.

2
paan

Vous pouvez utiliser un algorithme de chiffrement réversible, par exemple Blowfish pour stocker les mots de passe comme mesure provisoire. Il devrait y avoir un certain nombre de bibliothèques gratuites que vous pouvez utiliser pour l'intégrer dans tous vos programmes qui ont besoin de cet accès.

La page de Bruce Schneier sur Blowfish

Article Wikipedia sur Blowfish

0
Bork Blatt

Pour le Java stuff, si vous utilisez un serveur d'applications, voyez si vous pouvez définir une source de données, et vos applications peuvent accéder à la source de données à l'aide de JNDI. De cette façon, la gestion de la source de données ( y compris les détails de connexion) est géré par le serveur d'applications, et votre code d'application doit faire est de demander une source de données.

0
tunaranch

L'authentification NTLM ou l'authentification basée sur LDAP (Active Directory) devrait être à votre disposition avec un peu d'effort. Cela vous permettrait d'utiliser votre "authentification Windows" entre les applications.

Cela peut signifier un peu de migration pour votre personnel d'exploitation, mais l'authentification unique pour un ensemble d'applications est agréable.

0
Ken Gentle

Oui, je suis d'accord avec l'option de stockage des hachages (salés). Je recommanderais un hachage SHA256 (salé) du mot de passe stocké dans la base de données. N'oubliez pas non plus d'appliquer des règles de mot de passe sécurisées.

0
meme