470 likes | 551 Views
Ecrire du code sécurisé pour SharePoint. Eli Robillard – Partner, Knowledge Artisans @erobillard #spsummit4.3. Qui suis -je?. Eli Robillard Partner Knowledge Artisans Inc .
E N D
Ecrire du code sécurisépour SharePoint Eli Robillard – Partner, Knowledge Artisans @erobillard #spsummit4.3
Qui suis-je? Eli Robillard PartnerKnowledge Artisans Inc. 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 (WroxPress). 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 E-mail eli@erobillard.com Twitter@erobillard Blogweblogs.asp.net/erobillard Groups Microsoft MVP, ASPInsiders, TSPUG, Toronto SharePoint Camp
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, leurcontexte, contexteapplicatif • Développer des applications SharePoint Sécurisées • Meilleurespratiques, mauvaisesidées et techniques recommandées
Bases de la sécurité Ecrire du code SharePoint sécurisé
Contexte et étendue • “Sécuriser le réseau, l’hote et l’application" • Nous avons le contrôle total de l’application • Nous avons un peu de contrôle sur l’hôte • Nous avons très peu à aucun contrôle sur le réseau
Quellessont les menaces pour SharePoint? Ecrire du code sécurisé pour SharePoint
Easy configuration solutions • Empecher la capture de l’utilisateur en ajoutantcetentête HTTP : • X-frame-options : sameorigin • Empecher les rejeux de cookies et de sessions en ajoutantcette entrée dans le web.configdans le noeudsystem.web : • <httpCookieshttpOnlyCookies="false" requireSSL="true" /> • Vérifiez les mises à jour! • http://technet.microsoft.com/en-us/security/bulletin
La dernière: MS 13-024 http://technet.microsoft.com/en-us/security/bulletin/ms13-024
Comptes de services • Utilisez les comptes de service: • Isoler les attaques • Fournirunesécurité au plus bas niveau • Les comptes à avoir au minimum: • SQL Service, Setup User, SP Farm • Les comptessuggérés:
Contexte des comptes de service • Sachezquelleidentitéestutilisée à quell niveau
Quechoisir pour les donnéesexternes • Impersonification (PassThrough) • Identité du pool applicative (RevertToSelf) • Identifiantsstockés • Codé en dur: ne le faitessimplement pas. • Web.config: Compliqué à chiffrer & mettre à jour. • Secure Store Service: Le meilleurchoix. • Comptesgérés: Trèsbien (quand applicable).
Bonnesidées pour faire du code sécurisédans SharePoint • Quandvousdéveloppez pour SharePoint essayez de le considérercomme le tier de présentation • Gardeztous les accès aux données non SharePoint en dehors • Plannifiez des revues de code régulièrement • Effectuezune revue de code dédiée à la sécuritéavantchaque version majeure • Utilisez des outilsd’analyse du code • SPDisposeCheck, CAT.NET, FxCop, HP Fortify • ImplementezInitialize-SPResourceSecurity
Pratiques de sécurité Ecrire du code sécurisé
Pratiques : le dispose • Pas bien • SPWebweb = site.OpenWeb();// do stuff with web • Mieux • SPWebweb = site.OpenWeb();// do stuff with webmyWeb.Dispose(); • Bien • using (SPWebweb = site.OpenWeb()){ // do stuff with web}
Pratiques : verifier le contexte • Est-ceque les methods vérifient le contexteavantd’effectuer des modifications • if (HttpContext.Current == null) • { • // This isn’t being called in a web application • }
Pratiques : verifier les permissions utilisateurs • Est-ceque les permissions sonttestéesavantd’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
Pratiques : verifier les entrées de données • Documentation des méthodes avec /// ? • Utilisation de AntiXssLibrary.dll? • Toutes les méthodesd’entréeutilisateursutilisent-elles: AntiXss.HtmlEncode(myString) or AntiXss.URLEncode(myString) ?
Pratiques : verification du Type • Valider avec la verification de type • // Is the ItemId parameter an Int32? • if(!Int32.TryParse(Request.QueryString["ItemId"],outItemId)) • { • // Exit with an invalid parameter error • } • Valider avec des regex • // Is the ListId parameter a GUID? • RegexStringValidatorval = newRegexStringValidator(@"^\{?[\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"]); • GuidListId = newGuid(Request.QueryString["ListId"]);
Pratiques de sécurité : pages applicatives • Héritage de LayoutsPageBase? • Mise à jour d’objets SharePoint ? • Si ouiuniquementdans le postback, sinon on s’expose à du cross-site scripting. • Si oui, utilisation du contrôle du formulaire avec formdigest ? • La page appelle-t-elleSPUtility.ValidateFormDigest()avantchaquemise à jour? • Est-ceque la page utilise AllowUnsafeUpdates? • Si ouiassurezvousqu’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.
Pratiques de sécurité : pages applicatives • Contextepropice à 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 = newSPSite(parmAbsoluteUrl)) {using (SPWeb web = site.OpenWeb(parmAbsoluteUrl)) • {web.AllowUnsafeUpdates = true; • // Update SharePoint objects here • web.AllowUnsafeUpdates = false; } } }else// HttpContext.Currenthas a value {SPUtility.ValidateFormDigest();// Update SharePoint objects here}
Pratiques : web parts • Le web part affiche-t-ill’exception et l’ID de correlation? • C’estunemauvaise chose qu’une page plante à cause d’un webpart. • Comment afficherl’ID de correlation: • [DllImport("advapi32.dll")] public static extern uintEventActivityIdControl(uintcontrolCode, ref GuidactivityId); public constuint EVENT_ACTIVITY_CTRL_GET_ID = 1; • // … • // And then use it in code like this: • try { // code block goes here } • catch { • Guidg = 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) }); • }
Pratiques : propriétés des web parts • Les webpartsvalident-ilsleursproprié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) { inti; if(!int.TryParse(item,outi)) throw new WebPartPageUserException("The item \""+item+"\" is not a valid number"); } _numberArray=value; } }
Pratiques : mode de privileges élevés • Trois scénarios pour le faire: • Lire de la donnée SharePoint. • Mettre à jour de la donnée SharePoint. • Effectuer un appelexterne.
Pratiques : lire de la donnée SharePoint • SPWebweb = 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 }); • }}
Pratiques : Mettreà jour de la données SharePoint • // Update a SharePoint property • using(SPSiteelevatedSite= • LitwareSecurity.SharePoint.Security.GetElevatedSite(web.Site) • { • // Update data using SharePoint object model here. • } • Le secret du chef: GetElevatedSiteessaied’abordsite.SystemAccount.UserToken et sicela ne fonctionne pas execute ensuite un RWEP() pour GetSystemToken(). Enfinilretourne le SPSite avec cecontexte • La source: http://www.danlarson.com/elevated-privilege-with-spsite/
Pratiques : utiliser le thread pour s’identifier en dehors de SharePoint • // Call a non-SharePoint resource • using(HostingEnvironment.Impersonate()) • { • // Call an external resource using the credentials of • // the Application Pool ID here • }
Pratiques : contexts de privilègesélevés • Troisscénarios • Lecture de données SharePoint • RWEP() => ok. • Mettreà jour de la donné SharePoint • GetElevatedSite() Crée un SPSitesécurisé avec lequeltravailler • Effectuer un appelexterne • La manière ASP.NET d’effectuer les choses dans SharePoint
SharePoint 2013 Les apps Ecrire du code sécurisé dans SharePoint
Modèlesd’hébergement • Hébergéesdans SharePoint • Fichiers de l’application ajoutées dans SharePoint • Hébergésdans un site enfant appeléApp Web • L’Appexécute du code client(HTML4/5, Javascript, • jQuery, Silverlight, Flash, etc.) • Pas de code serveur • Hérgementfournit et Auto-hébergé • Fichiers de l’applicationsur un serveur distant • Site distant appeléRemote Web • Code client • Code serveur, sur un autreserveur (C#, node.js, PHP, • Ruby, Java, etc.)
Donner des permissions à une app Permissions demandées à l’isntallation All or nothing
App manifest d’exemple • <?xml version="1.0" encoding="utf-8" ?><App xmlns=http://schemas.microsoft.com/sharepoint/2012/app/manifestProductID="{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><SupportedLocaleCultureName="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><RemoteWebApplicationClientId="1ee82b34-7c1b-471b-b27e-ff272accd564" /></AppPrincipal> • </App>
Pratiques : les apps • La stratégie Same-origin empèche les appelsJavascript entre les apps et l’hote • Les meilleursfaçons de communiquersont via le CSOM ou REST • IT pros: gardezune trace des permissions applicativesapprouvées. • Unefoisapprouvéesiln’y a plus besoin de les réapprouver, mêmesi ells évoluent.
Pratiques: les apps • Hébergementsur un FQDN unique • Choisir un sous domaine et non un domaine unique rend les attaques de cookies possibles.
Recap • Souvenez vous des bases • Utilisez RACI, la modélisation des menaces, les principes, les menaces et leurscontre-mesures • Soyez vigilants • Surveillez les bulletins • Connaissez votre environement • Ecrivez du code SharePoint super sécurisé • Familiarisezvous avec les apps SharePoint 2013
Reference • WatchGuard SharePoint Security Center: Patches • http://watchguardsecuritycenter.com/tag/sharepoint/ • SharePointSecurity.com: Articles • http://www.sharepointsecurity.com/ • SharePoint Security Scanner: Utility App • http://spsecurityscanner.codeplex.com/ • SP 2013 Resources for Developers: Guidance • http://social.technet.microsoft.com/wiki/contents/articles/12392.sharepoint-2013-resources-for-developers.aspx • Security Guidance for Applications: Guidance • http://msdn.microsoft.com/en-us/library/ff650760.aspx
Thank You! Ecrire du code sécurisé pour SharePoint Eli Robillard – Partner, Knowledge Artisans @erobillard #spsummit4.3
Thank you for your attention! This presentation will be available on the Quebec SharePoint 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 évaluezma 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