Question:
Puis-je cacher quel compte de ma base de données est le compte administrateur, afin qu'un attaquant ne sache pas quel hachage pirater en premier?
Melkor
2017-05-02 13:45:36 UTC
view on stackexchange narkive permalink

Disons que j'avais une base de données qui ressemblait à ceci:

  Nom Mot de passe hash (bcrypt) Statut -------------------- -------------------------------------------------- ---------- Dave 2 ans $ 10SyyWTpNB.TyWd3nM hQ41frOtObcircAb3nJw1Cf9dC6CT7tVIEb6XS StandardSarah 2 ans $ 10 $ fUJrNA200sXgWUJAP7XEiuq4itHa43YYWJVIpc. AdminMike $ 2y $ 10 $ 01jx7u7hnfKOzBYyjNWskOPQ23w1Cf1gNiv42wsKqXKOf8filzS02 Standard 

Si un attaquant accédait à cette base de données, il verrait immédiatement que Sarah est un administrateur, et se concentrerait probablement sur la rupture de ce mot de passe, alors il pourrait probablement se concentrer sur la rupture de ce mot de passe avoir plus de puissance. Est-il possible que je puisse cacher si quelqu'un est ou non un administrateur dans la base de données afin qu'un attaquant ne sache pas qui sont les administrateurs? Je pourrais simplement hacher la valeur (standard ou admin) mais cela ne donnerait qu'un bit d'entropie, et j'espère avoir un peu plus de sécurité que cela.

Un attaquant pourrait également simplement regarder l'entrée la plus ancienne.Dans la plupart des systèmes, ce sera le compte administrateur :)
@Nat - Comment exactement pourraient-ils se connecter en utilisant uniquement le hachage?Cela n'a pas de sens pour moi, bien qu'il soit logique de simplement vous connecter en tant qu'utilisateur jusqu'à ce que vous trouviez un administrateur.
Il y a longtemps dans un univers très lointain, j'ai dû mettre en œuvre quelque chose de similaire.La façon dont je l'ai fait était: ajouter une lettre au mot de passe lorsqu'il était haché (en fait plusieurs lettres, c'était un "identifiant de groupe") et faire essayer toutes les combinaisons par le mécanisme d'authentification.
Ce serait plus simple et vous feriez mieux d'ajouter 1 bit d'entropie au mot de passe (hachage), doublant effectivement l'effort moyen d'une attaque par force brute réussie, plutôt que de priver l'attaquant de 1 bit d'informations de reconnaissance.En outre, il ne faut pas beaucoup plus de temps pour forcer brutalement une pré-image pour 1 million de hachages que pour une seule (en supposant une entropie réelle de pré-image égale).
Cette colonne est-elle lisible pour les utilisateurs normaux?
@DavidFoerster Il s'agit de plus d'un bit d'information car il peut y avoir beaucoup d'utilisateurs.Et casser un hachage de mot de passe n'est pas la même chose que trouver une pré-image d'une valeur de hachage pour deux raisons: «1.» La plupart des mots de passe ont beaucoup moins d'entropie que la taille de la sortie de hachage.`2.` Ces valeurs de hachage semblent salées.
@kasperd: Vous faites un bon point sur l'entropie du mot de passe que j'ai considéré mais laissé de côté par souci de brièveté et de l'hypothèse raisonnable suivante: le mot de passe administrateur aura une entropie beaucoup plus élevée que le mot de passe moyen du compte et sera probablement parmi les derniers à êtretrouvé lors d'une attaque de dictionnaire typique qui essaie des mots de passe courts avant des mots de passe plus longs et des mots communs avant des mots moins courants avant des séquences de caractères aléatoires.
@kasperd: À propos du peu d'information: Il peut y avoir plus de 2 types de comptes, mais dans ce scénario, l'attaquant ne se soucie que de la distinction binaire entre admin et non-admin.
@DavidFoerster Ce que je veux dire, c'est que les informations que l'adversaire obtient en sachant à l'avance quels utilisateurs sont administrateurs sont plus proches de 1 bit par utilisateur que de 1 bit globalement.Et ce qui intéresse l'adversaire, ce ne sont que les mots de passe des administrateurs.Si tous les mots de passe de la base de données étaient aussi forts qu'un bit de connaissance par utilisateur pourrait beaucoup aider l'adversaire.Cependant, comme vous le faites remarquer, les mots de passe administrateur sont probablement plus forts en moyenne que les autres mots de passe.Et cela signifie que savoir quels utilisateurs sont des administrateurs vaut beaucoup moins pour l'attaquant.
Pourquoi aurait-on besoin de déchiffrer le mot de passe administrateur lorsque l'accès au système est déjà acquis?
L'attaquant d'@JonasDralle a peut-être acquis les hachages d'une sauvegarde ayant subi une fuite.Les administrateurs peuvent avoir utilisé le même mot de passe pour plus d'un système.
Peut-être qu'au lieu de masquer vos données, appliquez l'authentification basée sur les certificats.
Si l'attaquant peut analyser votre base de données, vous avez déjà un problème bien plus important que celui-ci.
Les certificats clients @JonasDralle TLS ont leurs propres problèmes.Voir par exemplehttps://utcc.utoronto.ca/~cks/space/blog/tech/TLSClientCertificateWhen
N'est-ce pas essentiellement Kerberos?:)
Si le pirate a accès à votre base de données, pourquoi ne pas essayer de pirater tous les comptes, puis changer simplement le statut en Admin?
@MatthewWhited: Il pourrait s'agir d'un accès en lecture seule.
Ajouter plus d'entropie au hachage est également de peu de valeur ... le vrai problème avec les mots de passe est que les gens utilisent des mots faciles à deviner ou les écrivent s'ils sont forcés d'utiliser des mots aléatoires (ish).Pourquoi ne pas implémenter plutôt une authentification à deux facteurs?Google Authenticator est gratuit pour toute personne possédant un smartphone.Ou même simplement retirer "Dave" etc. et insister sur un choix aléatoire parmi 1,6 milliard d'identifiants de la forme (raisonnablement mémorable) aannaann.
Neuf réponses:
Black Magic
2017-05-02 13:56:26 UTC
view on stackexchange narkive permalink

