Contrôle d'accès basé sur les rôles pour les applications .NET

Quelle est la meilleure approche pour l'authentification et les permissions ?

1. Objectif de ce document

L'objectif de ce document est de proposer au lecteur un tour d'horizon sur la conception et la création d'un système de contrôle d'accès basé sur les rôles (RBAC).

2. Principaux concepts

Un système RBAC fournit 3 types de fonctionnalités : Authentification, Autorisation et Audit :

2.1 Authentification
L'authentification consiste à vérifier et confirmer l'identité de l'utilisateur qui se connecte à une application. Il s'agit d'un processus en deux étapes : En premier lieu, l'identification qui consiste déclarer son 'identité puis l'authentification qui consiste à la prouver.
La plupart du temps, ce processus est mis en place par l'utilisation d'un compte utilisateur et d'un mot de passe. Cette étape représente le premier niveau de sécurité.

2.2 Autorisation
Les autorisations définissent ce qu'un utilisateur peut faire dans une application : Il s'agit de définir ce que l'utilisateur pourra voir, faire et modifier dans l'application.

Il existe deux méthodes pour définir les autorisations :

  • La méthode la plus sûre est d'interdire toutes les options par défaut pour ensuite pour ensuite attribuer des permissions et ouvrir des possibilités. Cette configuration permet une grande sécurité. Si on oublie de définir une permission,les conséquences négatives seront limitées. L'utilisateur sera bloqué et ne pourra pas faire une action autorisée plutôt que d'être capable de faire une action interdite.
  • La méthode la plus rapide est d'autoriser toutes les options par défaut puis d'appliquer des restrictions sur certaines actions. Cette méthode est plus rapide que la précédente puisqu'il y a généralement moins de restrictions que de permissions.

En général, ce second niveau de sécurité entraîne de longs développements pour coder l'ensemble des permissions et restrictions.

2.3 Audit
L'audit consiste à conserver une trace des transactions sensibles réalisées dans l'application : Ce type d'information peut être requis pour se conformer à des règles de gestion de l'entreprise, des obligations légales telles que SOX ou pour obtenir des certifications telles que les normes ISO.
L'audit permet de savoir qui a fait quoi dans l'application, quand et qui a donné telle permission à tel utilisateur.

3. Composants de base

Les systèmes RBAC pour applications d'entreprise se composent des éléments suivants :

3.1 Un référentiel sécurisé où sont stockées les données de sécurité a
Vous avez besoin d'un endroit sécurisé où stocker les noms, mots de passe, rôles et permissions des utilisateurs : un référentiel de sécurité.

3.2 Un composant intégré à l'application
Ce composant permet la communication entre le référentiel de sécurité et l'application pour qu'elle soit ajustée aux autorisations de l'utilisateur.

3.3 Une console d'administration
Cette application est conçue pour permettre à des personnels non techniques de gérer les comptes utilisateur et leur attribuer des permissions. Son interface simplifiée permet de gérer facilement ce type d'information, libérant ainsi l'équipe de développement de la gestion quotidienne des mots de passe et comptes utilisateur.

3.4 Documentation pour les développeurs et les administrateurs
A tout moment vous pouvez avoir besoin d'une documentation pour tout le personnel qui travaille sur le processus de sécurité de vos applications (guide d'intégration, manuel utilisateur, FAQ, etc.)

4. Pourquoi les permissions doivent-elles être indépendantes du code ?

4.1 Qu'est-ce que cela signifie ?
Pour que les permissions soient indépendantes du code de l'application, elles ne doivent pas être définies à l'intérieur de celui-ci. Il faut biensur insérer un appel dans le code pour activer le système RBAC, mais il ne s'agit pas des permissions elles-mêmes.

Si le code qui définit les permissions est inclus dans le code de l'application, les coûts de maintenance sont très importants sur le long terme.

4.2 Permissions et application : un cycle de vie incompatible
L'administration système de sécurité exige une maintenance quasi permanente (création de nouveaux comptes, gestions des mots de passe, modifications dans les permissions, etc.). Par opposition, les changements au sein d'une application sont peu fréquents et une même version peut-être utilisée pendant plusieurs mois.
La durée de vie d'une permission est donc beaucoup plus courte que celle de l'application. Si les permissions sont imbriquées dans code de l'application, les utilisateurs devront attendre une nouvelle version de l'application pour bénéficier des nouvelles permissions.

La définition ou l'attribution de permissions ne doivent pas dépendre des nouvelles versions de l'application.
Vous devez pouvoir ajouter ou attribuer des permissions sans changer le code de l'application (ce qui impliquerait un cycle complet de développement : programmation, tests, correction de bugs, déploiements…). Si les nouvelles permissions sont prises en compte dynamiquement (non codées dans l'application), vous pouvez définir ou attribuer des permissions pendant que l'application est en production. Si tel est le cas, elles sont effectives immédiatement !

