Mise en œuvre de la sécurité.net avec MS Visual Studio.NET 2005.NET Sécurité Avancée Jihene Benneri Imen Bou Salem INSAT, GL5 Plan Introduction Notion de base relatives à la sécurité Nouvelles Fonctionnalités desécurité de.net 2.0 Framework Sécurité d'accès au code Sécurité basée sur les rôles Cryptographie
Introduction De nos jours, les applications Web font l'objet de tentatives d'attaque. Si des utilisateurs inconnus peuvent y accéder, il est plus que probable que quelqu'un essayera d'y effectuer une opération non autorisée, voire nuisible. Les applications Web permettent aux utilisateurs d'accéder à une ressource centrale (le serveur Web) et via celui-ci, à d'autres ressources, telles que les serveurs de bases de données. Maîtriser et implémenter les mesures de sécurité appropriées pour protéger nos propres ressources. Les Bases de la sécurité La Non répudiation L intégrité des données L habilitation La confidentialité La disponibilité La traçabilité ou preuve
Notions de base Cryptographie : Transformation réversible de données en un format illisible. Symétrique : une seule clef. Asymétrique : double clefs. Solution hybride : échange de clefs. Hachage : conversion de données en un format non réversible. Signature Numérique = Hachage + Cryptage Plan Introduction Notion de base relatives à la sécurité Nouvelles Fonctionnalités desécurité de.net 2.0 Framework Sécurité d'accès au code Sécurité basée sur les rôles Cryptographie
Objectifs d ASP.NET 2.0 Augmenter la productivité Réduction du code par 70% Améliorer les outils Rendre possible de nouveaux scénarios Administration et Configuration Faciliter la configuration Séparer le développement Performances Intégrer les nouvelles architectures matérielles Les applications Web les plus rapides Nouvelle Architecture Briques fonctionnelles abstraites ASP.NET Building Block APIs Membership Role Manager Personalization Site Navigation Database Caching Management Implementation du modèle Provider Providers Windows SQL Server Access Autre
Nouvelle Architecture Nouveaux Contrôles (plus de 50) Security Data Navigation Web Parts Framework des fonctionnalités de page Master Pages Themes/Skins Localization API de briques logicielles Membership Role Manager Personalization Site Navigation Caching Management Nouveautés ASP.Net 2.0 Contrôles Contrôles de données Contrôles de Login Web Parts Page Framework Pages Master Thèmes et Skins Mobilité et Localisation Compilation Services et APIs Membres Plan de Sites Gestion des Membres Monitoring Profils Configuration
Nouveautés sur la sécurité Service de gestion d utilisateur Gérer les utilisateurs et la sécurité Provider de stockage ouvert (sql, access, autre) Contrôles spécifiques de login Création, connexion, mot de passe oublié, Gestion des rôles Combiner l authentification et les rôles sans écrire de code Nouveautés sur la sécurité Extension des facilités d authentification Provider Pattern utilisé pour l abstraction de données Membership API de gestion et stockage des utilisateurs Nombreux contrôles simplifiant l utilisation de la brique Membership RoleManager API de gestion des rôles et droits utilisateurs Administration Site Web d administration de l application
Sécurité SQL Server 2005 Plan Introduction Notion de base relatives à la sécurité Nouvelles Fonctionnalités desécurité de.net 2.0 Framework Sécurité d'accès au code Sécurité basée sur les rôles Cryptographie
Sécurité de l'exécution managée.net Les fonctionnalités de sécurité de.net Vous aident à développer des applications sûres Comprennent de nombreux composants, dont : Vérification de type Gestionnaire d'exceptions Moteur de sécurité Complètent la sécurité de Windows Système de type sécurisé Un code de type sécurisé : Empêche le débordement de mémoire tampon Limite l'accès à des emplacements de mémoire autorisés Permet à plusieurs assemblage de s'exécuter dans le même processus Les domaines d'application permettent : AppDomain : Notion de sous processus De meilleures performances Une plus grande sécurité du code par isolation
Protection contre le débordement de mémoire tampon La vérification du type empêche les remplacements arbitraires dans la mémoire Les objets de classe System.String.NET sont immuables La classe System.Text.StringBuilder.NET vérifie les limites du tampon Assemblages avec nom fort Les noms forts sont Des identificateurs uniques (contenant une clé publique) Utilisés pour signer numériquement des assemblys sn k Ma_Clé_Complète.snk Les assemblages avec nom fort Empêchent la falsification Confirment l'identité de l'éditeur de l'assembly
Assemblies et Signature [assembly: AssemblyKeyFile(@"Cle.snk")] Metadonnées Fichier Haché Valeur de hachage Signé avec La clé privée Signature Numérique Clé publique En-Tête CLR Signature numérique Intégré dans le fichier Signature d une Assembly
Le stockage isolé Fournit un système de fichiers virtuel Met en œuvre l'isolation du système de fichiers en fonction : De l'identité de l'application De l'identité de l'utilisateur IsolatedStorageFile isostore = IsolatedStorageFile.GetUserStoreForAssembly(); Sécurité basée sur les preuves Les preuves Sont évaluées au chargement d'un assembly Servent à déterminer les autorisations de l'assembly Peuvent comprendre les éléments suivants de l'assembly : Informations de nom fort URL Zone Signature Authenticode
Stratégies de sécurité Entité de sécurité Stratégie Description Définie par les administrateurs Appliquée au moment de l'exécution Simplifie l'administration Contient des autorisations Contient des groupes de codes Groupe de codes Associe des composants similaires Basé sur les preuves Lié à un ou plusieurs jeux d'autorisations Jeu d'autorisations Est un ensemble d'autorisations accordées Parcours de pile et vérification de la sécurité Pile des appels AssemblyA Accorder : Execute Appel à ReadFile Votre_AssemblyB Accorder : ReadFile 1. Un assemblya demande l'accès à une méthode de votre assembly 2. Votre assemblyb transmet la demande à un assembly.net Framework 3. Le système de sécurité vérifie que les appelants de la pile disposent des autorisations requises 4. Le système de sécurité accorde l'accès ou lève une exception Appel à ReadFile Assembly.NET Framework Accorder : ReadFile Demande d'autorisation Système de sécurité Exception de sécurité Accorder l'accès? Accès refusé
Types de vérifications de sécurité Les vérifications de sécurité impératives Créent des objets Permission Appellent des méthodes Permission Les vérifications de sécurité déclaratives Utilisent des attributs Permission S'appliquent à des méthodes ou à des classes Plan Introduction Notion de base relatives à la sécurité Nouvelles Fonctionnalités desécurité de.net 2.0 Framework Sécurité d'accès au code Sécurité basée sur les rôles Cryptographie
Authentification et Autorisation L'authentification demande : «Qui êtes-vous?» «Êtes-vous vraiment la personne que vous prétendez être?» L'autorisation demande : «Êtes-vous autorisé à?» Identités et entités desécurité Une identité contient des informations sur un utilisateur, comme son nom de connexion Une entité de sécurité contient des informations de rôle sur un utilisateur ou un ordinateur.net Framework propose : Les objets WindowsIdentity et WindowsPrincipal Les objets GenericIdentity et GenericPrincipal
Création d'identités et d'entités de sécurité Windows Utiliser les objets WindowsIdentity et WindowsPrincipal : WindowsIdentity mon_ident = WindowsIdentity.GetCurrent(); WindowsPrincipal mon_ent = new WindowsPrincipal(mon_Ident); Création d'identités et d'entités de sécurité génériques Créer un objet GenericIdentity et un objet GenericPrincipal GenericIdentity mon_ident = new GenericIdentity("Utilisateur1"); string[] roles = {"Directeur", "Caissier"}; GenericPrincipal mon_ent = new GenericPrincipal(mon_Ident, roles); Attacher l'objet GenericPrincipal au thread actuel System.Threading.Thread.CurrentPrincipal = mon_ent;
Réalisation de vérifications de sécurité Utiliser les membres identité et entité dans du code Par exemple, en utilisant la propriété Name de l'objet Identity pour vérifier le nom de connexion de l'utilisateur if (String.Compare(mon_Ent.Identity.Name, "DOMAINE\\Fred", true)==0) { // Effectuer une action } Par exemple, en utilisant la méthode IsInRole de l'objet Principal pour vérifier l'appartenance à un rôle if (mon_ent.isinrole("builtin\\administrateurs")) { // Effectuer une action } Vérifications de sécurité impératives et déclaratives Utiliser des autorisations pour effectuer des vérifications de sécurité basées sur les rôles Vérifications impératives PrincipalPermission aut_ent = new PrincipalPermission("Caissier", Directeur, true); try { aut_ent.demand(); //Les éléments ci-dessus correspondent-ils à ceux de l'entité de sécurité active? } Vérifications déclaratives [PrincipalPermission(SecurityAction.Demand, Role="Caissier", Authenticated=true)]
Service des gestion des membres Services pour gérer les utilisateurs : En utilisant le site d administration A partir du code Les données relatives aux membres peuvent être stockées dans différents providers : Services pour gérer les utilisateurs : Base de données SQL Base de données Access Schéma services de gestion des membres Contrôles Login LoginStatus LoginView API de gestion des membres Membership MembershipUser Providers pour la gestion des membres SqlMembershipProvider Données membres SQL Server
Classe Membership Fournit des méthodes pour effectuer les tâches les plus importantes pour la gestion des utilisateurs : Création & suppression des utilisateurs Récupération d information sur les utilisateurs Génération de mots de passe Validation des credentials (login/mot de passe) des utilisateurs Quelques méthodes de la classe Membership CreateUser : Crée un utilisateur dans le data store DeleteUser : Supprime un utilisateur du data store GeneratePassword : Génère un mot de passe GetAllUsers : Retourne la liste des utilisateurs GetUser : Retourne les informations relatives à un utilisateur UpdateUser : Met à jour les informations relatives à un utilisateur ValidateUser : Authentifie et Valide le Login/Mot de passe d un utilisateur
Création d utilisateur try { Membership.CreateUser ( alitah", dimadima", alitah@microsoft.com"); } catch (MembershipCreateUserException e) { // Find out why CreateUser failed switch (e.statuscode) { } case MembershipCreateStatus.DuplicateUsername:... case MembershipCreateStatus.DuplicateEmail:... case MembershipCreateStatus.InvalidPassword:... default:... } Authentification if (Membership.ValidateUser (UserName.Text, Password.Text)) FormsAuthentication.RedirectFromLoginPage (UserName.Text, RememberMe.Checked); Pour activer un service d'authentification ASP.NET, on configure l'élément <authentication> dans le fichier de configuration de l'application. <configuration> <system.web> <authentication mode="forms"/> </system.web> </configuration>
Classe MembershipUser Représente les utilisateurs inscrits dans le data store Inclut de nombreuses propriétés pour récupérer/modifier les attributs des utilisateurs Inclut des méthodes pour récupérer/modifier les mots de passe Propriétés : CreationDate : Date de création de l utilisateur Email : Email de l'utilisateur LastLoginDate : Date de dernière connexion Quelques méthodes de MembershipUser ChangePassword : Modifie le mot de passe de l utilisateur ChangePassword-QuestionAndAnswer : Modifie la question et réponse pour Retrouver mot de passe GetPassword : Récupère le mot de passe ResetPassword : Régénère le mot de passe
Suspension des privilèges pour un Login if (Membership.ValidateUser (UserName.Text, Password.Text)) { MembershipUser user = Membership.GetUser (UserName.Text); user.comment = "0"; // Reset the count of failed login attempts RedirectFromLoginPage (UserName.Text, RememberMe.Checked); } else { MembershipUser user = Membership.GetUser (UserName.Text); if (user!= null) { // Get a count of consecutive failed login attempts string count = Convert.ToInt32 (user.comment) + 1; // If the count equals or exceeds 5, suspend login privileges if (count >= 5) user.isapproved = false; } } // Update the count of consecutive failed login attempts user.comment = count.tostring (); Providers pour la classe Membership Le Provider est l interface entre les services de gestion des membres et le data store 2 providers en natif (dans les beta) : AccessMembershipProvider (Access) SqlMembershipProvider (SQL Server) Vous pouvez utiliser vos propres providers et vos propres data stores Utilisation du Provider SQL Server : <configuration> <system.web> <membership defaultprovider= "AspNetSqlProvider" /> </system.web> </configuration>
Configuration du Provider Le provider est configurable : Comment stocker les mots de passe (en clair, cryptés, ) Modification du Provider : Autoriser la récupération des mots de passe? <membership> Combien d adresses mail par utilisateur? <providers> <remove name="aspnetsqlprovider" /> <add name="aspnetsqlprovider" type="system.web.security.sqlmembershipprovider, System.Web,..." connectionstringname="remotesqlserver" enablepasswordretrieval="false" enablepasswordreset="true" requiresquestionandanswer="false" applicationname="/" requiresuniqueemail="false" passwordformat="hashed" description="stores and retrieves membership data" /> </providers> </membership> Configurable à partir des fichiers de config Contrôles de Login ChangePassword : Contrôle pour changement de mot de passe CreateUserWizard : Contrôle pour créer un utilisateur Login : Contrôle pour l authentification LoginName : Contrôle pour afficher le nom de l utilisateur LoginStatus : Contrôle pour afficher le statut de connexion PasswordRecovery : Contrôle pour récupérer le mot de passe
Le contrôle d authentification Contrôle pour permettre aux utilisateurs de se loger Personnalisation du contrôle d authentification : Peut s intégrer avec les services de gestion des membres : appelle la méthode ValidateUser <asp:login ID="LoginControl" RunAt="server" Utilise CreateUserText="Create les RequiredFieldValidators new account" CreateUserUrl="CreateUser.aspx" DisplayRememberMe="false" Utilisation du contrôle d authentification : PasswordRecoveryText="Forgotten your password?" PasswordRecoveryUrl="RecoverPassword.aspx" <html> SubmitButtonText="Do It!" <body> TitleText="Please Log In" <form runat="server"> /> <asp:login RunAt="server" /> </form> </body> </html> Quelques événements du contrôle d authentification Authenticate : S exécute quand l utilisateur clique sur le bouton Login LoggedIn : S exécute quand l utilisateur a été authentifié LoginError : S exécute quand le login/mot de passe est incorrect
Validation du format des credentials <asp:login ID="LoginControl" RunAt="server" OnLoggingIn="OnValidateCredentials"... />... <script language="c#" runat="server"> void OnValidateCredentials (Object sender, CancelEventArgs e) { if (!Regex.IsMatch (LoginControl.UserName, "[a-za-z0-9]{6,}")!regex.ismatch (LoginControl.Password, "[a-za-z0-9]{8,}")) { LoginControl.InstructionText = "User names and passwords " + "must contain letters and numbers only and must be at " + "least 6 and 8 characters long, respectively"; e.cancel = true; } } </script> Services de gestion de Rôles Deux façons de gérer les Rôles : Via l outil d Administration Via le code Les services contiennent des méthodes pour ajouter/modifier/supprimer les Rôles Associe un utilisateur à son Rôle à chaque connexion Les informations sont gérées via un provider (les données peuvent être stockées dans le format de data store voulu)
Schéma de gestion des Rôles Contrôles Login LoginStatus LoginView API de gestion de Rôles Roles Providers de gestion de Rôles SqlRoleProvider Données de Rôles SQL Server La classe Roles Fournit des méthodes pour effectuer les tâches les plus importantes pour la gestion des Rôles : Création & suppression des Rôles Récupération d information sur les Rôles Ajout d utilisateurs aux Rôles Suppression d utilisateurs des Rôles Quelques méthodes de gestion des Rôles : AddUserToRole : Ajoute un utilisateur à un Rôle CreateRole : Crée un Rôle GetRolesForUser : Retourne la liste des Rôles auxquels un utilisateur appartient IsUserInRole : Indique si l utilisateur appartient à un Rôle RemoveUserFromRole : Supprime un utilisateur d un Rôle
Création de rôles Créer un nouveau Rôle if (!Roles.RoleExists ("Développeurs")) { Roles.CreateRole ("Développeurs"); } Ajout d un utilisateur à un Rôle Autoriser le gestionnaire de Rôle La gestion des Rôles est désactivée par défaut Configurable via le fichier de config string name = Membership.GetUser (). Username; Roles.AddUserToRole (name, "Développeurs"); <configuration> <system.web> <rolemanager enabled="true" /> </system.web> </configuration> La mise en cache des données des Rôles Le gestionnaire de Rôles peut mettre les données en cache dans les cookies : Moins d accès au data store Meilleures performances Configurable via les attributs du gestionnaire des Rôles (fichier Autorisation de config) de ou modifiable la mise en via cache le code des : données des Rôles : Mise en cache des données dans les cookies <configuration> Crypter les <system.web> données Durée de validité <rolemanager des données enabled="true" du cache cacherolesincookie="true" /> <!-- Other rolemanager attributes (and their defaults) include: cookiename=".aspxroles // Cookie name cookietimeout="30" // Cookie lifetime cookiepath="/" // Cookie path cookierequiressl="false" // Restrict cookie to SSL? cookieslidingexpiration="true" // Renew expiring cookies? createpersistentcookie="false" // Issue persistent cookie? cookieprotection="all" /> // Cookie protection level --> </system.web> </configuration>
Providers de gestion des Rôles Providers par défaut : SqlRoleProvider (SQL Server) WindowsTokenRoleProvider (Windows) Possibilité d utiliser d autres providers pour vos propres data stores Utilisation du Provider SQL Server <configuration> <system.web> <rolemanager enabled="true" defaultprovider= "AspNetSqlRoleProvider" /> </system.web> </configuration> Sécurité basée sur les rôles
Plan Introduction Notion de base relatives à la sécurité Nouvelles Fonctionnalités desécurité de.net 2.0 Framework Sécurité d'accès au code Sécurité basée sur les rôles Cryptographie Rappels concernant la cryptographie Terme de cryptographie Cryptage symétrique Cryptage asymétrique Hachage Signature numérique Description Cryptage et décryptage des données avec une clé secrète Cryptage et décryptage des données avec une paire clé publique/clé privée Mappage d'une longue chaîne de données à une chaîne de données courte, de taille fixe Hachagededonnées et cryptage de la valeur de hachage avec une clé privée.net Framework fournit des classes qui implémentent ces opérations
Cryptographie et Framework.NET Plusieurs namespaces.net consacrés à la cryptographie System.Security.Cryptography Fournis les services cryptographiques : Encodage/Décodage sécurisé des données hashing, random number, message authentication. System.Security.Cryptography.X509Certificates Authenticode X.509 v.3 certificate. Le certificat est signé avec une «private key» qui identifie explicitement et de manière unique le propriétaire du certificat. System.Security.Cryptography.Xml Réservé a données XML Permet de signer les «objets» XML avec une signature digitale Signature de données et vérification de signatures Action Signature des données Vérification de signatures Procédures Hacher les données Crypter la valeur de hachage avec une clé privée Décrypter la signature en utilisant la clé publique de l'expéditeur Hacher les données Comparer la signature décryptée avec la valeur de hachage
Résumé de la session Notion de base relatives à la sécurité Nouvelles Fonctionnalités de sécurité de.net 2.0 Framework Sécurité d'accès au code Sécurité basée sur les rôles Cryptographie Étapes suivantes 1. Être informé sur la sécurité S'inscrire aux bulletins de sécurité : http://www.microsoft.com/security/security_bulletins/alerts2.asp (en anglais) Obtenir l'aide la plus récente de Microsoft sur la sécurité : http://www.microsoft.com/france/securite/default.asp 2. Obtenir des activités de formation supplémentaires sur la sécurité Trouver des séminaires de formation : http://www.microsoft.com/france/events/default.asp Trouver un centre de formation local agréé Microsoft (CTEC) pour des cours pratiques : http://www.microsoft.com/france/formation/centres/recherche.asp
Ressources Livre : Maîtrisez C# [Karli Walson] http://www.labo-dotnet.com/news/default.aspx http://www.aspmagazine.com/zactus/go.html?id=10766 http://www.dotnetfr.org/article.php3?sid=1229&mode=thread&order=0 &thold=0 liens : http://www.dotnet-fr.org/links.php3 http://fr.gotdotnet.com/quickstart/ http://www.microsoft.com/france/securite/evenement s/salonsconferences/journeessecurite/pg04mai.aspx http://www.aspnetpop3.com/ Pour plus d'informations Site Microsoft sur la sécurité (tout public) http://www.microsoft.com/france/securite/default.asp Site MSDN sur la sécurité (développeurs) http://msdn.microsoft.com/security (en anglais) Site TechNet sur la sécurité (informaticiens) http://www.microsoft.com/france/technet/themes/ secur/default.asp
Annexes
Génération des clés et Cryptage Asymétriques Symétriques Décryptage Symétrique Asymétrique
Signature digitale et.net Signature d un HashValue Verification de la signature Hash value et vérification Création du Hash Value