Je dirais que c'est un peu trop difficile compte tenu de ce que vous en retirez. Je pense que lorsque l'attaquant a accès à la base de données, vous avez des problèmes bien plus importants. Obfusquer le statut d'administrateur d'un utilisateur coûtera juste un peu plus de temps à l'attaquant, mais un APT (Advanced Persistent Threat) ne serait probablement pas découragé par ce fait.

Exactement.Obfusquer le statut de l'administrateur est aussi inutile que d'essayer de coller vos affaires au sol afin que les cambrioleurs ne puissent pas l'obtenir - ils peuvent toujours le faire et le feront.Vous voulez empêcher le cambrioleur d'entrer à la place.
@JamesCameron à moins que vos «effets personnels» ne soient constitués de clous de 10 pouces.Ensuite, je pense que le cambrioleur pourrait se demander ce qui ne va pas chez vous ... et vous signaler comme fou.
@TheGreatDuck - alors que des clous de neuf pouces seraient bien sûr parfaitement raisonnables.
@TheGreatDuck: Je dis à ma femme que ce sont des clous de 10 ", mais ce ne sont vraiment que des clous de 8,5".
@PieterGeerkens: Et c'est pourquoi elle ne peut pas se garer en parallèle.
@PieterGeerkens qui est encore trop optimiste ...;)
schroeder
2017-05-02 14:08:08 UTC
view on stackexchange narkive permalink

La sécurité par obfuscation a au mieux une efficacité limitée - pour déterminer si elle est appropriée, vous devez comprendre les menaces que vous souhaitez contrer. Si un acteur de la menace peut lire directement votre base de données, quel avantage y a-t-il à masquer un détail stocké particulier?

S'il y a l'avantage de l'obscurcissement (assurez-vous que vous pouvez vraiment le prouver), alors utilisez le type d'obfuscation qui traite cette menace (valeurs chiffrées, sources de données hors ligne, hachage, etc.).

bdsl
2017-05-03 02:12:49 UTC
view on stackexchange narkive permalink

Je suis d'accord avec Black Magic que cela ne vaut probablement pas la peine, mais si vous le souhaitez, vous pouvez utiliser une fonction de dérivation de clé pour créer une clé de chiffrement basée sur le mot de passe, et l'utiliser pour chiffrer le contenu de la colonne Statut.

Le statut devrait potentiellement être conservé en mémoire pour toutes les sessions utilisateur ouvertes, afin que celles-ci soient toujours vulnérables à l'attaquant.

Cela signifierait que vous ont les mêmes restrictions que votre attaquant, en supposant que vous ne connaissez pas les mots de passe de vos utilisateurs. Vous ne pourriez pas lire le statut de la base de données, et si vous vouliez changer le statut d'un utilisateur, vous devrez changer son mot de passe en même temps.

