Est-il toujours judicieux d'utiliser un compte de base de données distinct pour chaque utilisateur d'une application?


13

Les applications auxquelles je suis habitué sont basées sur le serveur et utilisent un seul compte de base de données pour de nombreux utilisateurs, le code d'application contrôlant ce que l'utilisateur peut faire ou un seul utilisateur.

Existe-t-il des applications commerciales complexes réussies où chaque personne a besoin de son propre compte de base de données, et le serveur de base de données est invoqué pour appliquer des règles de stratégie sur ce que chaque utilisateur doit être autorisé et non autorisé à faire?

Je pense aux applications où plusieurs personnes contribuent aux informations dans une seule base de données et peuvent accéder aux informations stockées par d'autres - par exemple, les collègues d'une organisation qui ont tous besoin d'accéder aux enregistrements des clients.

Y a-t-il également un nom pour ce type de configuration?


1
Renversons cela sur sa tête, aurais-je jamais une bonne pratique de ne pas le faire?
Stevetech

C'est certainement une pratique standard pas trop dans certaines situations. De nombreuses applications ont de nombreux utilisateurs finaux mais un seul utilisateur de base de données - par exemple wordpress, drupal, roundcube, redmine. Autant que je sache, l'installation recommandée pour chacune de ces applications ne comporte qu'un seul compte d'utilisateur au niveau de la base de données, mais il peut facilement y avoir des centaines ou des milliers d'utilisateurs.
bdsl

@Stevetech, il semble que votre réponse à ma question soit "Oui". pouvez-vous développer cela en une réponse complète?
bdsl

Réponses:


6

Si vous avez besoin d'un contrôle très strict appliqué au niveau des données. Par exemple, un audit approfondi. L'audit n'est pas très bon si plusieurs utilisateurs partagent le même compte. Si certains utilisateurs ont besoin d'accéder directement à la base de données.

Si la sécurité est aussi stricte, vous n'exposez généralement pas directement la base de données. Vous avez un service et le client doit obtenir des données du service.

Dans une application Web, la base de données (par exemple le port 1433) n'est généralement pas exposée directement, vous avez donc un niveau de sécurité. Même si l'application Web accède directement à la base de données, les utilisateurs n'ont toujours pas d' accès direct à la base de données.

Si l'identifiant et le mot de passe se trouvent dans l'application cliente, ils peuvent être piratés. Si un domaine, vous pouvez utiliser la sécurité intégrée.

Dans la base de données, vous pouvez avoir des contrôles assez fins. Mais le contrôle au niveau des lignes est un peu de travail. Une base de données n'est pas un bon outil pour les règles métier. Les règles métier et la sécurité détaillée sont généralement appliquées au niveau de l'application.

Vous pouvez avoir un mode mixte où il y a des procédures stockées utilisées par les administrateurs et vous voulez suivre quel administrateur. Et vous pouvez accorder un accès en lecture seule aux utilisateurs qui génèrent directement un rapport.


5

Le défi ici est que votre accès à la base de données est géré par une abstraction. Au lieu que les utilisateurs se connectent comme eux-mêmes, ils prennent essentiellement l'identité d'un rôle d'application généralisé. Vous perdez non seulement la visibilité de la connexion individuelle, mais vous perdez également la granularité de la définition de différents types d'accès pour tous vos utilisateurs individuels.

La raison principale de l'utilisation de cette approche est la simplicité. De nombreuses applications sont conçues pour que l'utilisateur de l'application ne connaisse pas la base de données. Ils n'en ont vraiment pas besoin, surtout si l'application gère sa propre sécurité interne. La plupart des utilisateurs individuels ne se connecteront jamais directement à la base de données, il n'est donc pas nécessaire de définir une connexion explicite pour eux.

La seule fois où vous devriez envisager de laisser la base de données gérer votre sécurité, c'est si vous avez des utilisateurs qui se connecteront directement à votre base de données. Cela signifie qu'ils font le tour de votre application et qu'il ne peut plus appliquer la sécurité à lui seul. L'avantage ici est que vous pouvez être plus précis sur la définition de votre sécurité. L'inconvénient est la surcharge de gestion des utilisateurs et de leurs autorisations.

entrez la description de l'image ici

Si vous ressentez le besoin de ce type d'accès, vous souhaitez utiliser le contrôle d'accès basé sur les rôles . Vous devez définir des rôles en fonction du type d'autorisations nécessaires dans votre base de données, puis regrouper les utilisateurs individuels sous ces rôles. Cela vous permet de mieux contrôler et contrôler votre modèle de sécurité, ce qui peut rapidement devenir incontrôlable lors de la gestion de l'accès direct.

Il y a une approche hybride à cela. Si vous souhaitez que votre sécurité soit partiellement gérée par la base de données, vous pouvez créer plusieurs utilisateurs d'application, chacun défini par leur rôle et accorder explicitement l'accès à ces utilisateurs en fonction du rôle qu'ils remplissent. Cela signifie que vous pouvez tirer parti du moteur de base de données pour une partie de votre modèle de sécurité, mais vous devez toujours avoir une certaine gestion au sein de l'application. Il augmente la complexité du modèle utilisateur de l'application, mais vous donne une granularité plus fine sur les différentes connexions utilisées.


