47
Ecrire du code sécurisé pour SharePoint Eli Robillard – Partner, Knowledge Artisans @erobillard #spsummit4.3

Ecrire du code sécurisé pour SharePoint

  • Upload
    mignon

  • View
    38

  • Download
    0

Embed Size (px)

DESCRIPTION

Ecrire du code sécurisé pour SharePoint. Eli Robillard – Partner, Knowledge Artisans @erobillard #spsummit4.3. Qui suis -je?. Eli Robillard Partner Knowledge Artisans Inc . - PowerPoint PPT Presentation

Citation preview

Page 1: Ecrire  du code  sécurisé pour SharePoint

Ecrire du code sécurisé pour SharePoint

Eli Robillard – Partner, Knowledge Artisans@erobillard #spsummit4.3

Page 2: Ecrire  du code  sécurisé pour SharePoint

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

[email protected]

Twitter @erobillard

Blogweblogs.asp.net/erobillard

GroupsMicrosoft MVP, ASPInsiders,

TSPUG, Toronto SharePoint Camp

Eli RobillardPartner

Knowledge Artisans Inc.

Page 3: Ecrire  du code  sécurisé pour SharePoint

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

Page 4: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

Bases de la sécurité

Ecrire du code SharePoint sécurisé

4

Page 5: Ecrire  du code  sécurisé pour SharePoint

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

Page 6: Ecrire  du code  sécurisé pour SharePoint

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

Page 7: Ecrire  du code  sécurisé pour SharePoint

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

Page 8: Ecrire  du code  sécurisé pour SharePoint

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

Page 9: Ecrire  du code  sécurisé pour SharePoint

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

Page 10: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

Quelles sont les menaces pour

SharePoint?Ecrire du code sécurisé pour SharePoint

10

Page 11: Ecrire  du code  sécurisé pour SharePoint

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

Page 12: Ecrire  du code  sécurisé pour SharePoint

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

Page 13: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

La dernière: MS 13-024http://technet.microsoft.com/en-us/security/bulletin/ms13-024

13

Page 14: Ecrire  du code  sécurisé pour SharePoint

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

Page 15: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

15

Contexte des comptes de service

Sachez quelle identité est utilisée à quell niveau

Page 16: Ecrire  du code  sécurisé pour SharePoint

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).

Page 17: Ecrire  du code  sécurisé pour SharePoint

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

Page 18: Ecrire  du code  sécurisé pour SharePoint

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

Page 19: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

Pratiques de sécurité

Ecrire du code sécurisé

19

Page 20: Ecrire  du code  sécurisé pour SharePoint

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}

Page 21: Ecrire  du code  sécurisé pour SharePoint

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 }

Page 22: Ecrire  du code  sécurisé pour SharePoint

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

Page 23: Ecrire  du code  sécurisé pour SharePoint

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) ?

Page 24: Ecrire  du code  sécurisé pour SharePoint

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"]);

Page 25: Ecrire  du code  sécurisé pour SharePoint

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.

Page 26: Ecrire  du code  sécurisé pour SharePoint

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 }

Page 27: Ecrire  du code  sécurisé pour SharePoint

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) });}

Page 28: Ecrire  du code  sécurisé pour SharePoint

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; } }

Page 29: Ecrire  du code  sécurisé pour SharePoint

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.

Page 30: Ecrire  du code  sécurisé pour SharePoint

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 }); }}

Page 31: Ecrire  du code  sécurisé pour SharePoint

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/

Page 32: Ecrire  du code  sécurisé pour SharePoint

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}

Page 33: Ecrire  du code  sécurisé pour SharePoint

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

Page 34: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

SharePoint 2013 Les apps

Ecrire du code sécurisé dans SharePoint

34

Page 35: Ecrire  du code  sécurisé pour SharePoint

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.)

Page 36: Ecrire  du code  sécurisé pour SharePoint

www.sharepointsummit.org

Donner des permissions à une app

Permissions demandées à l’isntallation

All or nothing

Page 37: Ecrire  du code  sécurisé pour SharePoint

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>

Page 38: Ecrire  du code  sécurisé pour SharePoint

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

Page 39: Ecrire  du code  sécurisé pour SharePoint

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

Page 40: Ecrire  du code  sécurisé pour SharePoint

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

Page 41: Ecrire  du code  sécurisé pour SharePoint

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.

Page 42: Ecrire  du code  sécurisé pour SharePoint

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.

Page 43: Ecrire  du code  sécurisé pour SharePoint

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

Page 44: Ecrire  du code  sécurisé pour SharePoint

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

Page 45: Ecrire  du code  sécurisé pour SharePoint

Ecrire du code sécurisé pour SharePoint

Eli Robillard – Partner, Knowledge Artisans@erobillard #spsummit4.3

Thank You!

Page 46: Ecrire  du code  sécurisé pour SharePoint

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.

Page 47: Ecrire  du code  sécurisé pour SharePoint

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