Ecrire du code sécurisé pour SharePoint
Eli Robillard – Partner, Knowledge Artisans@erobillard #spsummit4.3
www.sharepointsummit.org
Qui suis-je?
Eli Robillard est un sextuple MVP Microsoft SharePoint. Il se spécialise dans l'architecture SharePoint et la construction de bonnes équipes pour gérer SharePoint comme plate-forme de services d'entreprise.En tant que spécialiste et érudit sur le sujet, Eli a co-fondé les ASPInsiders, a lancé le groupe d'utilisateurs SharePoint Toronto en 2005, a lancé le premier SharePoint Saturday gratuit en 2007, a été co-auteur de perfectionnement professionnel SharePoint 2007 et un rédacteur technique de professionnel Professional développement SharePoint 2010 (Wrox Press). Eli travaille actuellement avec PricewaterhouseCoopers sur un service global SharePoint. Il est basé à Toronto et aime faire du vélo, nager, pêcher et jouer de la musique avec son épouse Aurore, fille Irina et leur chien Nukka
Twitter @erobillard
Blogweblogs.asp.net/erobillard
GroupsMicrosoft MVP, ASPInsiders,
TSPUG, Toronto SharePoint Camp
Eli RobillardPartner
Knowledge Artisans Inc.
www.sharepointsummit.org
Agenda
Bases de la sécuritéRACI, modélisation des menaces, principes, menaces et contre-mesures
Quelles menaces pour SharePoint? Menaces “Out-of-box”, sécurité opérationnelle, comptes de services, leur contexte, contexte applicatif
Développer des applications SharePoint Sécurisées
Meilleures pratiques, mauvaises idées et techniques recommandées
www.sharepointsummit.org
Bases de la sécurité
Ecrire du code SharePoint sécurisé
4
www.sharepointsummit.org
5
Contexte et étendue
“Sécuriser le réseau, l’hote et l’application" Nous avons le contrôle total de l’applicationNous avons un peu de contrôle sur l’hôteNous avons très peu à aucun contrôle sur le réseau
www.sharepointsummit.org
6
Matrice RACI
Taches Architecture Operations Developpement Test SecuritéPolitiques de sécurité
Responsable Informé Approuve
Modélisation des menacesApprouve Informé Informé Responsable
Principes de sécuritéApprouve Informé Informé Consulté
Architecture et Design Responsable Informé Informé
Code / Developpement Approuve Responsable
Menaces liées à la technologie Approuve Responsable
Revue du Code Responsable Informé Approuve
Tests de Securité Consulté Informé Approuve Approuve
Securité du réseau Consulté Responsable Approuve
Securité de l’hôte Consulté Approuve Informé Responsable
Application Security Consulté Informé Approuve Responsable
Troubleshooting Consulté Approuve Informé
Revue du Deployment Consulté Responsable Informé Informé Approuve
www.sharepointsummit.org
7
Threat modeling process
Identifier les actifs
Effectuer une
architecture globale
Decomposer
l’application
Identifier les
menaces
Documenter les
menaces
Evaluer les menaces
www.sharepointsummit.org
8
Menaces applicatives et contre-mesures
• Cross-site scripting, Injection SQLVal Données entrantes
• Rejeu deCookie, Network eavesdroppingAuthentification
• Elevation de privileges, falsification données, leuresAutorisation • Comptes avec trop de privileges, accès à l’interface
d’administrationGestion de la configuration
• Accès aux données “mortes”, falsificationDonnées sensibles
• Vol et rejeu de session, man in the middleGestion des sessions
• Mauvaise gestion des clefsCryptographie
• Formulaires, cookie et requeteManipulation des paramètres
• Erreurs qui en disent trop, DOSGestion des exceptions
• L’utilisateur refuse sa responsabilité, effacement des tracesAudit et log
www.sharepointsummit.org
9
Principles of Security
• Isole les attaquesCompartimenter
• Une faille ne devrait pas conduire a un plus gros impactUtilisez le principe du moindre privilège
• Utilisez plusieurs garde-fous, éléminez les points de failles uniquesAppliquez la sécurité en profondeur
• Supposez que toutes les entrées sont dangeureuses tant que le contraire n’est pas prouvéNe faites pas confiance aux entrées utilisateurs
• Authentifiez et autorisez l’utilisateurs le plus tôt possibleVérifiez dès le départ
• Ne fournissez aucun détail à l’attaquantEchouez de manière sécurisée
• Est-ce le réseau? L’hôte? Ou bien l’application?Securisez le maillon le plus faible
• Standards, libraries libres, et l’automatisation aidentCréez des standards de sécurité
• Si vous ne l’utilisez pas supprimez le ou désactivez leRéduisez la surface exposée
www.sharepointsummit.org
Quelles sont les menaces pour
SharePoint?Ecrire du code sécurisé pour SharePoint
10
www.sharepointsummit.org
11
Menaces connues pour SharePoint
• En-Tetes• Elements UI
SharePoint est facile à identifier
• Restez à l’écoute, certaines nécessitent une action rapide• L’injection JavaScript est la plus commune• Capture de l’utillisateur par IFRAME est possible par défaut
SharePoint est vulnerable aux attaques ASP.NET connues
• Les fichiers pages et cookies sont mis en cache côté client• Les éléments statiques de SharePoint ne requierent pas d’authentification• Nimporte quel assembly du GAC peut être utilise n’importe où• Les pages applicatives peuvent être accessibles de partout• Services Web et WCF visibles depuis tous les sites
SharePoint est vulnérables aux exploits
www.sharepointsummit.org
12
Easy configuration solutions
Empecher la capture de l’utilisateur en ajoutant cet entête HTTP : X-frame-options : sameorigin
Empecher les rejeux de cookies et de sessions en ajoutant cette entrée dans le web.config dans le noeud system.web : <httpCookies httpOnlyCookies="false" requireSSL="true" />
Vérifiez les mises à jour! http://technet.microsoft.com/en-us/security/bulletin
www.sharepointsummit.org
La dernière: MS 13-024http://technet.microsoft.com/en-us/security/bulletin/ms13-024
13
www.sharepointsummit.org
14
Comptes de services
Utilisez les comptes de service: • Isoler les attaques• Fournir une sécurité au plus bas niveau
Les comptes à avoir au minimum:SQL Service, Setup User, SP Farm
Les comptes suggérés: Microsoft Excel
Worksheet
www.sharepointsummit.org
15
Contexte des comptes de service
Sachez quelle identité est utilisée à quell niveau
www.sharepointsummit.org
16
Que choisir pour les données externes
Impersonification (PassThrough) Identité du pool applicative (RevertToSelf) Identifiants stockés
Codé en dur: ne le faites simplement pas. Web.config: Compliqué à chiffrer & mettre à jour. Secure Store Service: Le meilleur choix.Comptes gérés: Très bien (quand applicable).
www.sharepointsummit.org
17
Contextes d’execution SharePoint
Console / PowerShell
•Membre du group administrateurs de la ferme
•Compte d’installation de SharePoint
Travaux périodiques
•Compte de ferme
Services SharePoint
• Impersonification utilisateur
• Identité du pool d’application de l’application de service
•Comptes gérés
Code côté client
• Impersonnification utilisateur
Code côté serveur (GAC)
• Impersonnification utilisateur
• Identité du pool d’applications
Politiques CAS personnalisées
• Impersonnification utilisateur
• Identité du pool d’applications
Bac à sable (Deprécié)
• Identité du pool applicatif
Apps
•Stratégique utilisateur
•Stratégie utilisateur + app
•Stratégie app seulement
www.sharepointsummit.org
18
Bonnes idées pour faire du code sécurisé dans SharePoint
Quand vous développez pour SharePoint essayez de le considérer comme le tier de présentation
Gardez tous les accès aux données non SharePoint en dehors
Plannifiez des revues de code régulièrement Effectuez une revue de code dédiée à la sécurité
avant chaque version majeure Utilisez des outils d’analyse du code
SPDisposeCheck, CAT.NET, FxCop, HP Fortify Implementez Initialize-SPResourceSecurity
www.sharepointsummit.org
Pratiques de sécurité
Ecrire du code sécurisé
19
www.sharepointsummit.org
20
Pratiques : le dispose
Pas bienSPWeb web = site.OpenWeb();// do stuff with web
MieuxSPWeb web = site.OpenWeb();// do stuff with webmyWeb.Dispose();
Bienusing (SPWeb web = site.OpenWeb()){ // do stuff with web}
www.sharepointsummit.org
21
Pratiques : verifier le contexte
Est-ce que les methods vérifient le contexte avant d’effectuer des modifications
if (HttpContext.Current == null) { // This isn’t being called in a web application }
www.sharepointsummit.org
22
Pratiques : verifier les permissions utilisateurs
Est-ce que les permissions sont testées avant d’effectuer des modifications?if (web.DoesUserHavePermissions(SPBasePermissions.EditListItems)){
// Edit the list item(s) }
Reference: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx
www.sharepointsummit.org
23
Pratiques : verifier les entrées de données
Documentation des méthodes avec /// ? Utilisation de AntiXssLibrary.dll? Toutes les méthodes d’entrée utilisateurs
utilisent-elles: AntiXss.HtmlEncode(myString) or AntiXss.URLEncode(myString) ?
www.sharepointsummit.org
24
Pratiques : verification du Type
Valider avec la verification de type // Is the ItemId parameter an Int32? if(!Int32.TryParse(Request.QueryString["ItemId"],out ItemId)){ // Exit with an invalid parameter error}
Valider avec des regex // Is the ListId parameter a GUID? RegexStringValidator val = new RegexStringValidator(@"^\{?[\dA-Fa-f]{8}-[\dA-Fa-f]{4}-[\dA-Fa-f]{4}-[\dA-Fa-f]{4}-[\dA-Fa-f]{12}\}?$"); // If invalid, this will throw a System.ArgumentException val.Validate(Request.QueryString["ListId"]); Guid ListId = new Guid(Request.QueryString["ListId"]);
www.sharepointsummit.org
25
Pratiques de sécurité : pages applicatives
Héritage de LayoutsPageBase? Mise à jour d’objets SharePoint ?
Si oui uniquement dans le postback, sinon on s’expose à du cross-site scripting.
Si oui, utilisation du contrôle du formulaire avec formdigest ? La page appelle-t-elle SPUtility.ValidateFormDigest() avant
chaque mise à jour? Est-ce que la page utilise AllowUnsafeUpdates?
Si oui assurez vous qu’elle ne le fasse pas sur les SPSite et SPWeb de contexte.
Refusez le code qui désactive le formdigest, ça rend le cross scripting possible.
www.sharepointsummit.org
26
Pratiques de sécurité : pages applicatives
Contexte propice à l’utilisation de ValidateFormDigest() vs. AllowUnsafeUpdates if (HttpContext.Current == null) { // parmAbsUrl is an absolute URL in the format "http://server/sites/mySite/" using (SPSite site = new SPSite(parmAbsoluteUrl)) { using (SPWeb web = site.OpenWeb(parmAbsoluteUrl)) { web.AllowUnsafeUpdates = true; // Update SharePoint objects here web.AllowUnsafeUpdates = false; } } } else // HttpContext.Current has a value { SPUtility.ValidateFormDigest(); // Update SharePoint objects here }
www.sharepointsummit.org
27
Pratiques : web parts
Le web part affiche-t-il l’exception et l’ID de correlation?
• C’est une mauvaise chose qu’une page plante à cause d’un webpart.
• Comment afficher l’ID de correlation:[DllImport("advapi32.dll")] public static extern uint EventActivityIdControl(
uint controlCode, ref Guid activityId); public const uint EVENT_ACTIVITY_CTRL_GET_ID = 1; // …// And then use it in code like this: try { // code block goes here }catch { Guid g = Guid.Empty; EventActivityIdControl(EVENT_ACTIVITY_CTRL_GET_ID, ref g); this.Controls.Add(new Label { Text = string.Format("An error occurred with Correlation ID {0}", g) });}
www.sharepointsummit.org
28
Pratiques : propriétés des web parts
Les webparts valident-ils leurs propriétés? Plus efficace de le faire durant la définition de ces propriétes et non pendant l’exécution
public string NumberArray { // Require format: 1,2,3,4 get{return _numberArray;} set{ string [] arr = value.split(','); foreach (string item in arr) { int i; if(!int.TryParse(item,out i)) throw new WebPartPageUserException("The item \""+item+"\" is not a valid number"); } _numberArray=value; } }
www.sharepointsummit.org
29
Pratiques : mode de privileges élevés
Trois scénarios pour le faire:1. Lire de la donnée SharePoint. 2. Mettre à jour de la donnée SharePoint. 3. Effectuer un appel externe.
www.sharepointsummit.org
30
Pratiques : lire de la donnée SharePoint
SPWeb web = SPContext.Current.Web;
try{ // Verify this is a postback from a valid Application Page SPUtility.ValidateFormDigest(); // Verify that the user has a valid permission before elevating if (web.DoesUserHavePermissions(SPBasePermissions.ManageWeb)) { // Read a SharePoint property SPSecurity.RunWithElevatedPrivileges(delegate() { // Read data using the SharePoint Object Model here }); }}
www.sharepointsummit.org
31
Pratiques : Mettre à jour de la données SharePoint
// Update a SharePoint propertyusing (SPSite elevatedSite = LitwareSecurity.SharePoint.Security.GetElevatedSite(web.Site){ // Update data using SharePoint object model here. }
Le secret du chef: GetElevatedSite essaie d’abord site.SystemAccount.UserToken et si cela ne fonctionne pas execute ensuite un RWEP() pour GetSystemToken(). Enfin il retourne le SPSite avec ce contexte
La source: http://www.danlarson.com/elevated-privilege-with-spsite/
www.sharepointsummit.org
32
Pratiques : utiliser le thread pour s’identifier en dehors de SharePoint
// Call a non-SharePoint resourceusing (HostingEnvironment.Impersonate()){ // Call an external resource using the credentials of // the Application Pool ID here}
www.sharepointsummit.org
33
Pratiques : contexts de privilèges élevés
Trois scénarios1. Lecture de données SharePoint
RWEP() => ok.
2. Mettre à jour de la donné SharePoint GetElevatedSite() Crée un SPSite sécurisé avec
lequel travailler
3. Effectuer un appel externe La manière ASP.NET d’effectuer les choses dans
SharePoint
www.sharepointsummit.org
SharePoint 2013 Les apps
Ecrire du code sécurisé dans SharePoint
34
www.sharepointsummit.org
35
Modèles d’hébergement
Hébergées dans SharePointFichiers de l’application ajoutées dans SharePointHébergés dans un site enfant appelé App WebL’App exécute du code client(HTML4/5, Javascript, jQuery, Silverlight, Flash, etc.)Pas de code serveur
Hérgement fournit et Auto-hébergéFichiers de l’application sur un serveur distantSite distant appelé Remote WebCode clientCode serveur, sur un autre serveur (C#, node.js, PHP, Ruby, Java, etc.)
www.sharepointsummit.org
Donner des permissions à une app
Permissions demandées à l’isntallation
All or nothing
www.sharepointsummit.org
App manifest d’exemple
<?xml version="1.0" encoding="utf-8" ?><App xmlns=http://schemas.microsoft.com/sharepoint/2012/app/manifest ProductID="{4a07f3bd-803d-45f2-a710-b9e944c3396e} " Version="1.0.0.0" SharePointMinVersion="15.0.0.0" Name="MySampleApp“"> <Properties> <Title>My Sample App</Title> <StartPage>http://ContosoApps/default.aspx/?SPHostUrl={HostUrl}</StartPage> <SupportedLocales> <SupportedLocale CultureName="en-US" /> </SupportedLocales> </Properties> <AppPermissionRequests> <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="Read"/> <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list" Right="Write"> <Property Name="BaseTemplateId" Value="101"/> </AppPermissionRequest> </AppPermissionRequests> <AppPrincipal> <RemoteWebApplication ClientId="1ee82b34-7c1b-471b-b27e-ff272accd564" /> </AppPrincipal></App>
www.sharepointsummit.org
Etendues des permissions fournisseur des app
Scope Pertains To
Site Collection * Collection de sites
Web * Site web SharePoint
List * Liste
Search Service de recherche
Workflow Service de workflows Azure
Taxonomy Taxonomie
BCS Accès en lecture aux sources BCS
www.sharepointsummit.org
Permissions des apps
Nom de la permission applicative
Nom du jeu de permissions SharePoint Permissions
Lecture Lecteur Afficher les éléments, Ouvrir les éléments, Afficher les versions, créer des alertes, Utiliser la création de site à la demande, Afficher les pages
Ecriture Contributeur Autorisations en lecture seule, plus:Ajouter les articles, Modifier les éléments, Supprimer les éléments, Supprimer les versions, Parcourir les répertoires, Modifier informations personnelles des utilisateurs, Gérer les affichages personnels, Ajouter / Supprimer des composants WebPart personnels, mise à jour des composants WebPart personnels
Gestion Gestionnaire Permissions d'écriture, plus:Gérer les listes, Ajouter et personnaliser des pages, appliquer des thèmes et des frontières, Appliquer des feuilles de style
Controle total Controle Total Toutes les permissions
www.sharepointsummit.org
40
App Authorization Policies
Policy ConditionsStratégie Utilisateur Uniquement Vérification de la sécurité de la base de données de contenu,
fonctionne si l’utilsateur a les droitsStratégie Application Uniqement Vérification de la sécurité de la base de données de contenu,
fonctionne si l’application a les permissions suffisantes peut importe qu’il y ait ou non un utilisateur courant.
Stratégie Application et utilisateur Vérification de la sécurité de la base de données de contenu, fonctionne si l’application et l’utilisateur ont les droits. Ceci requiert que l’application puisse agir en tant que l’utilisateur lors d’un hébergement sur un web distant
www.sharepointsummit.org
41
Pratiques : les apps
• La stratégie Same-origin empèche les appels Javascript entre les apps et l’hote
• Les meilleurs façons de communiquer sont via le CSOM ou REST
• IT pros: gardez une trace des permissions applicatives approuvées.
• Une fois approuvées il n’y a plus besoin de les réapprouver, même si ells évoluent.
www.sharepointsummit.org
Pratiques : les apps
• Hébergement sur un FQDN unique• Choisir un sous domaine et non un domaine
unique rend les attaques de cookies possibles.
www.sharepointsummit.org
Recap
Souvenez vous des basesUtilisez RACI, la modélisation des menaces, les principes, les menaces et leurs contre-mesures
Soyez vigilantsSurveillez les bulletinsConnaissez votre environement
Ecrivez du code SharePoint super sécuriséFamiliarisez vous avec les apps SharePoint 2013
www.sharepointsummit.org
44
Reference
WatchGuard SharePoint Security Center: Patcheshttp://watchguardsecuritycenter.com/tag/sharepoint/
SharePointSecurity.com: Articleshttp://www.sharepointsecurity.com/
SharePoint Security Scanner: Utility Apphttp://spsecurityscanner.codeplex.com/
SP 2013 Resources for Developers: Guidancehttp://social.technet.microsoft.com/wiki/contents/articles/12392.sharepoint-2013-resources-for-developers.aspx
Security Guidance for Applications: Guidancehttp://msdn.microsoft.com/en-us/library/ff650760.aspx
Ecrire du code sécurisé pour SharePoint
Eli Robillard – Partner, Knowledge Artisans@erobillard #spsummit4.3
Thank You!
Thank you for your attention!This presentation will be available on the QuebecSharePoint Summit web site after the event.
Merci de votre attention !Cette présentation sera disponible sur le site internet
de SharePoint Summit Québec, après l’événement.
SVP évaluez ma session!Complétez le sondage et courez la chance
de gagner une tablette Surface
Please rate this session!Fill out the survey and get a chance to win a Surface
Session 4.3 Eli Robillard, Writing Secure SharePoint Code