En fait, vous pouvez changer un statut en non-administrateur sans connaître le mot de passe - entrez simplement une valeur aléatoire dans le champ et comptez sur la probabilité pratiquement nulle que cela puisse correspondre au texte chiffré pour 'admin'.Le code qui le lit devra tolérer des valeurs inattendues.
Ou vous pouvez avoir une colonne de base de données 'newStatus' et la définir à la place, en texte brut, puis l'effacer lorsque l'utilisateur se connecte et que vous mettez à jour l'état chiffré.
Cela signifie également que vous ne pouvez pas avoir de fonction de récupération de mot de passe sans perdre le statut du compte.
Bon point @MichaelKjörling qui serait probablement un facteur décisif.
phyrfox
2017-05-03 00:34:18 UTC
view on stackexchange narkive permalink

De nombreux systèmes modernes séparent en fait la connexion de l'utilisateur (comment il s'authentifie) de ses «profils» (autorisations dont il dispose), implémentés sous la forme de deux ou plusieurs systèmes discrets. Votre serveur de connexion pourrait simplement avoir un GUID, un nom d'utilisateur haché et un mot de passe haché; en cas de connexion réussie, transférez la session sur le serveur d'applications. Tant que votre serveur d'applications n'est pas compromis, la base de données de connexion est inutile même si elle est vidée.

Comme étape supplémentaire, vous pouvez également crypter les données de l'utilisateur avec une clé du serveur de connexion (stockée dans le cadre de la session), ce qui rend également le serveur d'applications plus sécurisé. Deux systèmes sont généralement plus difficiles à vaincre qu'un. Cependant, si vous n'êtes pas prêt à configurer deux serveurs (ou clusters), et que tout cela semble être trop de travail, alors vous êtes probablement mieux avec votre conception actuelle de toute façon. Le simple fait de savoir quels comptes cibler ne facilite pas la tâche; si l'attaquant peut en casser un, il peut tous les casser avec le calcul parallèle.

satibel
2017-05-04 11:53:13 UTC
view on stackexchange narkive permalink

La suggestion de PlasmaHH était de: "ajouter une lettre au mot de passe lorsqu'il est haché (en fait plusieurs lettres, c'était un" identifiant de groupe ") et demander au mécanisme d'authentification d'essayer toutes les combinaisons."

Bien que ce soit quelque peu la sécurité par l'obscurité, et doit être associé à de bonnes pratiques telles que:

  • un facteur de travail important sur bcrypt
  • les administrateurs ayant un mot de passe fort
  • moyens d'empêcher l'attaquant d'avoir une copie de la base de données en premier lieu

C'est un bon moyen de ralentir suffisamment un attaquant pour que le mot de passe est changé avant d'être trouvé.

Cracker un mot de passe non trivial (en supposant que vous ayez utilisé un facteur de travail fort) peut prendre de quelques jours à quelques mois, donc c'est faisable, mais s'ils ne le font pas ' t savoir quel compte vaut la peine d'être piraté, cela les oblige à pirater chaque compte.

Donc, à moins qu'ils aient de la chance, ou que vous ayez nommé un compte administrateur "admin", ils devront essayer plusieurs comptes, ce sera faire leurs frais au moins une commande de mag nitude plus grande, ce qui oblige l'attaquant à attendre plus, à acheter plus d'énergie ou à abandonner.

En conclusion, ce n'est pas sans valeur, car c'est un moyen de dissuasion bon marché qui ne dérange pas l'utilisateur.

Notez que si vous avez des indices sur le fait que quelqu'un est administrateur, comme un message de quelqu'un d'autre modifié par lui (si seuls les administrateurs peuvent le faire), masquer son statut dans la base de données est inutile.

Comme d'autres l'ont mentionné, cela a des pièges comme vous empêcher de créer un utilisateur administrateur sans changer ou au moins demander son mot de passe.

Si disponible, demander une authentification à 2 facteurs pour les administrateurs serait probablement mieux moyen de sécuriser les comptes administrateur.

sebastian nielsen
2017-05-04 19:00:53 UTC
view on stackexchange narkive permalink

Oui, vous pouvez. Ajoutez simplement le statut d'administrateur dans le cadre du mot de passe.

comme: HereIsMe! 65371 = adminHereIsMe! 65370 = regular

Ensuite, lors de la connexion, essayez d'abord régulier puis admin, comme ceci:

  if (sha512 ($ password. "0") eq $ hash) {blabla user functions} else {if (sha512 ($ password. "1") eq $ hash) {blabla admin functions} else {show incorrect password message}}  