4.3 Autonomie des administrateurs
Les administrateurs connaissent les membres du personnel et leur tâches. Ils sont les mieux placés pour évaluer quelles autorisations attribuer (surtout dans le cas des sites distants). Ils ont donc besoin d'un outil d'administration, simple d'utilisation, qui leur permette de gérer les comptes et les permissions des utilisateurs sans devoir faire appel à l'équipe de développement. Ceci n'est possible que si la création de permission n'implique pas de modification du code de l'application.

4.4 Libérer l'équipe de développement
Si Les administrateurs prennent en charge la gestion quotidienne des comptes et des permissions des utilisateurs, l'équipe de développement peuvent se consacrer aux développements prioritaires.

5. Questions clés pour bien choisir son système RBAC :

5.1 Avez-vous besoin de... Sécuriser plusieurs applications dans un référentiel centralisé ?
Devez- vous sécuriser plusieurs applications dans un référentiel centralisé ? Vos administrateurs doivent-ils avoir une vision globale des applications et des comptes utilisateur de la société ?

5.2 … Gérer des rôles partagés ?
Un rôle partagé peut-être utilisé dans plusieurs applications tandis qu'un rôle spécifique n'est utilisé que pour une seule application. Les rôles partagés sont particulièrement utiles si vos employés utilisent plusieurs applications : vous n'avez plus à gérer un rôle par application pour un même utilisateur.

5.3 …Supporter le Single Sign-On (Authentification unique)?
Si vous utilisez Active Directory pour gérer les comptes utilisateur, il est généralement nécessaire de mettre en place un processus de Single Sign-on pour que la sécurité soit appliquée de la façon la plus transparente possible du point de vue de l'utilisateur final : dès que l'utilisateur est connecté à une session Windows, toutes les applications s'ouvrent sans qu'il ait besoin de s'identifier à nouveau.

5.4 …Supporter plusieurs technologies (winforms, webforms, services web) ?
Dans les années à venir, votre système RBAC devra-t-il supporter d'autres technologies ? .NET propose un large choix de technologies de développement : Winform, Webform, Services web,WCF, WPF… Si votre système ne prend en compte que les besoins à court terme (applications Winforms par exemple), vous devrez sûrement développer de nouvelles solutions pour supporter d'autres technologies, ce qui conduira au développement de plusieurs systèmes RBAC et augmentera significativement les coûts de développement, de maintenance et de formation.

5.5 …Générer des rapports sur les comptes utilisateurs et leurs permissions ?
Vous pouvez avoir besoin de fournir une description détaillée des comptes utilisateur existants, ainsi que des permissions accordées à chaque utilisateur.

5.6 …Se conformer aux exigences d'audit (SOX…) ?
Pour vous conformer aux exigences légales ou de certification (Sarbanes-Oxley Act, ISO, CMMI, ITIL…), vous pouvez avoir besoin de savoir qui a fait quoi dans l'application (qui se connecte à l'application, qui a ouvert une fenêtre, qui a modifié un enregistrement ?). Vous aurez peut-être besoin de passer en revue la liste des actions pour suivre les transactions sensibles (financières ?).

5.7 ...Supporter une grande équipe de développement voire de dimension internationale ?
Avez-vous une grande équipe de développement ? Votre équipe est-elle répartie sur différents sites ? Si tel est le cas, la coordination requiert un effort significatif, surtout si le turn over et le transfert de connaissance consituent un problème important.

5.8 ...Définir des permissions précises?
Quand on met en place un système permissions/restrictions, on commence généralement par désactiver des options de menu. On est rapidement confronté à des besoins beaucoup plus complexes. Par exemple, autoriser l'impression d'un document seulement pour une catégorie d'utilisateurs, à condition qu'ils aient eux même créé le document.
Vous pouvez donc avoir besoin d'un choix plus large d'actions sur l'application, allant de la désactivation d'un bouton au filtre d'une liste de données en fonction des autorisations de l'utilisateur.
Aurez-vous besoin d'une des options suivantes : masquer ou désactiver un champ, des options de menu, des onglets ou des contrôles ? Filtrer une liste différemment en fonction de l'utilisateur connecté ? Modifier des règles de gestion ?

6. Maintenance : Des coûts sous-estimés

Quand il faut choisir une solution, on se concentre généralement sur le coût initial : combien cela coûte-t-il de développer ou d'acheter la solution adéquate ?
Peu de personnes réalisent que ce coût ne représente que 10 à 20 % du budget global.
Forrester Research estime que 78% du budget informatique est destiné à la maintenance. Cette affirmation est vraie pour les applications de gestion, mais également pour les systèmes RBAC.
Il faut donc prendre en compte, dès la conception du système, les coûts supplémentaires auxquels il faudra faire face sur les 10 ou 20 prochaines années.