4

Vous devez commencer à appliquer la sécurité au niveau le plus granulaire dès que possible. Les rôles aident à cet égard - donner aux gens l'accès à un certain nombre de tables à la fois n'est pas un cauchemar.

Le compte unique pour tout le monde est une excellente source de questions ici et ailleurs - "l'enregistrement x a été supprimé, comment savoir qui l'a fait?" - la réponse est que vous ne pouvez pas - sans comptes et audits individuels .

Par "audit", je veux dire que même si c'est très bien d'avoir un compte pour tout le monde, cela ne signifie pas que vous avez une véritable sécurité. Si, par exemple, un enregistrement dans la table HR est supprimé, tout ce que vous pouvez dire, c'est que quelqu'un ayant accès à la table HR l'a fait - c'est x nombre de personnes.

Vous avez besoin de déclencheurs dans votre système qui enregistrent les actions pour pouvoir retracer jusqu'au niveau individuel qui a effectué l'action X (sauf si vous avez un SGBDR tel qu'Oracle où cela peut être rendu automatique).

Dans tous les cas, vous devez toujours rendre votre sécurité aussi précise que possible dès que possible - n'accorder aux utilisateurs l'accès aux tables que sur la base du "besoin de savoir". Et, incluez toujours des horodatages pour les actions sur les tables - les gens donnent souvent leurs identifiants aux autres - si vous pouvez dire, "Jimmy, vous étiez le seul au bureau à 17h49 ..." - encore une fois, ce n'est pas à toute épreuve, juste une autre flèche dans votre carquois.

Peut-être que si vous nous donniez votre SGBDR, vous pourriez obtenir des conseils plus spécifiques / pertinents à votre situation?


Je ne pense pas que cela soit directement lié à ma situation, je travaillais surtout par curiosité. Je travaille avec des applications web et MySQL.
bdsl

1
Vous semblez dire que toutes les bases de données devraient exiger que chaque utilisateur final humain ait une connexion unique, mais je connais de nombreuses applications de serveur qui n'utilisent qu'un seul utilisateur de SGBD pour l'ensemble de l'application, et je n'ai pas vu cela condamné comme le meilleur entraine toi.
bdsl

1
Rien de mal à la curiosité intellectuelle - votre message semble avoir reçu un bon accueil. MySQL est probablement le pire en termes de capacité de sécurité (comme c'est le cas dans tant d'autres ...), mais MariaDB les a et est également Open Source. En réponse à un commentaire - ce dont vous parlez n'est pas la meilleure pratique - c'est la pire pratique.
Vérace

1
@bdsl Vous mélangez serveur et application métier et cela est source de confusion. Les applications commerciales incluent les applications de bureau.
paparazzo

1
@bdsl Ensuite, arrêtez d'utiliser le terme applications serveur si vous ne voulez pas exclure une application de bureau.
paparazzo

3

Oui, ça l'est. La connexion à une base de données à partir d'une application en tant qu'utilisateur puissant unique constitue une violation du principe du moindre privilège . Il s'agit de la cause principale de la plupart des attaques par injection SQL.

Cela se fait généralement en raison de l'ignorance, par souci de simplicité, ou parfois pour des performances.

Les bases de données ont souvent une longue durée de vie et sont utilisées par plusieurs applications en même temps et au fil du temps. Vous pouvez économiser des ressources en centralisant le contrôle d'accès dans la base de données plutôt que sur plusieurs applications.

Vous souhaitez choisir un serveur de base de données qui prend en charge la sécurité des lignes, la sécurité des colonnes et l'authentification par usurpation d'identité / proxy (qui prend en charge les utilisateurs réels de la base de données + le regroupement de connexions)

Il serait également plus sûr pour les applications basées sur des "plugins", comme Wordpress, où il est difficile d'éviter les injections SQL en raison d'auteurs de plugins non qualifiés. Chaque plugin obtient une connexion db, au lieu de l'application dans son ensemble.


Est-il possible de faire en sorte que chaque utilisateur d'un site Wordpress se connecte à la base de données avec des informations d'identification différentes?
bdsl

@bdsl oui c'est le cas.
Neil McGuigan

1
Pouvez-vous créer un lien vers un guide sur la façon de procéder? J'ai eu une recherche rapide et je ne l'ai pas trouvée. Cela signifie-t-il que la page de connexion wordpress demande les informations d'identification nécessaires pour se connecter à la base de données?
bdsl

@bdsl mon php est assez rouillé. Voici comment vous le feriez avec Spring (Java) et PostgreSQL. blog.databasepatterns.com/2015/03/… . stackoverflow.com/questions/2998597/…
Neil McGuigan

1
Wordpress n'était qu'un exemple d'un système basé sur des plugins. Elle est mal faite du point de vue de la sécurité.
Neil McGuigan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.