IMPORTANT: assurez-vous que quelqu'un ne peut pas modifier le dernier caractère de son propre mot de passe. Par exemple, assurez-vous que le formulaire d'inscription, le formulaire de mot de passe oublié et le formulaire de changement de mot de passe, ajoutez toujours un 0 ou un 1 à la fin du mot de passe en fonction de leur statut réel. cookie de session secondaire.

Cela rend pratiquement impossible de déduire l'état d'administrateur sans réussir à déchiffrer le mot de passe.

connaître le schéma et rechercher des 1 casse votre système - si vous avez un tableau séparé répertoriant les administrateurs, pourquoi ne pas l'utiliser au lieu de manipuler les mots de passe?et puis si vous avez ce tableau, comment le protégez-vous d'être lu avec le tableau mentionné dans la question?
aussi, c'est très similaire à la réponse de satibel
Comment?Le 1 est une partie hachée du mot de passe.Oui, vous pouvez dire à votre hashcracker d'ajouter 1 au mot de passe, mais vous ne saurez toujours pas quel compte est administrateur, vous devrez donc toujours craquer tous les comptes.
Si je me connecte en tant qu'administrateur, comment le système sait-il qu'il faut ajouter un 1 à mon mot de passe fourni avant le hachage?
@schroeder Tant que hash (mot de passe + '0')! = Hash (mot de passe + '1') cela fonctionnera très bien, bien qu'il semble assez dangereux de se tromper.Et cela signifie que vous ne pouvez pas réinitialiser le mot de passe d'un utilisateur sans réinitialiser ses droits d'accès et des problèmes similaires.
@schroeder Si vous vérifiez l'exemple de code, vous voyez qu'il essaiera d'abord de se connecter en tant qu'utilisateur normal, si le hachage ne correspond pas, il testera admin.L'astuce est qu'il n'est pas possible de savoir à l'avance quel utilisateur est administrateur, sans connaître son mot de passe.
@Voo Oui, vous êtes vrai que vous ne pouvez pas faire un "mot de passe oublié" sur un utilisateur sans que son droit d'accès administrateur soit réinitialisé à l'utilisateur.Mais bon, c'est en fait une bonne fonctionnalité de sécurité, car si certains piratent la fonction de réinitialisation du mot de passe, par exemple en piratant un compte de messagerie, les droits d'administrateur sont toujours en sécurité.Lors du changement de mot de passe, vous savez déjà par la session si l'utilisateur connecté est un administrateur ou un utilisateur.
Donc, ajouter un 0 pour les utilisateurs n'est pas nécessaire, vous pouvez simplement ajouter le 1 pour les administrateurs, mais comment le système sait-il que l'utilisateur devrait avoir ce bit supplémentaire ajouté en premier lieu?Pourquoi ne pas simplement coder en dur le hachage de l'administrateur avec votre exemple de code?Votre suggestion semble impossible à maintenir et certainement pas évolutive.
@schroeder Il est nécessaire d'ajouter 0 aux utilisateurs, sinon vous courez le risque que l'utilisateur ajoute 1 à son mot de passe et devienne administrateur.En codant en dur le hachage de l'administrateur, vous pouvez en déduire l'administrateur en regardant code + db.Mais avec mon idée, vous ne pouvez pas déduire qui est administrateur, même avec un accès aux deux.Vous pouvez essayer de déchiffrer le mot de passe et vérifier si 0 ou 1 correspond au hachage.
@schroeder Qu'est-ce qui n'est pas évolutif dans la solution?Vous pouvez étendre cela à autant d'autorisations que vous le souhaitez, même en autorisant les bitflags.Il est assez fragile et présente quelques inconvénients, mais il résout le problème donné.
Un autre problème avec des solutions comme celle-ci est qu'il devient difficile d'implémenter une interface permettant aux administrateurs de niveau supérieur de révoquer le statut d'administrateur des autres utilisateurs qui deviennent problématiques à la volée, car toute implémentation sensée de cela ne stockerait que le statut de l'administrateur lui-même dans les données de session surlogin et ne pouvait donc pas vérifier les rôles sur chaque demande pertinente, et donc la révocation de l'accès administrateur nécessite la suppression forcée des données de session de connexion afin que l'utilisateur doive se reconnecter.
C'est la seule réponse, qui répond correctement à la question.
cybernard
2017-05-04 06:19:08 UTC
view on stackexchange narkive permalink

Si votre base de données le prend en charge, configurez un serveur d'authentification LDAP ou similaire, et les informations d'identification ne seront pas stockées localement.