6.1 Assister les développeurs et les administrateurs
Quand on intégre un nouveau système de sécurité les développeurs doivent être assisté pour l'implémentation dans l'application, la définition des permissions, l'intégration d'un processus d'authentification, l'utilisation des nouvelles versions du framework .NET... Les administrateurs ont également besoin de support pour la gestion des comptes utilisateur, des rôles et des permissions.
IL faut prévoir une solution pour assister les développeurs et les administrateurs sur le long terme. Dans le cas d'une solution interne, vous devrez maintenir une équipe de support et malgré le turn over et le transfert de connaissance sur plusieurs années .

6.2 Maintenir la cohérence entre le code et les permissions
Quand une application évolue, il est nécessaire de s'assurer que les permissions restent compatibles avec le code de l'application. Par exemple, si un contrôle est modifié, il faudra vérifier manuellement que toutes les restrictions liées à ce contrôle continuent de fonctionner correctement.

Chaque nouvelle version de l'application doit faire l'objet d'une vérification complète des permissions même si cela prend du temps, sous peine de créer des failles de sécurité. Certains systèmes RBAC proposent un processus de vérification automatisé qui pourra être utilisé pour valider une nouvelle version de l'application.

6.3 Déployer de nouvelles versions de l'application
Chaque nouvelle version de l'application est livrée avec un ensemble de permissions. Les nouvelles permissions doivent être déployées avec la nouvelle version de l'application. Malheureusement, on ne peut pas se contenter de simplement remplacer le nouveau référentiel par l'ancien. Toutes les permissions créées par l'administrateur au cours de la vie de l'application (version1) seraient écrasées par le nouveau référentiel (version2).
Il faut insérer les nouvelles permissions dans le référentiel existant avec précaution. Cela implique une importation / exportation manuelle des permissions, à moins que votre système RBAC offre un outil de déploiement automatisé.

6.4 Gérer les migrations entre deux verisons de l'application
Quand une nouvelle version de l'application est en cours de déploiement, certains utilisateurs utilisent la nouvelle version tandis que d'autres continuent d'utiliser la version précédente. Il faut que les référentiels correspondants (version 1 et 2), soient disponibles durant la migration.
Il faut s'assurer que les deux versions sont disponibles et que chaque utilisateur à uniquement accès au référentiel approprié.

7. Développement interne, la solution par défaut pour sécuriser une application

Les solutions de sécurité développées en interne offrent un certains nombre de possibilités mais posent certains problèmes, tels que :

7.1 Le développement et la maintenance dépendent des ressources internes
Si vous utilisez une solution interne, il vous faut être particulièrement attentif à la maintenance, car ce sera votre plus gros centre de coûts.
Il faut maintenir une équipe capable de répondre à n'importe quelle question technique ou fonctionnelle et de gérer les changement ou les crises qui viendront à perturber votre système de sécurité.
Le turn over est une forte contrainte dans ce domaine. Vous ne pouvez vous permettre de vous trouver sans technicien qualifié et formé, apte à gérer votre système de sécurité.

7.2 Comptes utilisateur spécifiques à l'application
Il est difficile d'intégrer un système de sessions uniques (Single sign-on, SSO) dans une application .NET. Cela implique de communiquer avec Active Directory et de réutiliser les comptes Windows pour identifier les utilisateurs. C'est pourquoi la plupart des systèmes de sécurité utilisent des comptes créés spécifiquement pour l'application et stockés dans la base de données. Il s'agit certainement de la méthode la plus simple en terme de développement mais de la plus difficile à maintenir : les comptes utilisateurs doivent être gérés par l'équipe de développement tandis les comptes Windows/ Active Directory existants sont gérés par les administrateurs système.

7.3 Accès et permission : une faible précision (granularité)
Adapter une solution interne aux exigences de l'entreprise est un exercice difficile. Les responsables ont tendance à se foclaiser uniquement sur les fonctionnalités d'une solution, sans prendre en compte les implications techniques. Agir sur une option de menu est une chose, créer des permissions complexes à conditions multiple en est une autre.

7.4 Code spécifique dans l'application
En général, les solutions développées en interne mélangent le code des permissions avec le code de l'application. Les développeurs doivent donc gérer un système de sécurité complexe, difficile à maintenir et à mettre à jour. A chaque fois que les données de sécurité doivent être mises à jour, le développeur doit retourner dans le code, trouver les informations précédentes, les modifier, les tester et enfin re-déployer l'application. Ce processus génère un manque de réactivité et de flexibilté.
D'autre part, les besoins de sécurité apparaissent souvent longtemps après la phase de conception et il est souvent complexe, voire impossible de répondre à ces demandes lors du développement. Il arrive fréquemment que des besoins complexes soient identifiés une fois que l'application est en production et requierent une modification immédiate et coûteuse de l'application.

