Translated ['src/pentesting-cloud/azure-security/az-services/az-azuread.

This commit is contained in:
Translator
2025-02-09 17:53:59 +00:00
parent f549cc09a8
commit 6c7658a707

View File

@@ -6,7 +6,7 @@
Azure Active Directory (Azure AD) є хмарним сервісом Microsoft для управління ідентичністю та доступом. Він є важливим для того, щоб співробітники могли входити в систему та отримувати доступ до ресурсів як всередині, так і за межами організації, включаючи Microsoft 365, портал Azure та безліч інших SaaS-додатків. Дизайн Azure AD зосереджений на наданні основних ідентифікаційних послуг, зокрема **автентифікації, авторизації та управління користувачами**.
Ключові функції Azure AD включають **багатофакторну автентифікацію** та **умовний доступ**, а також безшовну інтеграцію з іншими службами безпеки Microsoft. Ці функції значно підвищують безпеку ідентичностей користувачів і надають організаціям можливість ефективно впроваджувати та забезпечувати свої політики доступу. Як основний компонент екосистеми хмарних сервісів Microsoft, Azure AD є ключовим для управління ідентичностями користувачів у хмарі.
Ключові функції Azure AD включають **багатофакторну автентифікацію** та **умовний доступ**, а також безшовну інтеграцію з іншими службами безпеки Microsoft. Ці функції значно підвищують безпеку ідентичностей користувачів і надають організаціям можливість ефективно впроваджувати та забезпечувати виконання своїх політик доступу. Як основний компонент екосистеми хмарних сервісів Microsoft, Azure AD є ключовим для управління ідентичностями користувачів у хмарі.
## Перерахування
@@ -184,7 +184,7 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
Коли ви **входите** через **CLI** в Azure з будь-якою програмою, ви використовуєте **Azure Application** з **тенанту**, що належить **Microsoft**. Ці програми, як ті, що ви можете створити у своєму обліковому записі, **мають ідентифікатор клієнта**. Ви **не зможете побачити всі з них** у **списках дозволених програм**, які ви можете побачити в консолі, **але вони дозволені за замовчуванням**.
Коли ви **входите** через **CLI** в Azure з будь-якою програмою, ви використовуєте **Azure Application** з **оренди**, яка належить **Microsoft**. Ці програми, як ті, що ви можете створити у своєму обліковому записі, **мають ідентифікатор клієнта**. Ви **не зможете побачити всі з них** у **списках дозволених програм**, які ви можете бачити в консолі, **але вони дозволені за замовчуванням**.
Наприклад, **скрипт powershell**, який **автентифікує**, використовує додаток з ідентифікатором клієнта **`1950a258-227b-4e31-a9cf-717495945fc2`**. Навіть якщо додаток не з'являється в консолі, системний адміністратор може **заблокувати цей додаток**, щоб користувачі не могли отримати доступ, використовуючи інструменти, які підключаються через цей додаток.
@@ -213,7 +213,7 @@ $token = Invoke-Authorize -Credential $credential `
-Verbose -Debug `
-InformationAction Continue
```
### Тенанти
### Орендарі
{{#tabs }}
{{#tab name="az cli" }}
@@ -226,7 +226,7 @@ az account tenant list
### Користувачі
Для отримання додаткової інформації про користувачів Entra ID дивіться:
Для отримання додаткової інформації про користувачів Entra ID перегляньте:
{{#ref}}
../az-basic-information/
@@ -365,7 +365,7 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
```
### MFA & Conditional Access Policies
Рекомендується додати MFA для кожного користувача, однак деякі компанії можуть не налаштовувати його або можуть налаштувати його з умовним доступом: Користувач буде **зобов'язаний використовувати MFA, якщо** він входить з певного місця, браузера або **якоїсь умови**. Ці політики, якщо не налаштовані правильно, можуть бути схильні до **обхідних** атак. Перевірте:
Рекомендується додати MFA для кожного користувача, однак деякі компанії можуть не налаштовувати його або можуть налаштувати його з умовним доступом: Користувач буде **зобов'язаний використовувати MFA, якщо** він входить з певного місця, браузера або **якоїсь умови**. Ці політики, якщо не налаштовані правильно, можуть бути схильні до **обхідних шляхів**. Перевірте:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -597,11 +597,11 @@ Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembersh
{{#endtabs }}
> [!WARNING]
> Власник служби Principal може змінити його пароль.
> Власник Service Principal може змінити його пароль.
<details>
<summary>Список і спроба додати секрет клієнта до кожного корпоративного додатку</summary>
<summary>Список та спроба додати секрет клієнта до кожного корпоративного додатку</summary>
```bash
# Just call Add-AzADAppSecret
Function Add-AzADAppSecret
@@ -793,7 +793,7 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
> Отже, якщо ви знайдете цей **пароль**, ви зможете отримати доступ як **сервісний принципал** **всередині** **орендаря**.\
> Зверніть увагу, що цей пароль видимий лише під час генерації (ви можете змінити його, але не зможете отримати його знову).\
> **Власник** **додатка** може **додати пароль** до нього (щоб він міг видавати себе за нього).\
> Вхідні дані таких сервісних принципалів **не позначаються як ризиковані** і **не матимуть MFA.**
> Вхідні дані таких сервісних принципалів **не позначаються як ризикові** і **не матимуть MFA.**
Можливо знайти список загальновживаних ID додатків, що належать Microsoft, за адресою [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications)
@@ -840,11 +840,15 @@ az role definition list --resource-group <resource_group>
# Get only roles assigned to the indicated scope
az role definition list --scope <scope>
# Get all the principals a role is assigned to
az role assignment list --all --query "[].{principalName:principalName,principalType:principalType,resourceGroup:resourceGroup,roleDefinitionName:roleDefinitionName}[?roleDefinitionName=='<ROLE_NAME>']"
az role assignment list --all --query "[].{principalName:principalName,principalType:principalType,scope:scope,roleDefinitionName:roleDefinitionName}[?roleDefinitionName=='<ROLE_NAME>']"
# Get all the roles assigned to a user
az role assignment list --assignee "<email>" --all --output table
# Get all the roles assigned to a user by filtering
az role assignment list --all --query "[?principalName=='admin@organizationadmin.onmicrosoft.com']" --output table
# Get deny assignments
az rest --method GET --uri "https://management.azure.com/{scope}/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01"
## Example scope of subscription
az rest --method GET --uri "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/providers/Microsoft.Authorization/denyAssignments?api-version=2022-04-01"
```
{{#endtab }}
@@ -877,12 +881,20 @@ Get-AzRoleDefinition -Name "Virtual Machine Command Executor"
# Get roles of a user or resource
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com
Get-AzRoleAssignment -Scope /subscriptions/<subscription-id>/resourceGroups/<res_group_name>/providers/Microsoft.Compute/virtualMachines/<vm_name>
# Get deny assignments
Get-AzDenyAssignment # Get from current subscription
Get-AzDenyAssignment -Scope '/subscriptions/96231a05-34ce-4eb4-aa6a-70759cbb5e83/resourcegroups/testRG/providers/Microsoft.Web/sites/site1'
```
{{#endtab }}
{{#endtabs }}
```
{{#endtab }}
{{#tab name="Raw" }}
```bash
# Get permissions over a resource using ARM directly
# Отримати дозволи на ресурс, використовуючи ARM безпосередньо
$Token = (Get-AzAccessToken).Token
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/Research/providers/Microsoft.Compute/virtualMachines/infradminsrv/providers/Microsoft.Authorization/permissions?api-version=2015-07-01'
$RequestParams = @{
@@ -894,12 +906,13 @@ Headers = @{
}
(Invoke-RestMethod @RequestParams).value
```
{{#endtab }}
{{#endtabs }}
### Ролі Entra ID
### Entra ID Roles
Для отримання додаткової інформації про ролі Azure перегляньте:
For more information about Azure roles check:
{{#ref}}
../az-basic-information/
@@ -907,125 +920,134 @@ Headers = @{
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List template Entra ID roles
# Список шаблонів ролей Entra ID
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoleTemplates"
# List enabled built-in Entra ID roles
# Список увімкнених вбудованих ролей Entra ID
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"
# List all Entra ID roles with their permissions (including custom roles)
# Список всіх ролей Entra ID з їхніми дозволами (включаючи користувацькі ролі)
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"
# List only custom Entra ID roles
# Список лише користувацьких ролей Entra ID
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'
# List all assigned Entra ID roles
# Список всіх призначених ролей Entra ID
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"
# List members of a Entra ID roles
# Список учасників ролі Entra ID
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members"
# List Entra ID roles assigned to a user
# Список ролей Entra ID, призначених користувачу
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/users/<user-id>/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a group
# Список ролей Entra ID, призначених групі
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/groups/$GROUP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
# List Entra ID roles assigned to a service principal
# Список ролей Entra ID, призначених службовому принципалу
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/memberOf/microsoft.graph.directoryRole" \
--query "value[]" \
--output json
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Get all available role templates
# Отримати всі доступні шаблони ролей
Get-AzureADDirectoryroleTemplate
# Get enabled roles (Assigned roles)
# Отримати активовані ролі (Призначені ролі)
Get-AzureADDirectoryRole
Get-AzureADDirectoryRole -ObjectId <roleID> #Get info about the role
# Get custom roles - use AzureAdPreview
Get-AzureADDirectoryRole -ObjectId <roleID> #Отримати інформацію про роль
# Отримати користувацькі ролі - використовуйте AzureAdPreview
Get-AzureADMSRoleDefinition | ?{$_.IsBuiltin -eq $False} | select DisplayName
# Users assigned a role (Global Administrator)
# Користувачі, призначені ролі (Глобальний адміністратор)
Get-AzureADDirectoryRole -Filter "DisplayName eq 'Global Administrator'" | Get-AzureADDirectoryRoleMember
Get-AzureADDirectoryRole -ObjectId <id> | fl
# Roles of the Administrative Unit (who has permissions over the administrative unit and its members)
# Ролі адміністративної одиниці (хто має права над адміністративною одиницею та її членами)
Get-AzureADMSScopedRoleMembership -Id <id> | fl *
```
{{#endtab }}
{{#endtabs }}
### Пристрої
### Devices
{{#tabs }}
{{#tab name="az cli" }}
```bash
# If you know how to do this send a PR!
# Якщо ви знаєте, як це зробити, надішліть PR!
```
{{#endtab }}
{{#tab name="MS Graph" }}
```bash
# Enumerate devices using Microsoft Graph PowerShell
# Перерахувати пристрої за допомогою Microsoft Graph PowerShell
Get-MgDevice -All
# Get device details
# Отримати деталі пристрою
Get-MgDevice -DeviceId <DeviceId> | Format-List *
# Get devices managed using Intune
# Отримати пристрої, керовані за допомогою Intune
Get-MgDevice -Filter "isCompliant eq true" -All
# Get devices owned by a user
# Отримати пристрої, що належать користувачу
Get-MgUserOwnedDevice -UserId test@corp.onmicrosoft.com
# List available commands in Microsoft Graph PowerShell
# Перелічити доступні команди в Microsoft Graph PowerShell
Get-Command -Module Microsoft.Graph.Identity.DirectoryManagement
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Enumerate Devices
# Перерахувати пристрої
Get-AzureADDevice -All $true | fl *
# List all the active devices (and not the stale devices)
# Список всіх активних пристроїв (а не застарілих)
Get-AzureADDevice -All $true | ?{$_.ApproximateLastLogonTimeStamp -ne $null}
# Get owners of all devices
# Отримати власників всіх пристроїв
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredOwner
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredOwner -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Registred users of all the devices
# Зареєстровані користувачі всіх пристроїв
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredUser
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredUser -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Get dives managed using Intune
# Отримати пристрої, керовані за допомогою Intune
Get-AzureADDevice -All $true | ?{$_.IsCompliant -eq "True"}
# Get devices owned by a user
# Отримати пристрої, що належать користувачу
Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Get Administrative Units of a device
# Отримати адміністративні одиниці пристрою
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -ObjectId $_.ObjectId | where {$_.ObjectId -eq $deviceObjId} }
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
> Якщо пристрій (VM) є **приєднаним до AzureAD**, користувачі з AzureAD зможуть **увійти в систему**.\
> Більше того, якщо увійшовший користувач є **власником** пристрою, він буде **локальним адміністратором**.
> If a device (VM) is **AzureAD joined**, users from AzureAD are going to be **able to login**.\
> Moreover, if the logged user is **Owner** of the device, he is going to be **local admin**.
### Адміністративні одиниці
### Administrative Units
Для отримання додаткової інформації про адміністративні одиниці перегляньте:
For more information about administrative units check:
{{#ref}}
../az-basic-information/
@@ -1033,100 +1055,104 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List all administrative units
# Список всіх адміністративних одиниць
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits"
# Get AU info
# Отримати інформацію про AU
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53"
# Get members
# Отримати учасників
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/members"
# Get principals with roles over the AU
# Отримати принципи з ролями над AU
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53/scopedRoleMembers"
```
{{#endtab }}
{{#tab name="AzureAD" }}
```bash
# Get Administrative Units
# Отримати адміністративні одиниці
Get-AzureADMSAdministrativeUnit
Get-AzureADMSAdministrativeUnit -Id <id>
# Get ID of admin unit by string
# Отримати ID адміністративної одиниці за рядком
$adminUnitObj = Get-AzureADMSAdministrativeUnit -Filter "displayname eq 'Test administrative unit 2'"
# List the users, groups, and devices affected by the administrative unit
# Перелічити користувачів, групи та пристрої, які підпадають під адміністративну одиницю
Get-AzureADMSAdministrativeUnitMember -Id <id>
# Get the roles users have over the members of the AU
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
# Отримати ролі, які мають користувачі над членами AU
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Отримати ID ролі та членів ролі
```
{{#endtab }}
{{#endtabs }}
## Підвищення привілеїв Entra ID
## Entra ID Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/
{{#endref}}
## Підвищення привілеїв Azure
## Azure Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-authorization-privesc.md
{{#endref}}
## Захисні механізми
## Defensive Mechanisms
### Управління привілейованими ідентичностями (PIM)
### Privileged Identity Management (PIM)
Управління привілейованими ідентичностями (PIM) в Azure допомагає **запобігти надмірним привілеям**, які без потреби надаються користувачам.
Privileged Identity Management (PIM) in Azure helps to **prevent excessive privileges** to being assigned to users unnecessarily.
Однією з основних функцій, які надає PIM, є те, що він дозволяє не призначати ролі принципалам, які постійно активні, а робити їх **придатними на певний період часу (наприклад, 6 місяців)**. Тоді, коли користувач хоче активувати цю роль, він повинен запитати її, вказуючи час, на який йому потрібен привілей (наприклад, 3 години). Потім **адміністратор повинен затвердити** запит.\
Зверніть увагу, що користувач також зможе попросити **продовжити** час.
One of the main features provided by PIM is that It allows to not assign roles to principals that are constantly active, but make them **eligible for a period of time (e.g. 6months)**. Then, whenever the user wants to activate that role, he needs to ask for it indicating the time he needs the privilege (e.g. 3 hours). Then an **admin needs to approve** the request.\
Note that the user will also be able to ask to **extend** the time.
Більше того, **PIM надсилає електронні листи** щоразу, коли привілейована роль призначається комусь.
Moreover, **PIM send emails** whenever a privileged role is being assigned to someone.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
Коли PIM увімкнено, можна налаштувати кожну роль з певними вимогами, такими як:
When PIM is enabled it's possible to configure each role with certain requirements like:
- Максимальна тривалість (години) активації
- Вимагати MFA при активації
- Вимагати контекст аутентифікації умовного доступу
- Вимагати обґрунтування при активації
- Вимагати інформацію про квиток при активації
- Вимагати затвердження для активації
- Максимальний час для закінчення дії придатних призначень
- Багато інших налаштувань щодо того, коли і кому надсилати сповіщення, коли певні дії відбуваються з цією роллю
- Maximum duration (hours) of activation
- Require MFA on activation
- Require Conditional Access acuthenticaiton context
- Require justification on activation
- Require ticket information on activation
- Require approval to activate
- Max time to expire the elegible assignments
- A lot more configuration on when and who to send notifications when certain actions happen with that role
### Політики умовного доступу
### Conditional Access Policies
Перевірте:
Check:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Захист ідентичності Entra
### Entra Identity Protection
Захист ідентичності Entra - це сервіс безпеки, який дозволяє **виявляти, коли користувач або вхід занадто ризикований** для прийняття, дозволяючи **блокувати** користувача або спробу входу.
Entra Identity Protection is a security service that allows to **detect when a user or a sign-in is too risky** to be accepted, allowing to **block** the user or the sig-in attempt.
Це дозволяє адміністратору налаштувати його для **блокування** спроб, коли ризик "Низький і вище", "Середній і вище" або "Високий". Хоча за замовчуванням він повністю **вимкнений**:
It allows the admin to configure it to **block** attempts when the risk is "Low and above", "Medium and above" or "High". Although, by default it's completely **disabled**:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> Сьогодні рекомендується додавати ці обмеження через політики умовного доступу, де можна налаштувати ті ж самі опції.
> Nowadays it's recommended to add these restrictions via Conditional Access policies where it's possible to configure the same options.
### Захист паролів Entra
### Entra Password Protection
Захист паролів Entra ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) - це функція безпеки, яка **допомагає запобігти зловживанню слабкими паролями, блокуючи облікові записи, коли відбувається кілька невдалих спроб входу**.\
Вона також дозволяє **заборонити користувацький список паролів**, який потрібно надати.
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) is a security feature that **helps prevent the abuse of weak passwords in by locking out accounts when several unsuccessful login attempts happen**.\
It also allows to **ban a custom password list** that you need to provide.
Вона може бути **застосована як** на рівні хмари, так і в локальному Active Directory.
It can be **applied both** at the cloud level and on-premises Active Directory.
Режим за замовчуванням - **Аудит**:
The default mode is **Audit**:
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
## Посилання
## References
- [https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units](https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units)