La question est de masquer l'autorisation, pas l'authentification - et rendre cette interrogation à partir d'une source distante peut aggraver la situation si elle n'est pas mise en œuvre correctement (les informations d'autorisation ne doivent être accessibles qu'en cas d'authentification réussie!)
@rackandboneman Le serveur en question n'aura pas d'informations d'identification sur le serveur, elles seront donc masquées.Si vous avez votre propre réseau et que vous rendez votre serveur d'authentification visible sur Internet, vous méritez d'être piraté.De toute évidence, vous devez utiliser TLS 2048 bits ou plus et bla bla ou tout ce qu'il permet.
S.C.
2017-05-05 09:50:49 UTC
view on stackexchange narkive permalink

Il y a plusieurs suggestions techniques intéressantes ici, mais il faut mentionner que même si vous les implémentez parfaitement, cette approche ne vous rapportera littéralement rien en cas d'intrusion pour les raisons suivantes:

  • Si quelqu'un a accès à la base de données (par injection SQL ou quelque chose du genre), il est certain qu'il peut faire ce qu'il veut sur votre serveur avec les autorisations de n'importe quel utilisateur sous lequel votre service de base de données s'exécute depuis la plupart des systèmes de gestion de base de données fournissent des fonctionnalités pour manipuler des fichiers et exécuter des processus sur leur hôte. Cela signifie que l'intrus peut modifier vos pages Web ou le traitement côté serveur pour capturer des mots de passe en clair lors de la connexion et obtenir très rapidement des mots de passe non chiffrés pour vos utilisateurs actifs. Je suppose que votre compte administrateur est un utilisateur actif.
  • Si quelqu'un accède à vos hachages de mot de passe, il ne va probablement pas sélectionner ceux qu'il doit essayer de déchiffrer en premier. Ils exécuteront simplement un cracker en masse pour les traiter tous en même temps et à chaque passage, il vérifiera tous les hachages de la table qu'ils traitent.
  • Même si vous avez conservé le hachage de votre mot de passe administrateur une table séparée ou en dehors de la base de données entièrement, la compromission de comptes moins privilégiés entraînera probablement une élévation de privilèges tant que l'intrusion n'est pas détectée puisque l'intrus sera en mesure de se faire passer pour des utilisateurs de confiance pour accéder à plus d'informations (en utilisant un compte modérateur pour parler avec l'administrateur et lancer le vol de cookies ou toute autre activité malveillante, par exemple).
  • Si votre site a des capacités sociales, il est très probable qu'il expose déjà d'autres moyens d'identifier les utilisateurs administratifs.
Raphael Marco
2017-05-02 20:26:28 UTC
view on stackexchange narkive permalink

Si l'attaquant a accédé à la base de données, il peut simplement créer son propre hachage bcrypt et remplacer celui de la base de données. Il n'est pas nécessaire de déchiffrer le hachage.

Pas s'ils n'avaient qu'un accès en lecture, ou par exempleun vidage de données ou quelque chose.
De plus, même s'ils ont un accès en écriture, cela ne les aiderait pas à insérer des hachages bcrypt aléatoires dans la base de données.Ils devraient comprendre la cryptographie du système d'autorisation pour qu'il accepte les hachages, et s'ils peuvent le faire, alors ils peuvent simplement décrypter les hachages existants beaucoup plus facilement.
Ne répond pas à la question.Même si ce que vous proposez est vrai, l'attaquant devra savoir lequel remplacer.
@KernelStearns Même je connais la cryptographie du schéma original.Il suffit de regarder le hachage.C'est bcrypt avec un coût de 10.
@Schroeder Il peut remplacer tous les hachages de la table (s'il a un accès en écriture) Donc je pense que c'est une réponse valable à la question.
@AjayBrahmakshatriya uniquement si l'attaquant veut s'annoncer si fort.Si l'attaquant veut être plus tactique (et silencieux), il est important de savoir quel compte cibler.Donc, non, cette réponse * contourne et rejette * la question, elle n'y répond pas.
@Schroeder Ce que je voulais dire, c'est qu'il pourrait remplacer un par un (et remplacer s'il n'est pas administrateur).C'est beaucoup plus facile que d'essayer de casser chaque hachage un par un.Ainsi, masquer le statut de l'administrateur ne fonctionne pas vraiment si l'attaquant a un accès en écriture sur cette table.
@AjayBrahmakshatriya pour un système avec des milliers d'utilisateurs, c'est pas mal de travail.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...