7.5 Une solution séparée pour chaque application : problèmes de maintenance
En théorie, il faudrait être capable d'avoir une idée précise de ce que sera l'entreprise dans 5 ou 10 ans pour pouvoir concevoir un système de sécurité global et unifié. En réalité, ceci est presque impossible. Le scénario le plus probable est que vous devrez développer de nouvelles applications avec des technologies nouvelles qui ne seront pas supportées par votre ancien système de sécurité. Il faudra donc en créer un nouveau. Au final, vous aurez de multiples systèmes de sécurité indépendants, autrement dit des coûts de maintenance énormes.

8. Visual Guard, une solution d'entreprise pour la sécurité de vos applications

Novalys développe des solutions d'authentification et de permissions depuis 15 ans. Forts de cette expérience, nous avons conçu Visual Guard, une solution destinée à sécuriser les applications .NET, quelle que soit la complexité de votre environnement.

8.1 Une solution unifiée pour sécuriser et centraliser toutes vos applications .NET
Visual Guard vous permet de sécuriser dans un seul outil tout type d'application : winform, webform et services web, WCF, WPF... La gestion de toutes vos applications et comptes utilisateur est centralisée dans un référentiel sécurisé unique.
Visual Guard fournit une solution clé en main de single sign-on basée sur les comptes Windows. (Si vous le souhaitez, vous pouvez utiliser les comptes applicatifs Visual Guard)
Pour simplifier encore la gestion des permissions, vous pouvez créer des rôles partagés qui regroupent les autorisations d'un utilisateur pour plusieurs applications.

8.2 Des permissions indépendantes du code
Avec Visual Guard, vous n'écrivez pas de code dans votre application pour définir les permissions.
Cela signifie que vous pouvez définir et intégrer des permissions sans repasser par un cycle complet de développement, test, déploiement, attente de feedback et corrections des bugs.
Vous pouvez définir des permissions à tout moment, même quand l'application est en production.
Les permissions sont actives immédiatement et dynamiquement.

8.3 Des outils de gestion conçus pour des personnels non techniques
La console de Visual Guard simplifie la gestion quotidienne de la sécurité pour les personnels non techniques. La gestion des comptes utilisateur, des rôles et des permissions ne requiert aucune connaissance technique.
De ce fait, le choix d'un responsable de la sécurité ne dépend plus de compétences techniques. Cela permet d'optimiser les process de l'entreprise pour une meilleure réactivité : les responsables peuvent être les personnes chargées de la sécurité, les administrateurs système, les responsables de sites distants…
Pour une meilleure flexibilité, vous pouvez définir plusieurs niveaux de privilèges pour les administrateurs.
Vous pouvez également créer votre propre formulaire d'administration et l'intégrer dans votre application. Il appellera l'API de Visual Guard pour gérer les utilisateurs et les rôles tout en respectant votre chartre graphique.

8.4 Des outils pour les développeurs : création des permissions, gestion des versions et du déploiement
Visual Guard offre un large choix d'outils et d'assistants destinés au développeurs : vous avez la possibilité de créer des permissions en quelques clics, vérifier automatiquement la cohérence entre l'application et les permissions, déployer de nouvelles permissions dans un référentiel existant sans altérer les données de sécurité en production, gérer plusieurs versions d'un référentiel pendant le déploiement de l'application...

8.5 Audit tools to generate permission reports and review application logs
Les auditeurs ont le droit de consulter et de générer des rapports détaillés sur les permissions existantes, les rôles et les comptes utilisateur de l'application. Ils peuvent passer en revue le log de l'application pour suivre des transactions particulières, ainsi que le log de la console d'administration pour vérifier qui a donné une autorisation à quelqu'un.

8.6 Un produit standard avec un support professionnel et des mises à jours fréquentes
Pourquoi réinventer la roue ? Visual Guard fournit des fonctionnalités prêtes à l'emploi pour la sécurité de vos applications. Depuis 15 ans, nous l'avons fait évoluer pour qu'il devienne une solution d'entreprise standard.
L'intégration de Visual Guard est simple et rapide, tout comme sa prise en main.
Novalys propose un support international : vous pouvez vous concentrer sur votre corps de métier et nous laisser résoudre vos problèmes de sécurité.
Novalys s'engage également à faire le meilleur usage des innovations constantes de Microsoft sur le framework .Net, l'OS Microsoft, etc.