Translated ['src/README.md', 'src/banners/hacktricks-training.md', 'src/

This commit is contained in:
Translator
2024-12-31 20:17:59 +00:00
parent 730ef05579
commit 9bd90436f1
245 changed files with 10089 additions and 12816 deletions

View File

@@ -1,376 +1,372 @@
# Az - Basic Information
# Az - Informations de base
{{#include ../../../banners/hacktricks-training.md}}
## Organization Hierarchy
## Hiérarchie de l'organisation
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUcVrh1BpuQXN7RzGqoxrn-4Nm_sjdJU-dDTvshloB7UMQnN1mtH9N94zNiPCzOYAqE9EsJqlboZOj47tQsQktjxszpKvIDPZLs9rgyiObcZCvl7N0ZWztshR0ZddyBYZIAwPIkrEQ=s2048?key=l3Eei079oPmVJuh8lxQYxxrB" alt=""><figcaption><p><a href="https://www.tunecom.be/stg_ba12f/wp-content/uploads/2020/01/VDC-Governance-ManagementGroups-1536x716.png">https://www.tunecom.be/stg_ba12f/wp-content/uploads/2020/01/VDC-Governance-ManagementGroups-1536x716.png</a></p></figcaption></figure>
### Management Groups
### Groupes de gestion
- It can contain **other management groups or subscriptions**.
- This allows to **apply governance controls** such as RBAC and Azure Policy once at the management group level and have them **inherited** by all the subscriptions in the group.
- **10,000 management** groups can be supported in a single directory.
- A management group tree can support **up to six levels of depth**. This limit doesnt include the root level or the subscription level.
- Each management group and subscription can support **only one parent**.
- Even if several management groups can be created **there is only 1 root management group**.
- The root management group **contains** all the **other management groups and subscriptions** and **cannot be moved or deleted**.
- All subscriptions within a single management group must trust the **same Entra ID tenant.**
- Il peut contenir **d'autres groupes de gestion ou abonnements**.
- Cela permet d'**appliquer des contrôles de gouvernance** tels que RBAC et Azure Policy une fois au niveau du groupe de gestion et de les **hériter** par tous les abonnements dans le groupe.
- **10 000 groupes de gestion** peuvent être pris en charge dans un seul annuaire.
- Un arbre de groupes de gestion peut supporter **jusqu'à six niveaux de profondeur**. Cette limite n'inclut pas le niveau racine ou le niveau d'abonnement.
- Chaque groupe de gestion et abonnement peut supporter **uniquement un parent**.
- Même si plusieurs groupes de gestion peuvent être créés, **il n'y a qu'un seul groupe de gestion racine**.
- Le groupe de gestion racine **contient** tous les **autres groupes de gestion et abonnements** et **ne peut pas être déplacé ou supprimé**.
- Tous les abonnements au sein d'un seul groupe de gestion doivent faire confiance au **même locataire Entra ID.**
<figure><img src="../../../images/image (147).png" alt=""><figcaption><p><a href="https://td-mainsite-cdn.tutorialsdojo.com/wp-content/uploads/2023/02/managementgroups-768x474.png">https://td-mainsite-cdn.tutorialsdojo.com/wp-content/uploads/2023/02/managementgroups-768x474.png</a></p></figcaption></figure>
### Azure Subscriptions
### Abonnements Azure
- Its another **logical container where resources** (VMs, DBs…) can be run and will be billed.
- Its **parent** is always a **management group** (and it can be the root management group) as subscriptions cannot contain other subscriptions.
- It **trust only one Entra ID** directory
- **Permissions** applied at the subscription level (or any of its parents) are **inherited** to all the resources inside the subscription
- C'est un autre **conteneur logique où les ressources** (VM, DB…) peuvent être exécutées et seront facturées.
- Son **parent** est toujours un **groupe de gestion** (et cela peut être le groupe de gestion racine) car les abonnements ne peuvent pas contenir d'autres abonnements.
- Il **fait confiance à un seul annuaire Entra ID**
- Les **permissions** appliquées au niveau de l'abonnement (ou à l'un de ses parents) sont **héritées** par toutes les ressources à l'intérieur de l'abonnement.
### Resource Groups
### Groupes de ressources
[From the docs:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-python?tabs=macos#what-is-a-resource-group) A resource group is a **container** that holds **related resources** for an Azure solution. The resource group can include all the resources for the solution, or only those **resources that you want to manage as a group**. Generally, add **resources** that share the **same lifecycle** to the same resource group so you can easily deploy, update, and delete them as a group.
[Des docs :](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-python?tabs=macos#what-is-a-resource-group) Un groupe de ressources est un **conteneur** qui contient des **ressources liées** pour une solution Azure. Le groupe de ressources peut inclure toutes les ressources pour la solution, ou seulement celles **que vous souhaitez gérer en tant que groupe**. En général, ajoutez des **ressources** qui partagent le **me cycle de vie** au même groupe de ressources afin que vous puissiez facilement les déployer, les mettre à jour et les supprimer en tant que groupe.
All the **resources** must be **inside a resource group** and can belong only to a group and if a resource group is deleted, all the resources inside it are also deleted.
Toutes les **ressources** doivent être **dans un groupe de ressources** et ne peuvent appartenir qu'à un seul groupe et si un groupe de ressources est supprimé, toutes les ressources à l'intérieur sont également supprimées.
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfe8U30iP_vdZCvxX4g8nEPRLoo7v0kmCGkDn1frBPn3_GIoZ7VT2LkdsVQWCnrG_HSYNRRPM-1pSECUkbDAB-9YbUYLzpvKVLDETZS81CHWKYM4fDl3oMo5-yvTMnjdLTS2pz8U67xUTIzBhZ25MFMRkq5koKY=s2048?key=gSyKQr3HTyhvHa28Rf7LVA" alt=""><figcaption><p><a href="https://i0.wp.com/azuredays.com/wp-content/uploads/2020/05/org.png?resize=748%2C601&#x26;ssl=1">https://i0.wp.com/azuredays.com/wp-content/uploads/2020/05/org.png?resize=748%2C601&#x26;ssl=1</a></p></figcaption></figure>
### Azure Resource IDs
### Identifiants de ressources Azure
Every resource in Azure has an Azure Resource ID that identifies it.
Chaque ressource dans Azure a un identifiant de ressource Azure qui l'identifie.
The format of an Azure Resource ID is as follows:
Le format d'un identifiant de ressource Azure est le suivant :
- `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}`
For a virtual machine named myVM in a resource group `myResourceGroup` under subscription ID `12345678-1234-1234-1234-123456789012`, the Azure Resource ID looks like this:
Pour une machine virtuelle nommée myVM dans un groupe de ressources `myResourceGroup` sous l'ID d'abonnement `12345678-1234-1234-1234-123456789012`, l'identifiant de ressource Azure ressemble à ceci :
- `/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM`
## Azure vs Entra ID vs Azure AD Domain Services
## Azure vs Entra ID vs Services de domaine Azure AD
### Azure
Azure is Microsofts comprehensive **cloud computing platform, offering a wide range of services**, including virtual machines, databases, artificial intelligence, and storage. It acts as the foundation for hosting and managing applications, building scalable infrastructures, and running modern workloads in the cloud. Azure provides tools for developers and IT professionals to create, deploy, and manage applications and services seamlessly, catering to a variety of needs from startups to large enterprises.
Azure est la **plateforme de cloud computing complète de Microsoft, offrant une large gamme de services**, y compris des machines virtuelles, des bases de données, de l'intelligence artificielle et du stockage. Elle sert de fondation pour héberger et gérer des applications, construire des infrastructures évolutives et exécuter des charges de travail modernes dans le cloud. Azure fournit des outils pour les développeurs et les professionnels de l'informatique afin de créer, déployer et gérer des applications et des services de manière transparente, répondant à une variété de besoins allant des startups aux grandes entreprises.
### Entra ID (formerly Azure Active Directory)
### Entra ID (anciennement Azure Active Directory)
Entra ID is a cloud-based **identity and access management servic**e designed to handle authentication, authorization, and user access control. It powers secure access to Microsoft services such as Office 365, Azure, and many third-party SaaS applications. With features like single sign-on (SSO), multi-factor authentication (MFA), and conditional access policies among others.
Entra ID est un service de **gestion des identités et des accès basé sur le cloud** conçu pour gérer l'authentification, l'autorisation et le contrôle d'accès des utilisateurs. Il permet un accès sécurisé aux services Microsoft tels qu'Office 365, Azure et de nombreuses applications SaaS tierces. Avec des fonctionnalités telles que l'authentification unique (SSO), l'authentification multi-facteurs (MFA) et des politiques d'accès conditionnel, entre autres.
### Entra Domain Services (formerly Azure AD DS)
### Services de domaine Entra (anciennement Azure AD DS)
Entra Domain Services extends the capabilities of Entra ID by offering **managed domain services compatible with traditional Windows Active Directory environments**. It supports legacy protocols such as LDAP, Kerberos, and NTLM, allowing organizations to migrate or run older applications in the cloud without deploying on-premises domain controllers. This service also supports Group Policy for centralized management, making it suitable for scenarios where legacy or AD-based workloads need to coexist with modern cloud environments.
Les services de domaine Entra étendent les capacités d'Entra ID en offrant des **services de domaine gérés compatibles avec les environnements traditionnels de Windows Active Directory**. Il prend en charge des protocoles hérités tels que LDAP, Kerberos et NTLM, permettant aux organisations de migrer ou d'exécuter des applications plus anciennes dans le cloud sans déployer de contrôleurs de domaine sur site. Ce service prend également en charge les stratégies de groupe pour une gestion centralisée, ce qui le rend adapté aux scénarios où des charges de travail héritées ou basées sur AD doivent coexister avec des environnements cloud modernes.
## Entra ID Principals
## Principaux Entra ID
### Users
### Utilisateurs
- **New users**
- Indicate email name and domain from selected tenant
- Indicate Display name
- Indicate password
- Indicate properties (first name, job title, contact info…)
- Default user type is “**member**”
- **External users**
- Indicate email to invite and display name (can be a non Microsft email)
- Indicate properties
- Default user type is “**Guest**”
- **Nouveaux utilisateurs**
- Indiquer le nom et le domaine de l'email du locataire sélectionné
- Indiquer le nom d'affichage
- Indiquer le mot de passe
- Indiquer les propriétés (prénom, titre de poste, informations de contact…)
- Le type d'utilisateur par défaut est “**membre**”
- **Utilisateurs externes**
- Indiquer l'email à inviter et le nom d'affichage (peut être un email non Microsoft)
- Indiquer les propriétés
- Le type d'utilisateur par défaut est “**Invité**”
### Members & Guests Default Permissions
### Permissions par défaut des membres et invités
You can check them in [https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions](https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions) but among other actions a member will be able to:
Vous pouvez les consulter sur [https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions](https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions) mais parmi d'autres actions, un membre pourra :
- Read all users, Groups, Applications, Devices, Roles, Subscriptions, and their public properties
- Invite Guests (_can be turned off_)
- Create Security groups
- Read non-hidden Group memberships
- Add guests to Owned groups
- Create new application (_can be turned off_)
- Add up to 50 devices to Azure (_can be turned off_)
- Lire tous les utilisateurs, groupes, applications, appareils, les, abonnements et leurs propriétés publiques
- Inviter des invités (_peut être désactivé_)
- Créer des groupes de sécurité
- Lire les adhésions de groupe non cachées
- Ajouter des invités aux groupes possédés
- Créer une nouvelle application (_peut être désactivé_)
- Ajouter jusqu'à 50 appareils à Azure (_peut être désactivé_)
> [!NOTE]
> Remember that to enumerate Azure resources the user needs an explicit grant of the permission.
> N'oubliez pas que pour énumérer les ressources Azure, l'utilisateur a besoin d'une attribution explicite de la permission.
### Users Default Configurable Permissions
### Permissions configurables par défaut des utilisateurs
- **Members (**[**docs**](https://learn.microsoft.com/en-gb/entra/fundamentals/users-default-permissions#restrict-member-users-default-permissions)**)**
- Register Applications: Default **Yes**
- Restrict non-admin users from creating tenants: Default **No**
- Create security groups: Default **Yes**
- Restrict access to Microsoft Entra administration portal: Default **No**
- This doesnt restrict API access to the portal (only web)
- Allow users to connect work or school account with LinkedIn: Default **Yes**
- Show keep user signed in: Default **Yes**
- Restrict users from recovering the BitLocker key(s) for their owned devices: Default No (check in Device Settings)
- Read other users: Default **Yes** (via Microsoft Graph)
- **Guests**
- **Guest user access restrictions**
- **Guest users have the same access as members** grants all member user permissions to guest users by default.
- **Guest users have limited access to properties and memberships of directory objects (default)** restricts guest access to only their own user profile by default. Access to other users and group information is no longer allowed.
- **Guest user access is restricted to properties and memberships of their own directory objects** is the most restrictive one.
- **Guests can invite**
- **Anyone in the organization can invite guest users including guests and non-admins (most inclusive) - Default**
- **Member users and users assigned to specific admin roles can invite guest users including guests with member permissions**
- **Only users assigned to specific admin roles can invite guest users**
- **No one in the organization can invite guest users including admins (most restrictive)**
- **External user leave**: Default **True**
- Allow external users to leave the organization
- **Membres (**[**docs**](https://learn.microsoft.com/en-gb/entra/fundamentals/users-default-permissions#restrict-member-users-default-permissions)**)**
- Enregistrer des applications : Par défaut **Oui**
- Restreindre les utilisateurs non administrateurs de créer des locataires : Par défaut **Non**
- Créer des groupes de sécurité : Par défaut **Oui**
- Restreindre l'accès au portail d'administration Microsoft Entra : Par défaut **Non**
- Cela ne restreint pas l'accès API au portail (uniquement web)
- Autoriser les utilisateurs à connecter un compte de travail ou scolaire avec LinkedIn : Par défaut **Oui**
- Afficher garder l'utilisateur connecté : Par défaut **Oui**
- Restreindre les utilisateurs de récupérer la ou les clés BitLocker pour leurs appareils possédés : Par défaut Non (vérifiez dans les paramètres de l'appareil)
- Lire d'autres utilisateurs : Par défaut **Oui** (via Microsoft Graph)
- **Invités**
- **Restrictions d'accès des utilisateurs invités**
- **Les utilisateurs invités ont le même accès que les membres** accorde par défaut toutes les permissions des utilisateurs membres aux utilisateurs invités.
- **Les utilisateurs invités ont un accès limité aux propriétés et adhésions des objets d'annuaire (par défaut)** restreint l'accès des invités uniquement à leur propre profil utilisateur par défaut. L'accès aux informations d'autres utilisateurs et groupes n'est plus autorisé.
- **L'accès des utilisateurs invités est restreint aux propriétés et adhésions de leurs propres objets d'annuaire** est la plus restrictive.
- **Les invités peuvent inviter**
- **Quiconque dans l'organisation peut inviter des utilisateurs invités, y compris des invités et des non-administrateurs (le plus inclusif) - Par défaut**
- **Les utilisateurs membres et les utilisateurs assignés à des rôles administratifs spécifiques peuvent inviter des utilisateurs invités, y compris des invités avec des permissions de membre**
- **Seuls les utilisateurs assignés à des rôles administratifs spécifiques peuvent inviter des utilisateurs invités**
- **Personne dans l'organisation ne peut inviter des utilisateurs invités, y compris des administrateurs (le plus restrictif)**
- **Les utilisateurs externes peuvent partir** : Par défaut **Vrai**
- Autoriser les utilisateurs externes à quitter l'organisation
> [!TIP]
> Even if restricted by default, users (members and guests) with granted permissions could perform the previous actions.
> Même s'ils sont restreints par défaut, les utilisateurs (membres et invités) avec des permissions accordées pourraient effectuer les actions précédentes.
### **Groups**
### **Groupes**
There are **2 types of groups**:
Il existe **2 types de groupes** :
- **Security**: This type of group is used to give members access to aplications, resources and assign licenses. Users, devices, service principals and other groups an be members.
- **Microsoft 365**: This type of group is used for collaboration, giving members access to a shared mailbox, calendar, files, SharePoint site, and so on. Group members can only be users.
- This will have an **email address** with the domain of the EntraID tenant.
- **Sécurité** : Ce type de groupe est utilisé pour donner aux membres accès aux applications, ressources et attribuer des licences. Les utilisateurs, appareils, principaux de service et autres groupes peuvent être membres.
- **Microsoft 365** : Ce type de groupe est utilisé pour la collaboration, donnant aux membres accès à une boîte aux lettres partagée, un calendrier, des fichiers, un site SharePoint, etc. Les membres du groupe ne peuvent être que des utilisateurs.
- Cela aura une **adresse email** avec le domaine du locataire EntraID.
There are **2 types of memberships**:
Il existe **2 types d'adhésions** :
- **Assigned**: Allow to manually add specific members to a group.
- **Dynamic membership**: Automatically manages membership using rules, updating group inclusion when members attributes change.
- **Assigné** : Permet d'ajouter manuellement des membres spécifiques à un groupe.
- **Adhésion dynamique** : Gère automatiquement l'adhésion en utilisant des règles, mettant à jour l'inclusion du groupe lorsque les attributs des membres changent.
### **Service Principals**
### **Principaux de service**
A **Service Principal** is an **identity** created for **use** with **applications**, hosted services, and automated tools to access Azure resources. This access is **restricted by the roles assigned** to the service principal, giving you control over **which resources can be accessed** and at which level. For security reasons, it's always recommended to **use service principals with automated tools** rather than allowing them to log in with a user identity.
Un **Principal de service** est une **identité** créée pour **utiliser** avec des **applications**, des services hébergés et des outils automatisés pour accéder aux ressources Azure. Cet accès est **restreint par les rôles assignés** au principal de service, vous donnant le contrôle sur **quelles ressources peuvent être accessibles** et à quel niveau. Pour des raisons de sécurité, il est toujours recommandé d'**utiliser des principaux de service avec des outils automatisés** plutôt que de leur permettre de se connecter avec une identité utilisateur.
It's possible to **directly login as a service principal** by generating it a **secret** (password), a **certificate**, or granting **federated** access to third party platforms (e.g. Github Actions) over it.
Il est possible de **se connecter directement en tant que principal de service** en lui générant un **secret** (mot de passe), un **certificat**, ou en accordant un accès **fédéré** à des plateformes tierces (par exemple, Github Actions) à son sujet.
- If you choose **password** auth (by default), **save the password generated** as you won't be able to access it again.
- If you choose certificate authentication, make sure the **application will have access over the private key**.
- Si vous choisissez l'authentification par **mot de passe** (par défaut), **enregistrez le mot de passe généré** car vous ne pourrez plus y accéder.
- Si vous choisissez l'authentification par certificat, assurez-vous que l'**application aura accès à la clé privée**.
### App Registrations
### Enregistrements d'applications
An **App Registration** is a configuration that allows an application to integrate with Entra ID and to perform actions.
Un **Enregistrement d'application** est une configuration qui permet à une application de s'intégrer avec Entra ID et d'effectuer des actions.
#### Key Components:
#### Composants clés :
1. **Application ID (Client ID):** A unique identifier for your app in Azure AD.
2. **Redirect URIs:** URLs where Azure AD sends authentication responses.
3. **Certificates, Secrets & Federated Credentials:** It's possible to generate a secret or a certificate to login as the service principal of the application, or to grant federated access to it (e.g. Github Actions).&#x20;
1. If a **certificate** or **secret** is generated, it's possible to a person to **login as the service principal** with CLI tools by knowing the **application ID**, the **secret** or **certificate** and the **tenant** (domain or ID).
4. **API Permissions:** Specifies what resources or APIs the app can access.
5. **Authentication Settings:** Defines the app's supported authentication flows (e.g., OAuth2, OpenID Connect).
6. **Service Principal**: A service principal is created when an App is created (if it's done from the web console) or when it's installed in a new tenant.
1. The **service principal** will get all the requested permissions it was configured with.
1. **ID d'application (Client ID)** : Un identifiant unique pour votre application dans Azure AD.
2. **URI de redirection** : URLs Azure AD envoie les réponses d'authentification.
3. **Certificats, Secrets & Identifiants fédérés** : Il est possible de générer un secret ou un certificat pour se connecter en tant que principal de service de l'application, ou d'accorder un accès fédéré à celle-ci (par exemple, Github Actions).&#x20;
1. Si un **certificat** ou un **secret** est généré, il est possible pour une personne de **se connecter en tant que principal de service** avec des outils CLI en connaissant l'**ID d'application**, le **secret** ou le **certificat** et le **locataire** (domaine ou ID).
4. **Permissions API** : Spécifie quelles ressources ou API l'application peut accéder.
5. **Paramètres d'authentification** : Définit les flux d'authentification pris en charge par l'application (par exemple, OAuth2, OpenID Connect).
6. **Principal de service** : Un principal de service est créé lorsqu'une application est créée (si cela est fait depuis la console web) ou lorsqu'elle est installée dans un nouveau locataire.
1. Le **principal de service** obtiendra toutes les permissions demandées avec lesquelles il a été configuré.
### Default Consent Permissions
### Permissions de consentement par défaut
**User consent for applications**
**Consentement des utilisateurs pour les applications**
- **Do not allow user consent**
- An administrator will be required for all apps.
- **Allow user consent for apps from verified publishers, for selected permissions (Recommended)**
- All users can consent for permissions classified as "low impact", for apps from verified publishers or apps registered in this organization.
- **Default** low impact permissions (although you need to accept to add them as low):
- User.Read - sign in and read user profile
- offline_access - maintain access to data that users have given it access to
- openid - sign users in
- profile - view user's basic profile
- email - view user's email address
- **Allow user consent for apps (Default)**
- All users can consent for any app to access the organization's data.
- **Ne pas autoriser le consentement des utilisateurs**
- Un administrateur sera requis pour toutes les applications.
- **Autoriser le consentement des utilisateurs pour les applications de publishers vérifiés, pour des permissions sélectionnées (Recommandé)**
- Tous les utilisateurs peuvent consentir pour des permissions classées comme "faible impact", pour des applications de publishers vérifiés ou des applications enregistrées dans cette organisation.
- **Permissions par défaut à faible impact** (bien que vous deviez accepter de les ajouter comme faibles) :
- User.Read - se connecter et lire le profil utilisateur
- offline_access - maintenir l'accès aux données auxquelles les utilisateurs ont donné accès
- openid - connecter les utilisateurs
- profile - voir le profil de base de l'utilisateur
- email - voir l'adresse email de l'utilisateur
- **Autoriser le consentement des utilisateurs pour les applications (Par défaut)**
- Tous les utilisateurs peuvent consentir pour toute application d'accéder aux données de l'organisation.
**Admin consent requests**: Default **No**
**Demandes de consentement administratives** : Par défaut **Non**
- Users can request admin consent to apps they are unable to consent to
- If **Yes**: Its possible to indicate Users, Groups and Roles that can consent requests
- Configure also if users will receive email notifications and expiration reminders&#x20;
- Les utilisateurs peuvent demander le consentement administratif pour des applications auxquelles ils ne peuvent pas consentir
- Si **Oui** : Il est possible d'indiquer les utilisateurs, groupes et rôles qui peuvent consentir aux demandes
- Configurez également si les utilisateurs recevront des notifications par email et des rappels d'expiration&#x20;
### **Managed Identity (Metadata)**
### **Identité gérée (Métadonnées)**
Managed identities in Azure Active Directory offer a solution for **automatically managing the identity** of applications. These identities are used by applications for the purpose of **connecting** to **resources** compatible with Azure Active Directory (**Azure AD**) authentication. This allows to **remove the need of hardcoding cloud credentials** in the code as the application will be able to contact the **metadata** service to get a valid token to **perform actions** as the indicated managed identity in Azure.
Les identités gérées dans Azure Active Directory offrent une solution pour **gérer automatiquement l'identité** des applications. Ces identités sont utilisées par les applications dans le but de **se connecter** aux **ressources** compatibles avec l'authentification Azure Active Directory (**Azure AD**). Cela permet de **supprimer le besoin de coder en dur les identifiants cloud** dans le code, car l'application pourra contacter le **service de métadonnées** pour obtenir un jeton valide afin de **réaliser des actions** en tant qu'identité gérée indiquée dans Azure.
There are two types of managed identities:
Il existe deux types d'identités gérées :
- **System-assigned**. Some Azure services allow you to **enable a managed identity directly on a service instance**. When you enable a system-assigned managed identity, a **service principal** is created in the Entra ID tenant trusted by the subscription where the resource is located. When the **resource** is **deleted**, Azure automatically **deletes** the **identity** for you.
- **User-assigned**. It's also possible for users to generate managed identities. These are created inside a resource group inside a subscription and a service principal will be created in the EntraID trusted by the subscription. Then, you can assign the managed identity to one or **more instances** of an Azure service (multiple resources). For user-assigned managed identities, the **identity is managed separately from the resources that use it**.
- **Assigné au système**. Certains services Azure vous permettent d'**activer une identité gérée directement sur une instance de service**. Lorsque vous activez une identité gérée assignée au système, un **principal de service** est créé dans le locataire Entra ID de confiance par l'abonnement où la ressource est située. Lorsque la **ressource** est **supprimée**, Azure supprime automatiquement **l'identité** pour vous.
- **Assigné par l'utilisateur**. Il est également possible pour les utilisateurs de générer des identités gérées. Celles-ci sont créées à l'intérieur d'un groupe de ressources dans un abonnement et un principal de service sera créé dans l'EntraID de confiance par l'abonnement. Ensuite, vous pouvez assigner l'identité gérée à une ou **plusieurs instances** d'un service Azure (plusieurs ressources). Pour les identités gérées assignées par l'utilisateur, **l'identité est gérée séparément des ressources qui l'utilisent**.
Managed Identities **don't generate eternal credentials** (like passwords or certificates) to access as the service principal attached to it.
Les identités gérées **ne génèrent pas de credentials éternels** (comme des mots de passe ou des certificats) pour accéder en tant que principal de service qui y est attaché.
### Enterprise Applications
### Applications d'entreprise
Its just a **table in Azure to filter service principals** and check the applications that have been assigned to.
C'est juste une **table dans Azure pour filtrer les principaux de service** et vérifier les applications qui leur ont été assignées.
**It isnt another type of “application”,** there isnt any object in Azure that is an “Enterprise Application”, its just an abstraction to check the Service principals, App registrations and managed identities.
**Ce n'est pas un autre type d'“application”**, il n'y a aucun objet dans Azure qui soit une “Application d'entreprise”, c'est juste une abstraction pour vérifier les Principaux de service, les Enregistrements d'applications et les identités gérées.
### Administrative Units
### Unités administratives
Administrative units allows to **give permissions from a role over a specific portion of an organization**.
Les unités administratives permettent de **donner des permissions d'un rôle sur une portion spécifique d'une organisation**.
Example:
Exemple :
- Scenario: A company wants regional IT admins to manage only the users in their own region.
- Implementation:
- Create Administrative Units for each region (e.g., "North America AU", "Europe AU").
- Populate AUs with users from their respective regions.
- AUs can **contain users, groups, or devices**
- AUs support **dynamic memberships**
- AUs **cannot contain AUs**
- Assign Admin Roles:
- Grant the "User Administrator" role to regional IT staff, scoped to their region's AU.
- Outcome: Regional IT admins can manage user accounts within their region without affecting other regions.
- Scénario : Une entreprise souhaite que les administrateurs informatiques régionaux gèrent uniquement les utilisateurs de leur propre région.
- Mise en œuvre :
- Créer des unités administratives pour chaque région (par exemple, "AU Amérique du Nord", "AU Europe").
- Peupler les AU avec des utilisateurs de leurs régions respectives.
- Les AU peuvent **contenir des utilisateurs, groupes ou appareils**
- Les AU prennent en charge **les adhésions dynamiques**
- Les AU **ne peuvent pas contenir d'AU**
- Attribuer des rôles administratifs :
- Accorder le rôle "Administrateur des utilisateurs" au personnel informatique régional, limité à l'AU de leur région.
- Résultat : Les administrateurs informatiques régionaux peuvent gérer les comptes utilisateurs au sein de leur région sans affecter d'autres régions.
### Entra ID Roles
### Rôles Entra ID
- In order to manage Entra ID there are some **built-in roles** that can be assigned to Entra ID principals to manage Entra ID
- Check the roles in [https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference)
- The most privileged role is **Global Administrator**
- In the Description of the role its possible to see its **granular permissions**
- Afin de gérer Entra ID, il existe certains **rôles intégrés** qui peuvent être assignés aux principaux Entra ID pour gérer Entra ID
- Vérifiez les rôles sur [https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference)
- Le rôle le plus privilégié est **Administrateur global**
- Dans la description du rôle, il est possible de voir ses **permissions granulaires**
## Roles & Permissions
## Rôles & Permissions
**Roles** are **assigned** to **principals** on a **scope**: `principal -[HAS ROLE]->(scope)`
**Les rôles** sont **assignés** aux **principaux** sur un **scope** : `principal -[HAS ROLE]->(scope)`
**Roles** assigned to **groups** are **inherited** by all the **members** of the group.
**Les rôles** assignés aux **groupes** sont **hérités** par tous les **membres** du groupe.
Depending on the scope the role was assigned to, the **role** cold be **inherited** to **other resources** inside the scope container. For example, if a user A has a **role on the subscription**, he will have that **role on all the resource groups** inside the subscription and on **all the resources** inside the resource group.
Selon le scope auquel le rôle a été assigné, le **rôle** peut être **rité** par **d'autres ressources** à l'intérieur du conteneur de scope. Par exemple, si un utilisateur A a un **rôle sur l'abonnement**, il aura ce **rôle sur tous les groupes de ressources** à l'intérieur de l'abonnement et sur **toutes les ressources** à l'intérieur du groupe de ressources.
### **Classic Roles**
### **Rôles classiques**
| **Owner** | <ul><li>Full access to all resources</li><li>Can manage access for other users</li></ul> | All resource types |
| **Propriétaire** | <ul><li>Accès complet à toutes les ressources</li><li>Peut gérer l'accès pour d'autres utilisateurs</li></ul> | Tous les types de ressources |
| ----------------------------- | ---------------------------------------------------------------------------------------- | ------------------ |
| **Contributor** | <ul><li>Full access to all resources</li><li>Cannot manage access</li></ul> | All resource types |
| **Reader** | • View all resources | All resource types |
| **User Access Administrator** | <ul><li>View all resources</li><li>Can manage access for other users</li></ul> | All resource types |
| **Contributeur** | <ul><li>Accès complet à toutes les ressources</li><li>Ne peut pas gérer l'accès</li></ul> | Tous les types de ressources |
| **Lecteur** | • Voir toutes les ressources | Tous les types de ressources |
| **Administrateur d'accès utilisateur** | <ul><li>Voir toutes les ressources</li><li>Peut gérer l'accès pour d'autres utilisateurs</li></ul> | Tous les types de ressources |
### Built-In roles
### Rôles intégrés
[From the docs: ](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles)[Azure role-based access control (Azure RBAC)](https://learn.microsoft.com/en-us/azure/role-based-access-control/overview) has several Azure **built-in roles** that you can **assign** to **users, groups, service principals, and managed identities**. Role assignments are the way you control **access to Azure resources**. If the built-in roles don't meet the specific needs of your organization, you can create your own [**Azure custom roles**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles)**.**
[Des docs : ](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles)[Le contrôle d'accès basé sur les rôles Azure (Azure RBAC)](https://learn.microsoft.com/en-us/azure/role-based-access-control/overview) a plusieurs **rôles intégrés Azure** que vous pouvez **assigner** à **des utilisateurs, groupes, principaux de service et identités gérées**. Les attributions de rôle sont la manière dont vous contrôlez **l'accès aux ressources Azure**. Si les rôles intégrés ne répondent pas aux besoins spécifiques de votre organisation, vous pouvez créer vos propres [**rôles personnalisés Azure**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles)**.**
**Built-In** roles apply only to the **resources** they are **meant** to, for example check this 2 examples of **Built-In roles over Compute** resources:
Les **rôles intégrés** s'appliquent uniquement aux **ressources** pour lesquelles ils sont **destinés**, par exemple, vérifiez ces 2 exemples de **rôles intégrés sur les ressources Compute** :
| [Disk Backup Reader](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#disk-backup-reader) | Provides permission to backup vault to perform disk backup. | 3e5e47e6-65f7-47ef-90b5-e5dd4d455f24 |
| [Lecteur de sauvegarde de disque](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#disk-backup-reader) | Fournit la permission au coffre de sauvegarde pour effectuer une sauvegarde de disque. | 3e5e47e6-65f7-47ef-90b5-e5dd4d455f24 |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------------------ |
| [Virtual Machine User Login](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#virtual-machine-user-login) | View Virtual Machines in the portal and login as a regular user. | fb879df8-f326-4884-b1cf-06f3ad86be52 |
| [Connexion utilisateur de machine virtuelle](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#virtual-machine-user-login) | Voir les machines virtuelles dans le portail et se connecter en tant qu'utilisateur régulier. | fb879df8-f326-4884-b1cf-06f3ad86be52 |
This roles can **also be assigned over logic containers** (such as management groups, subscriptions and resource groups) and the principals affected will have them **over the resources inside those containers**.
Ces rôles peuvent **également être assignés sur des conteneurs logiques** (tels que des groupes de gestion, des abonnements et des groupes de ressources) et les principaux affectés les auront **sur les ressources à l'intérieur de ces conteneurs**.
- Find here a list with [**all the Azure built-in roles**](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles).
- Find here a list with [**all the Entra ID built-in roles**](https://learn.microsoft.com/en-us/azure/active-directory/roles/permissions-reference).
- Trouvez ici une liste avec [**tous les rôles intégrés Azure**](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles).
- Trouvez ici une liste avec [**tous les rôles intégrés Entra ID**](https://learn.microsoft.com/en-us/azure/active-directory/roles/permissions-reference).
### Custom Roles
### Rôles personnalisés
- Its also possible to create [**custom roles**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles)
- They are created inside a scope, although a role can be in several scopes (management groups, subscription and resource groups)
- Its possible to configure all the granular permissions the custom role will have
- Its possible to exclude permissions
- A principal with a excluded permission wont be able to use it even if the permissions is being granted elsewhere
- Its possible to use wildcards
- The used format is a JSON
- `actions` are for control actions over the resource
- `dataActions` are permissions over the data within the object
Example of permissions JSON for a custom role:
- Il est également possible de créer [**rôles personnalisés**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles)
- Ils sont créés à l'intérieur d'un scope, bien qu'un rôle puisse être dans plusieurs scopes (groupes de gestion, abonnements et groupes de ressources)
- Il est possible de configurer toutes les permissions granulaires que le rôle personnalisé aura
- Il est possible d'exclure des permissions
- Un principal avec une permission exclue ne pourra pas l'utiliser même si la permission est accordée ailleurs
- Il est possible d'utiliser des jokers
- Le format utilisé est un JSON
- `actions` sont pour contrôler les actions sur la ressource
- `dataActions` sont des permissions sur les données à l'intérieur de l'objet
Exemple de JSON de permissions pour un rôle personnalisé :
```json
{
"properties": {
"roleName": "",
"description": "",
"assignableScopes": ["/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f"],
"permissions": [
{
"actions": [
"Microsoft.DigitalTwins/register/action",
"Microsoft.DigitalTwins/unregister/action",
"Microsoft.DigitalTwins/operations/read",
"Microsoft.DigitalTwins/digitalTwinsInstances/read",
"Microsoft.DigitalTwins/digitalTwinsInstances/write",
"Microsoft.CostManagement/exports/*"
],
"notActions": [
"Astronomer.Astro/register/action",
"Astronomer.Astro/unregister/action",
"Astronomer.Astro/operations/read",
"Astronomer.Astro/organizations/read"
],
"dataActions": [],
"notDataActions": []
}
]
}
"properties": {
"roleName": "",
"description": "",
"assignableScopes": ["/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f"],
"permissions": [
{
"actions": [
"Microsoft.DigitalTwins/register/action",
"Microsoft.DigitalTwins/unregister/action",
"Microsoft.DigitalTwins/operations/read",
"Microsoft.DigitalTwins/digitalTwinsInstances/read",
"Microsoft.DigitalTwins/digitalTwinsInstances/write",
"Microsoft.CostManagement/exports/*"
],
"notActions": [
"Astronomer.Astro/register/action",
"Astronomer.Astro/unregister/action",
"Astronomer.Astro/operations/read",
"Astronomer.Astro/organizations/read"
],
"dataActions": [],
"notDataActions": []
}
]
}
}
```
### Permissions order
- In order for a **principal to have some access over a resource** he needs an explicit role being granted to him (anyhow) **granting him that permission**.
- An explicit **deny role assignment takes precedence** over the role granting the permission.
- Afin qu'un **principal ait un accès sur une ressource**, il a besoin d'un rôle explicite qui lui est accordé (de quelque manière que ce soit) **lui accordant cette permission**.
- Une **attribution de rôle de refus explicite a la priorité** sur le rôle accordant la permission.
<figure><img src="../../../images/image (191).png" alt=""><figcaption><p><a href="https://link.springer.com/chapter/10.1007/978-1-4842-7325-8_10">https://link.springer.com/chapter/10.1007/978-1-4842-7325-8_10</a></p></figcaption></figure>
### Global Administrator
Global Administrator is a role from Entra ID that grants **complete control over the Entra ID tenant**. However, it doesn't grant any permissions over Azure resources by default.
Le Global Administrator est un rôle d'Entra ID qui accorde **un contrôle total sur le locataire Entra ID**. Cependant, il n'accorde par défaut aucune permission sur les ressources Azure.
Users with the Global Administrator role has the ability to '**elevate' to User Access Administrator Azure role in the Root Management Group**. So Global Administrators can manage access in **all Azure subscriptions and management groups.**\
This elevation can be done at the end of the page: [https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/\~/Properties](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Properties)
Les utilisateurs ayant le rôle de Global Administrator ont la capacité de '**s'élever' au rôle d'Administrateur d'Accès Utilisateur Azure dans le Groupe de Gestion Racine**. Ainsi, les Global Administrators peuvent gérer l'accès dans **toutes les souscriptions Azure et groupes de gestion.**\
Cette élévation peut être effectuée en bas de la page : [https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/\~/Properties](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Properties)
<figure><img src="../../../images/image (349).png" alt=""><figcaption></figcaption></figure>
### Azure Policies
**Azure Policies** are rules that help organizations ensure their resources meet specific standards and compliance requirements. They allow you to **enforce or audit settings on resources in Azure**. For example, you can prevent the creation of virtual machines in an unauthorized region or ensure that all resources have specific tags for tracking.
**Les Azure Policies** sont des règles qui aident les organisations à s'assurer que leurs ressources répondent à des normes spécifiques et à des exigences de conformité. Elles vous permettent de **faire respecter ou d'auditer les paramètres sur les ressources dans Azure**. Par exemple, vous pouvez empêcher la création de machines virtuelles dans une région non autorisée ou vous assurer que toutes les ressources ont des balises spécifiques pour le suivi.
Azure Policies are **proactive**: they can stop non-compliant resources from being created or changed. They are also **reactive**, allowing you to find and fix existing non-compliant resources.
Les Azure Policies sont **proactives** : elles peuvent empêcher la création ou la modification de ressources non conformes. Elles sont également **réactives**, vous permettant de trouver et de corriger les ressources non conformes existantes.
#### **Key Concepts**
1. **Policy Definition**: A rule, written in JSON, that specifies what is allowed or required.
2. **Policy Assignment**: The application of a policy to a specific scope (e.g., subscription, resource group).
3. **Initiatives**: A collection of policies grouped together for broader enforcement.
4. **Effect**: Specifies what happens when the policy is triggered (e.g., "Deny," "Audit," or "Append").
1. **Définition de la politique** : Une règle, écrite en JSON, qui spécifie ce qui est autorisé ou requis.
2. **Attribution de la politique** : L'application d'une politique à un champ spécifique (par exemple, souscription, groupe de ressources).
3. **Initiatives** : Une collection de politiques regroupées pour une application plus large.
4. **Effet** : Spécifie ce qui se passe lorsque la politique est déclenchée (par exemple, "Refuser", "Auditer" ou "Ajouter").
**Some examples:**
**Quelques exemples :**
1. **Ensuring Compliance with Specific Azure Regions**: This policy ensures that all resources are deployed in specific Azure regions. For example, a company might want to ensure all its data is stored in Europe for GDPR compliance.
2. **Enforcing Naming Standards**: Policies can enforce naming conventions for Azure resources. This helps in organizing and easily identifying resources based on their names, which is helpful in large environments.
3. **Restricting Certain Resource Types**: This policy can restrict the creation of certain types of resources. For example, a policy could be set to prevent the creation of expensive resource types, like certain VM sizes, to control costs.
4. **Enforcing Tagging Policies**: Tags are key-value pairs associated with Azure resources used for resource management. Policies can enforce that certain tags must be present, or have specific values, for all resources. This is useful for cost tracking, ownership, or categorization of resources.
5. **Limiting Public Access to Resources**: Policies can enforce that certain resources, like storage accounts or databases, do not have public endpoints, ensuring that they are only accessible within the organization's network.
6. **Automatically Applying Security Settings**: Policies can be used to automatically apply security settings to resources, such as applying a specific network security group to all VMs or ensuring that all storage accounts use encryption.
1. **Assurer la conformité avec des régions Azure spécifiques** : Cette politique garantit que toutes les ressources sont déployées dans des régions Azure spécifiques. Par exemple, une entreprise pourrait vouloir s'assurer que toutes ses données sont stockées en Europe pour la conformité au RGPD.
2. **Faire respecter les normes de nommage** : Les politiques peuvent faire respecter des conventions de nommage pour les ressources Azure. Cela aide à organiser et à identifier facilement les ressources en fonction de leurs noms, ce qui est utile dans de grands environnements.
3. **Restreindre certains types de ressources** : Cette politique peut restreindre la création de certains types de ressources. Par exemple, une politique pourrait être définie pour empêcher la création de types de ressources coûteux, comme certaines tailles de VM, pour contrôler les coûts.
4. **Faire respecter les politiques de balisage** : Les balises sont des paires clé-valeur associées aux ressources Azure utilisées pour la gestion des ressources. Les politiques peuvent faire respecter que certaines balises doivent être présentes, ou avoir des valeurs spécifiques, pour toutes les ressources. Cela est utile pour le suivi des coûts, la propriété ou la catégorisation des ressources.
5. **Limiter l'accès public aux ressources** : Les politiques peuvent faire respecter que certaines ressources, comme les comptes de stockage ou les bases de données, n'ont pas de points de terminaison publics, garantissant qu'elles ne sont accessibles que dans le réseau de l'organisation.
6. **Appliquer automatiquement les paramètres de sécurité** : Les politiques peuvent être utilisées pour appliquer automatiquement des paramètres de sécurité aux ressources, comme appliquer un groupe de sécurité réseau spécifique à toutes les VM ou s'assurer que tous les comptes de stockage utilisent le chiffrement.
Note that Azure Policies can be attached to any level of the Azure hierarchy, but they are **commonly used in the root management group** or in other management groups.
Azure policy json example:
Notez que les Azure Policies peuvent être attachées à n'importe quel niveau de la hiérarchie Azure, mais elles sont **généralement utilisées dans le groupe de gestion racine** ou dans d'autres groupes de gestion.
Exemple de json de politique Azure :
```json
{
"policyRule": {
"if": {
"field": "location",
"notIn": ["eastus", "westus"]
},
"then": {
"effect": "Deny"
}
},
"parameters": {},
"displayName": "Allow resources only in East US and West US",
"description": "This policy ensures that resources can only be created in East US or West US.",
"mode": "All"
"policyRule": {
"if": {
"field": "location",
"notIn": ["eastus", "westus"]
},
"then": {
"effect": "Deny"
}
},
"parameters": {},
"displayName": "Allow resources only in East US and West US",
"description": "This policy ensures that resources can only be created in East US or West US.",
"mode": "All"
}
```
### Héritage des Permissions
### Permissions Inheritance
Dans Azure, **les permissions peuvent être attribuées à n'importe quelle partie de la hiérarchie**. Cela inclut les groupes de gestion, les abonnements, les groupes de ressources et les ressources individuelles. Les permissions sont **héritées** par les **ressources** contenues de l'entité où elles ont été attribuées.
In Azure **permissions are can be assigned to any part of the hierarchy**. That includes management groups, subscriptions, resource groups, and individual resources. Permissions are **inherited** by contained **resources** of the entity where they were assigned.
This hierarchical structure allows for efficient and scalable management of access permissions.
Cette structure hiérarchique permet une gestion efficace et évolutive des permissions d'accès.
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
### Azure RBAC vs ABAC
**RBAC** (role-based access control) is what we have seen already in the previous sections: **Assigning a role to a principal to grant him access** over a resource.\
However, in some cases you might want to provide **more fined-grained access management** or **simplify** the management of **hundreds** of role **assignments**.
**RBAC** (contrôle d'accès basé sur les rôles) est ce que nous avons déjà vu dans les sections précédentes : **Attribuer un rôle à un principal pour lui accorder l'accès** à une ressource.\
Cependant, dans certains cas, vous pourriez vouloir fournir une **gestion des accès plus granulaire** ou **simplifier** la gestion de **centaines** d'assignations de rôles.
Azure **ABAC** (attribute-based access control) builds on Azure RBAC by adding **role assignment conditions based on attributes** in the context of specific actions. A _role assignment condition_ is an **additional check that you can optionally add to your role assignment** to provide more fine-grained access control. A condition filters down permissions granted as a part of the role definition and role assignment. For example, you can **add a condition that requires an object to have a specific tag to read the object**.\
You **cannot** explicitly **deny** **access** to specific resources **using conditions**.
Azure **ABAC** (contrôle d'accès basé sur les attributs) s'appuie sur Azure RBAC en ajoutant des **conditions d'assignation de rôle basées sur des attributs** dans le contexte d'actions spécifiques. Une _condition d'assignation de rôle_ est un **vérification supplémentaire que vous pouvez optionnellement ajouter à votre assignation de rôle** pour fournir un contrôle d'accès plus granulaire. Une condition filtre les permissions accordées dans le cadre de la définition de rôle et de l'assignation de rôle. Par exemple, vous pouvez **ajouter une condition qui exige qu'un objet ait une étiquette spécifique pour lire l'objet**.\
Vous **ne pouvez pas** explicitement **refuser** l'**accès** à des ressources spécifiques **en utilisant des conditions**.
## References
## Références
- [https://learn.microsoft.com/en-us/azure/governance/management-groups/overview](https://learn.microsoft.com/en-us/azure/governance/management-groups/overview)
- [https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/organize-subscriptions](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/organize-subscriptions)
@@ -379,7 +375,3 @@ You **cannot** explicitly **deny** **access** to specific resources **using cond
- [https://stackoverflow.com/questions/65922566/what-are-the-differences-between-service-principal-and-app-registration](https://stackoverflow.com/questions/65922566/what-are-the-differences-between-service-principal-and-app-registration)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,98 +4,97 @@
## Basic Information
Entra ID is Microsoft's cloud-based identity and access management (IAM) platform, serving as the foundational authentication and authorization system for services like Microsoft 365 and Azure Resource Manager. Azure AD implements the OAuth 2.0 authorization framework and the OpenID Connect (OIDC) authentication protocol to manage access to resources.
Entra ID est la plateforme de gestion des identités et des accès (IAM) basée sur le cloud de Microsoft, servant de système d'authentification et d'autorisation fondamental pour des services comme Microsoft 365 et Azure Resource Manager. Azure AD implémente le cadre d'autorisation OAuth 2.0 et le protocole d'authentification OpenID Connect (OIDC) pour gérer l'accès aux ressources.
### OAuth
**Key Participants in OAuth 2.0:**
**Participants clés dans OAuth 2.0 :**
1. **Resource Server (RS):** Protects resources owned by the resource owner.
2. **Resource Owner (RO):** Typically an end-user who owns the protected resources.
3. **Client Application (CA):** An application seeking access to resources on behalf of the resource owner.
4. **Authorization Server (AS):** Issues access tokens to client applications after authenticating and authorizing them.
1. **Serveur de ressources (RS) :** Protège les ressources appartenant au propriétaire des ressources.
2. **Propriétaire des ressources (RO) :** Typiquement un utilisateur final qui possède les ressources protégées.
3. **Application cliente (CA) :** Une application cherchant à accéder aux ressources au nom du propriétaire des ressources.
4. **Serveur d'autorisation (AS) :** Délivre des jetons d'accès aux applications clientes après les avoir authentifiées et autorisées.
**Scopes and Consent:**
**Scopes et Consentement :**
- **Scopes:** Granular permissions defined on the resource server that specify access levels.
- **Consent:** The process by which a resource owner grants a client application permission to access resources with specific scopes.
- **Scopes :** Permissions granulaires définies sur le serveur de ressources qui spécifient les niveaux d'accès.
- **Consentement :** Le processus par lequel un propriétaire de ressources accorde à une application cliente la permission d'accéder aux ressources avec des scopes spécifiques.
**Microsoft 365 Integration:**
**Intégration Microsoft 365 :**
- Microsoft 365 utilizes Azure AD for IAM and is composed of multiple "first-party" OAuth applications.
- These applications are deeply integrated and often have interdependent service relationships.
- To simplify user experience and maintain functionality, Microsoft grants "implied consent" or "pre-consent" to these first-party applications.
- **Implied Consent:** Certain applications are automatically **granted access to specific scopes without explicit user or administrator approva**l.
- These pre-consented scopes are typically hidden from both users and administrators, making them less visible in standard management interfaces.
- Microsoft 365 utilise Azure AD pour l'IAM et est composé de plusieurs applications OAuth "de première partie".
- Ces applications sont profondément intégrées et ont souvent des relations de service interdépendantes.
- Pour simplifier l'expérience utilisateur et maintenir la fonctionnalité, Microsoft accorde un "consentement implicite" ou un "pré-consentement" à ces applications de première partie.
- **Consentement implicite :** Certaines applications se voient automatiquement **accorder l'accès à des scopes spécifiques sans approbation explicite de l'utilisateur ou de l'administrateur**.
- Ces scopes pré-consentis sont généralement cachés à la fois des utilisateurs et des administrateurs, les rendant moins visibles dans les interfaces de gestion standard.
**Client Application Types:**
**Types d'applications clientes :**
1. **Confidential Clients:**
- Possess their own credentials (e.g., passwords or certificates).
- Can **securely authenticate themselves** to the authorization server.
2. **Public Clients:**
- Do not have unique credentials.
- Cannot securely authenticate to the authorization server.
- **Security Implication:** An attacker can impersonate a public client application when requesting tokens, as there is no mechanism for the authorization server to verify the legitimacy of the application.
1. **Clients confidentiels :**
- Possèdent leurs propres identifiants (par exemple, mots de passe ou certificats).
- Peuvent **s'authentifier de manière sécurisée** auprès du serveur d'autorisation.
2. **Clients publics :**
- N'ont pas d'identifiants uniques.
- Ne peuvent pas s'authentifier de manière sécurisée auprès du serveur d'autorisation.
- **Implication de sécurité :** Un attaquant peut usurper une application cliente publique lors de la demande de jetons, car il n'existe aucun mécanisme pour que le serveur d'autorisation vérifie la légitimité de l'application.
## Authentication Tokens
There are **three types of tokens** used in OIDC:
Il existe **trois types de jetons** utilisés dans OIDC :
- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** The client presents this token to the resource server to **access resources**. It can be used only for a specific combination of user, client, and resource and **cannot be revoked** until expiry - that is 1 hour by default.
- **ID Tokens**: The client receives this **token from the authorization server**. It contains basic information about the user. It is **bound to a specific combination of user and client**.
- **Refresh Tokens**: Provided to the client with access token. Used to **get new access and ID tokens**. It is bound to a specific combination of user and client and can be revoked. Default expiry is **90 days** for inactive refresh tokens and **no expiry for active tokens** (be from a refresh token is possible to get new refresh tokens).
- A refresh token should be tied to an **`aud`** , to some **scopes**, and to a **tenant** and it should only be able to generate access tokens for that aud, scopes (and no more) and tenant. However, this is not the case with **FOCI applications tokens**.
- A refresh token is encrypted and only Microsoft can decrypt it.
- Getting a new refresh token doesn't revoke the previous refresh token.
- [**Jetons d'accès**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Le client présente ce jeton au serveur de ressources pour **accéder aux ressources**. Il ne peut être utilisé que pour une combinaison spécifique d'utilisateur, de client et de ressource et **ne peut pas être révoqué** jusqu'à son expiration - c'est-à-dire 1 heure par défaut.
- **Jetons ID** : Le client reçoit ce **jeton du serveur d'autorisation**. Il contient des informations de base sur l'utilisateur. Il est **lié à une combinaison spécifique d'utilisateur et de client**.
- **Jetons de rafraîchissement** : Fournis au client avec le jeton d'accès. Utilisés pour **obtenir de nouveaux jetons d'accès et ID**. Il est lié à une combinaison spécifique d'utilisateur et de client et peut être révoqué. L'expiration par défaut est de **90 jours** pour les jetons de rafraîchissement inactifs et **pas d'expiration pour les jetons actifs** (il est possible d'obtenir de nouveaux jetons de rafraîchissement à partir d'un jeton de rafraîchissement).
- Un jeton de rafraîchissement doit être lié à un **`aud`**, à certains **scopes**, et à un **tenant** et il ne devrait pouvoir générer des jetons d'accès que pour cet aud, ces scopes (et pas plus) et ce tenant. Cependant, ce n'est pas le cas avec les **jetons d'applications FOCI**.
- Un jeton de rafraîchissement est crypté et seul Microsoft peut le déchiffrer.
- Obtenir un nouveau jeton de rafraîchissement ne révoque pas le jeton de rafraîchissement précédent.
> [!WARNING]
> Information for **conditional access** is **stored** inside the **JWT**. So, if you request the **token from an allowed IP address**, that **IP** will be **stored** in the token and then you can use that token from a **non-allowed IP to access the resources**.
> Les informations pour **l'accès conditionnel** sont **stockées** à l'intérieur du **JWT**. Donc, si vous demandez le **jeton depuis une adresse IP autorisée**, cette **IP** sera **stockée** dans le jeton et vous pourrez ensuite utiliser ce jeton depuis une **IP non autorisée pour accéder aux ressources**.
### Access Tokens "aud"
The field indicated in the "aud" field is the **resource server** (the application) used to perform the login.
Le champ indiqué dans le champ "aud" est le **serveur de ressources** (l'application) utilisé pour effectuer la connexion.
The command `az account get-access-token --resource-type [...]` supports the following types and each of them will add a specific "aud" in the resulting access token:
La commande `az account get-access-token --resource-type [...]` prend en charge les types suivants et chacun d'eux ajoutera un "aud" spécifique dans le jeton d'accès résultant :
> [!CAUTION]
> Note that the following are just the APIs supported by `az account get-access-token` but there are more.
> Notez que les éléments suivants ne sont que les API prises en charge par `az account get-access-token`, mais il y en a d'autres.
<details>
<summary>aud examples</summary>
<summary>exemples d'aud</summary>
- **aad-graph (Azure Active Directory Graph API)**: Used to access the legacy Azure AD Graph API (deprecated), which allows applications to read and write directory data in Azure Active Directory (Azure AD).
- `https://graph.windows.net/`
- **aad-graph (Azure Active Directory Graph API)** : Utilisé pour accéder à l'API Azure AD Graph héritée (dépréciée), qui permet aux applications de lire et d'écrire des données d'annuaire dans Azure Active Directory (Azure AD).
- `https://graph.windows.net/`
* **arm (Azure Resource Manager)**: Used to manage Azure resources through the Azure Resource Manager API. This includes operations like creating, updating, and deleting resources such as virtual machines, storage accounts, and more.
- `https://management.core.windows.net/ or https://management.azure.com/`
* **arm (Azure Resource Manager)** : Utilisé pour gérer les ressources Azure via l'API Azure Resource Manager. Cela inclut des opérations telles que la création, la mise à jour et la suppression de ressources telles que des machines virtuelles, des comptes de stockage, et plus encore.
- `https://management.core.windows.net/ ou https://management.azure.com/`
- **batch (Azure Batch Services)**: Used to access Azure Batch, a service that enables large-scale parallel and high-performance computing applications efficiently in the cloud.
- `https://batch.core.windows.net/`
- **batch (Azure Batch Services)** : Utilisé pour accéder à Azure Batch, un service qui permet d'exécuter efficacement des applications de calcul parallèle à grande échelle et à haute performance dans le cloud.
- `https://batch.core.windows.net/`
* **data-lake (Azure Data Lake Storage)**: Used to interact with Azure Data Lake Storage Gen1, which is a scalable data storage and analytics service.
- `https://datalake.azure.net/`
* **data-lake (Azure Data Lake Storage)** : Utilisé pour interagir avec Azure Data Lake Storage Gen1, qui est un service de stockage et d'analyse de données évolutif.
- `https://datalake.azure.net/`
- **media (Azure Media Services)**: Used to access Azure Media Services, which provide cloud-based media processing and delivery services for video and audio content.
- `https://rest.media.azure.net`
- **media (Azure Media Services)** : Utilisé pour accéder à Azure Media Services, qui fournissent des services de traitement et de livraison de médias basés sur le cloud pour le contenu vidéo et audio.
- `https://rest.media.azure.net`
* **ms-graph (Microsoft Graph API)**: Used to access the Microsoft Graph API, the unified endpoint for Microsoft 365 services data. It allows you to access data and insights from services like Azure AD, Office 365, Enterprise Mobility, and Security services.
- `https://graph.microsoft.com`
* **ms-graph (Microsoft Graph API)** : Utilisé pour accéder à l'API Microsoft Graph, le point de terminaison unifié pour les données des services Microsoft 365. Il permet d'accéder aux données et aux informations des services tels qu'Azure AD, Office 365, Enterprise Mobility et les services de sécurité.
- `https://graph.microsoft.com`
- **oss-rdbms (Azure Open Source Relational Databases)**: Used to access Azure Database services for open-source relational database engines like MySQL, PostgreSQL, and MariaDB.
- `https://ossrdbms-aad.database.windows.net`
- **oss-rdbms (Azure Open Source Relational Databases)** : Utilisé pour accéder aux services de base de données Azure pour des moteurs de bases de données relationnelles open-source comme MySQL, PostgreSQL et MariaDB.
- `https://ossrdbms-aad.database.windows.net`
</details>
### Access Tokens Scopes "scp"
The scope of an access token is stored inside the scp key inside the access token JWT. These scopes define what the access token has access to.
Le scope d'un jeton d'accès est stocké à l'intérieur de la clé scp dans le JWT du jeton d'accès. Ces scopes définissent à quoi le jeton d'accès a accès.
If a JWT is allowed to contact an specific API but **doesn't have the scope** to perform the requested action, it **won't be able to perform the action** with that JWT.
Si un JWT est autorisé à contacter une API spécifique mais **n'a pas le scope** pour effectuer l'action demandée, il **ne pourra pas effectuer l'action** avec ce JWT.
### Get refresh & access token example
```python
# Code example from https://github.com/secureworks/family-of-client-ids-research
import msal
@@ -107,17 +106,17 @@ from typing import Any, Dict, List
# LOGIN VIA CODE FLOW AUTHENTICATION
azure_cli_client = msal.PublicClientApplication(
"04b07795-8ddb-461a-bbee-02f9e1bf7b46" # ID for Azure CLI client
"04b07795-8ddb-461a-bbee-02f9e1bf7b46" # ID for Azure CLI client
)
device_flow = azure_cli_client.initiate_device_flow(
scopes=["https://graph.microsoft.com/.default"]
scopes=["https://graph.microsoft.com/.default"]
)
print(device_flow["message"])
# Perform device code flow authentication
azure_cli_bearer_tokens_for_graph_api = azure_cli_client.acquire_token_by_device_flow(
device_flow
device_flow
)
pprint(azure_cli_bearer_tokens_for_graph_api)
@@ -125,83 +124,74 @@ pprint(azure_cli_bearer_tokens_for_graph_api)
# DECODE JWT
def decode_jwt(base64_blob: str) -> Dict[str, Any]:
"""Decodes base64 encoded JWT blob"""
return jwt.decode(
base64_blob, options={"verify_signature": False, "verify_aud": False}
)
"""Decodes base64 encoded JWT blob"""
return jwt.decode(
base64_blob, options={"verify_signature": False, "verify_aud": False}
)
decoded_access_token = decode_jwt(
azure_cli_bearer_tokens_for_graph_api.get("access_token")
azure_cli_bearer_tokens_for_graph_api.get("access_token")
)
pprint(decoded_access_token)
# GET NEW ACCESS TOKEN AND REFRESH TOKEN
new_azure_cli_bearer_tokens_for_graph_api = (
# Same client as original authorization
azure_cli_client.acquire_token_by_refresh_token(
azure_cli_bearer_tokens_for_graph_api.get("refresh_token"),
# Same scopes as original authorization
scopes=["https://graph.microsoft.com/.default"],
)
# Same client as original authorization
azure_cli_client.acquire_token_by_refresh_token(
azure_cli_bearer_tokens_for_graph_api.get("refresh_token"),
# Same scopes as original authorization
scopes=["https://graph.microsoft.com/.default"],
)
)
pprint(new_azure_cli_bearer_tokens_for_graph_api)
```
## Escalade de privilèges des jetons FOCI
## FOCI Tokens Privilege Escalation
Il a été mentionné précédemment que les jetons d'actualisation doivent être liés aux **portées** avec lesquelles ils ont été générés, à l'**application** et au **locataire** pour lesquels ils ont été générés. Si l'une de ces limites est franchie, il est possible d'escalader les privilèges car il sera possible de générer des jetons d'accès pour d'autres ressources et locataires auxquels l'utilisateur a accès et avec plus de portées que ce qui était initialement prévu.
Previously it was mentioned that refresh tokens should be tied to the **scopes** it was generated with, to the **application** and **tenant** it was generated to. If any of these boundaries is broken, it's possible to escalate privileges as it will be possible to generate access tokens to other resources and tenants the user has access to and with more scopes than it was originally intended.
De plus, **cela est possible avec tous les jetons d'actualisation** dans la [plateforme d'identité Microsoft](https://learn.microsoft.com/en-us/entra/identity-platform/) (comptes Microsoft Entra, comptes personnels Microsoft et comptes sociaux comme Facebook et Google) car comme le mentionnent les [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) : "Les jetons d'actualisation sont liés à une combinaison d'utilisateur et de client, mais **ne sont pas liés à une ressource ou à un locataire**. Un client peut utiliser un jeton d'actualisation pour acquérir des jetons d'accès **à travers n'importe quelle combinaison de ressource et de locataire** où il a la permission de le faire. Les jetons d'actualisation sont cryptés et seule la plateforme d'identité Microsoft peut les lire."
Moreover, **this is possible with all refresh tokens** in the [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (Microsoft Entra accounts, Microsoft personal accounts, and social accounts like Facebook and Google) because as the [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) mention: "Refresh tokens are bound to a combination of user and client, but **aren't tied to a resource or tenant**. A client can use a refresh token to acquire access tokens **across any combination of resource and tenant** where it has permission to do so. Refresh tokens are encrypted and only the Microsoft identity platform can read them."
De plus, notez que les applications FOCI sont des applications publiques, donc **aucun secret n'est nécessaire** pour s'authentifier auprès du serveur.
Moreover, note that the FOCI applications are public applications, so **no secret is needed** to authenticate to the server.
Ensuite, les clients FOCI connus rapportés dans la [**recherche originale**](https://github.com/secureworks/family-of-client-ids-research/tree/main) peuvent être [**trouvés ici**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv).
Then known FOCI clients reported in the [**original research**](https://github.com/secureworks/family-of-client-ids-research/tree/main) can be [**found here**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv).
### Get different scope
Following with the previous example code, in this code it's requested a new token for a different scope:
### Obtenir une portée différente
En suivant l'exemple de code précédent, dans ce code, un nouveau jeton est demandé pour une portée différente :
```python
# Code from https://github.com/secureworks/family-of-client-ids-research
azure_cli_bearer_tokens_for_outlook_api = (
# Same client as original authorization
azure_cli_client.acquire_token_by_refresh_token(
new_azure_cli_bearer_tokens_for_graph_api.get(
"refresh_token"
),
# But different scopes than original authorization
scopes=[
"https://outlook.office.com/.default"
],
)
# Same client as original authorization
azure_cli_client.acquire_token_by_refresh_token(
new_azure_cli_bearer_tokens_for_graph_api.get(
"refresh_token"
),
# But different scopes than original authorization
scopes=[
"https://outlook.office.com/.default"
],
)
)
pprint(azure_cli_bearer_tokens_for_outlook_api)
```
### Get different client and scopes
### Obtenir différents clients et portées
```python
# Code from https://github.com/secureworks/family-of-client-ids-research
microsoft_office_client = msal.PublicClientApplication("d3590ed6-52b3-4102-aeff-aad2292ab01c")
microsoft_office_bearer_tokens_for_graph_api = (
# This is a different client application than we used in the previous examples
microsoft_office_client.acquire_token_by_refresh_token(
# But we can use the refresh token issued to our original client application
azure_cli_bearer_tokens_for_outlook_api.get("refresh_token"),
# And request different scopes too
scopes=["https://graph.microsoft.com/.default"],
)
# This is a different client application than we used in the previous examples
microsoft_office_client.acquire_token_by_refresh_token(
# But we can use the refresh token issued to our original client application
azure_cli_bearer_tokens_for_outlook_api.get("refresh_token"),
# And request different scopes too
scopes=["https://graph.microsoft.com/.default"],
)
)
# How is this possible?
pprint(microsoft_office_bearer_tokens_for_graph_api)
```
## References
## Références
- [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research)
{{#include ../../../banners/hacktricks-training.md}}