Comment assurer la security de la database pour une application Windows Forms?

La configuration de base est classique: vous créez une application Windows Forms qui se connecte à une database et effectue toutes sortes de tâches d'entreprise. Naturellement, une telle application aura de nombreux users avec différents droits d'access dans la database, et chacun avec son propre nom d'user et mot de passe.

Alors, comment implémentez-vous cela? Une façon est de créer une connection DB pour chaque user d'application, mais c'est une chose très sérieuse à faire, qui nécessite même des droits d'administrateur sur le server DB, etc. Si le server DB héberge plusieurs applications, les admins ne seront probablement pas heureux avec ça.

Dans le monde du Web, on crée généralement son propre tableau "Users" qui contient toutes les informations nécessaires et utilise un login DB fixe pour toutes les interactions. Tout cela est très bien pour une application Web, mais un formulaire Windows ne peut pas masquer cette information de connection principale, annulant totalement la security. (Il peut essayer de se cacher, mais toutes ces tentatives sont facilement brisées avec un peu d'effort).

Alors … y a-t-il une voie intermédiaire? Peut-être vous connectez-vous avec une connection fixe, puis en augmentant les privilèges d'une procédure stockée spéciale qui vérifie le nom d'user et mot de passe?

Ajouté: OK, l'authentification embeddede et les groupes de windows semblent être un bon choix dans la plupart des situations, j'ai donc accepté la réponse pertinente. Quoi qu'il en soit, si quelqu'un peut proposer une solution d'authentification non embeddede, il recevra une confirmation de ma part.

Pour WinForms, utilisez des groupes Windows. Aucun mot de passe n'est nécessaire car les informations d'identification sont déduites de la connection Windows à l'aide de votre application.

C'est la meilleure pratique

Fondamentalement:

  • L'user appartient à un groupe (suppose un seul domaine)
  • Le groupe est un identifiant dans l'instance SQL
  • login SQL mappe à un user de database
  • L'user de database appartient à un rôle de database
  • Le rôle a des permissions d'object

Il vaut la peine de lire d'abord avant que quelqu'un essaie de capturer toutes les informations ici

Modifier:

Si vous avez un groupe de travail, vous pouvez toujours le faire en installant sqlbox \ bob, sqlbox \ hans etc. dans un groupe local sqlbox.

Quand quelqu'un essaie de se connecter (disons bob sur son PC), Windows leur requestra leurs détails. Tant que Bob connaît ses détails de count SQL, il peut se connecter.

Mais alors, je n'ai pas essayé cela dans un groupe de travail …

Vous ne pouvez pas utiliser les groupes Active Directory pour faciliter la gestion des connections db?

De MSDN …

Le nom peut être un nom d'user Windows ou un nom de groupe Windows , de la forme DOMAINE \ Nom.

De cette façon, vous pouvez avoir quelques groupes, en lecture seule, éditeur, gestionnaire, administrateur, etc. C'est comme cela que j'ai réalisé des choses similaires dans le passé avec les applications Click-Once.

C'est vraiment le meilleur choix pour ce que vous faites.

Je suppose que c'est une application existante? Si c'était nouveau je dirais sinon d'aller au server client avec des services web ou similaires.

PK 🙂

En plus d'utiliser les groupes de domaines / AD Windows (placer les groupes AD dans les rôles appropriés que vous créez dans SQL Server, de sorte que toutes les opérations de count soient déplacées vers AD), veillez à utiliser le nom de l'application dans votre string de connection . les applications effectuent des opérations dans le profileur, etc.

Parce que lorsque tout le monde se connecte à partir d'applications différentes (Windows et Web), il est utile de savoir que les actions sont exécutées via une application et pas seulement par ADBC ​​et Excel, par exemple (si vous autorisez les users à accéder à certaines applications). vues pour l'export de données ou l'écriture de rapports).

En ce qui concerne la dissimulation de votre authentification et l'utilisation d'une seule application avec WinForms, si la connection a très peu de privilèges – select uniquement les vues et n'exécutez que les procédures stockées, toute personne qui parvient à désosser le encryption des informations de connection dans votre L'application ne pourra effectuer que les mêmes fonctions que celles qu'elle pourrait exécuter dans votre application. Si vous devez absolument augmenter le niveau sur la security, vous pouvez authentifier chaque proc stocké contre votre table d'users (user et hachage de poassing à chaque SP). Faites également pivoter le login de l'application centrale régulièrement.

Tout cela est beaucoup plus difficile que d'utiliser l'authentification embeddede et la mise en œuvre de la plateforme AD dans votre environnement. Vous écrivez donc votre propre directory et authentification au lieu d'en utiliser un dans le commerce.

En plus de la mise à jour de gbn sur le groupe de travail par rapport au domaine, vous pouvez exécuter l'application avec RUNAS / NETONLY / USER: SERVER \ USER avec les informations d'identification de l'user sur le domaine ou le server dont votre machine n'est pas membre. Au moment où l'application établit la connection à la database, les informations d'identification distantes seront authentifiées et utilisées. J'ai une application qui vérifie réellement comment elle a été exécutée et si elle ne fonctionne pas avec un commutateur particulier, elle request un nom d'user et un mot de passe et se réexécute en utilisant l'API Windows en utilisant une fonction équivalente à RUNAS / NETONLY / USER: DOMAINE \ UTILISATEUR. Cela est dû au fait que nos posts de travail ne sont pas actuellement sur le domaine (ou sur un domaine avec une relation d'approbation) de SQL Server. Dans ce cas, vous pouvez toujours gérer la security dans les groupes locaux sur SQL Server ou les groupes sur le domaine de SQL Server. Vous perdriez simplement le jeton d'authentification automatique.