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

This commit is contained in:
Translator
2025-02-09 17:53:43 +00:00
parent 967791bca9
commit 75aa9a1e16

View File

@@ -6,7 +6,7 @@
Azure Active Directory (Azure AD) dient als Microsofts cloudbasierter Dienst für Identitäts- und Zugriffsmanagement. Es ist entscheidend, um Mitarbeitern das Anmelden und den Zugriff auf Ressourcen sowohl innerhalb als auch außerhalb der Organisation zu ermöglichen, einschließlich Microsoft 365, dem Azure-Portal und einer Vielzahl anderer SaaS-Anwendungen. Das Design von Azure AD konzentriert sich darauf, wesentliche Identitätsdienste bereitzustellen, insbesondere **Authentifizierung, Autorisierung und Benutzerverwaltung**.
Zu den Hauptmerkmalen von Azure AD gehören **Multi-Faktor-Authentifizierung** und **bedingter Zugriff**, sowie nahtlose Integration mit anderen Microsoft-Sicherheitsdiensten. Diese Funktionen erhöhen erheblich die Sicherheit der Benutzeridentitäten und ermöglichen es Organisationen, ihre Zugriffsrichtlinien effektiv umzusetzen und durchzusetzen. Als grundlegender Bestandteil des Ökosystems der Cloud-Dienste von Microsoft ist Azure AD entscheidend für das cloudbasierte Management von Benutzeridentitäten.
Zu den Hauptfunktionen von Azure AD gehören **Multi-Faktor-Authentifizierung** und **bedingter Zugriff**, zusammen mit nahtloser Integration in andere Microsoft-Sicherheitsdienste. Diese Funktionen erhöhen erheblich die Sicherheit der Benutzeridentitäten und ermöglichen es Organisationen, ihre Zugriffsrichtlinien effektiv umzusetzen und durchzusetzen. Als grundlegender Bestandteil des Ökosystems der Cloud-Dienste von Microsoft ist Azure AD entscheidend für das cloudbasierte Management von Benutzeridentitäten.
## Aufzählung
@@ -184,11 +184,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
Wenn Sie sich über die **CLI** bei Azure mit einem Programm anmelden, verwenden Sie eine **Azure-Anwendung** aus einem **Mandanten**, der zu **Microsoft** gehört. Diese Anwendungen, wie die, die Sie in Ihrem Konto erstellen können, **haben eine Client-ID**. Sie **werden nicht alle sehen können** in den **erlaubten Anwendungslisten**, die Sie in der Konsole sehen können, **aber sie sind standardmäßig erlaubt**.
Wenn Sie sich über die **CLI** bei Azure mit einem Programm anmelden, verwenden Sie eine **Azure-Anwendung** aus einem **Mandanten**, der zu **Microsoft** gehört. Diese Anwendungen, wie die, die Sie in Ihrem Konto erstellen können, **haben eine Client-ID**. Sie **werden nicht alle von ihnen sehen können** in den **erlaubten Anwendungslisten**, die Sie in der Konsole sehen können, **aber sie sind standardmäßig erlaubt**.
Zum Beispiel verwendet ein **PowerShell-Skript**, das sich **authentifiziert**, eine App mit der Client-ID **`1950a258-227b-4e31-a9cf-717495945fc2`**. Auch wenn die App nicht in der Konsole angezeigt wird, könnte ein Sysadmin **diese Anwendung blockieren**, sodass Benutzer nicht über Tools, die sich über diese App verbinden, darauf zugreifen können.
Zum Beispiel verwendet ein **PowerShell-Skript**, das sich **authentifiziert**, eine App mit der Client-ID **`1950a258-227b-4e31-a9cf-717495945fc2`**. Selbst wenn die App nicht in der Konsole angezeigt wird, könnte ein Sysadmin **diese Anwendung blockieren**, sodass Benutzer nicht über Tools, die sich über diese App verbinden, darauf zugreifen können.
Es gibt jedoch **andere Client-IDs** von Anwendungen, die **es Ihnen ermöglichen, sich mit Azure zu verbinden**:
Es gibt jedoch **andere Client-IDs** von Anwendungen, die **es Ihnen ermöglichen werden, sich mit Azure zu verbinden**:
```bash
# The important part is the ClientId, which identifies the application to login inside Azure
@@ -365,7 +365,7 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
```
### MFA & Conditional Access Policies
Es wird dringend empfohlen, MFA für jeden Benutzer hinzuzufügen, jedoch werden einige Unternehmen es möglicherweise nicht einrichten oder es mit einem Conditional Access einrichten: Der Benutzer wird **MFA erforderlich sein, wenn** er sich von einem bestimmten Standort, Browser oder **einer Bedingung** anmeldet. Diese Richtlinien könnten, wenn sie nicht korrekt konfiguriert sind, anfällig für **bypasses** sein. Überprüfen Sie:
Es wird dringend empfohlen, MFA für jeden Benutzer hinzuzufügen. Einige Unternehmen werden es jedoch nicht einrichten oder möglicherweise mit einem Conditional Access: Der Benutzer wird **MFA erforderlich sein, wenn** er sich von einem bestimmten Standort, Browser oder **einer Bedingung** anmeldet. Diese Richtlinien können, wenn sie nicht korrekt konfiguriert sind, anfällig für **bypasses** sein. Überprüfen Sie:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -482,7 +482,7 @@ Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
#### Benutzer zur Gruppe hinzufügen
Die Eigentümer der Gruppe können neue Benutzer zur Gruppe hinzufügen.
Die Besitzer der Gruppe können neue Benutzer zur Gruppe hinzufügen.
```bash
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
@@ -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
# Berechtigungen über eine Ressource direkt mit ARM abrufen
$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 Rollen
### Entra ID Roles
Für weitere Informationen zu Azure-Rollen siehe:
For more information about Azure roles check:
{{#ref}}
../az-basic-information/
@@ -907,125 +920,134 @@ Für weitere Informationen zu Azure-Rollen siehe:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List template Entra ID roles
# Liste der Entra ID-Rollen-Vorlagen
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoleTemplates"
# List enabled built-in Entra ID roles
# Liste der aktivierten integrierten Entra ID-Rollen
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"
# List all Entra ID roles with their permissions (including custom roles)
# Liste aller Entra ID-Rollen mit ihren Berechtigungen (einschließlich benutzerdefinierter Rollen)
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions"
# List only custom Entra ID roles
# Liste nur benutzerdefinierter Entra ID-Rollen
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
# Liste aller zugewiesenen Entra ID-Rollen
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"
# List members of a Entra ID roles
# Liste der Mitglieder einer Entra ID-Rolle
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/<role-id>/members"
# List Entra ID roles assigned to a user
# Liste der Entra ID-Rollen, die einem Benutzer zugewiesen sind
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
# Liste der Entra ID-Rollen, die einer Gruppe zugewiesen sind
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
# Liste der Entra ID-Rollen, die einem Dienstprinzipal zugewiesen sind
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
# Alle verfügbaren Rollenvorlagen abrufen
Get-AzureADDirectoryroleTemplate
# Get enabled roles (Assigned roles)
# Aktivierte Rollen (Zugewiesene Rollen)
Get-AzureADDirectoryRole
Get-AzureADDirectoryRole -ObjectId <roleID> #Get info about the role
# Get custom roles - use AzureAdPreview
Get-AzureADDirectoryRole -ObjectId <roleID> # Informationen über die Rolle abrufen
# Benutzerdefinierte Rollen - verwenden Sie AzureAdPreview
Get-AzureADMSRoleDefinition | ?{$_.IsBuiltin -eq $False} | select DisplayName
# Users assigned a role (Global Administrator)
# Benutzer, die einer Rolle zugewiesen sind (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)
# Rollen der Administrativen Einheit (wer Berechtigungen über die administrative Einheit und ihre Mitglieder hat)
Get-AzureADMSScopedRoleMembership -Id <id> | fl *
```
{{#endtab }}
{{#endtabs }}
### Geräte
### Devices
{{#tabs }}
{{#tab name="az cli" }}
```bash
# If you know how to do this send a PR!
# Wenn du weißt, wie man das macht, sende einen PR!
```
{{#endtab }}
{{#tab name="MS Graph" }}
```bash
# Enumerate devices using Microsoft Graph PowerShell
# Geräte mit Microsoft Graph PowerShell auflisten
Get-MgDevice -All
# Get device details
# Gerätedetails abrufen
Get-MgDevice -DeviceId <DeviceId> | Format-List *
# Get devices managed using Intune
# Geräte abrufen, die mit Intune verwaltet werden
Get-MgDevice -Filter "isCompliant eq true" -All
# Get devices owned by a user
# Geräte abrufen, die einem Benutzer gehören
Get-MgUserOwnedDevice -UserId test@corp.onmicrosoft.com
# List available commands in Microsoft Graph PowerShell
# Verfügbare Befehle in Microsoft Graph PowerShell auflisten
Get-Command -Module Microsoft.Graph.Identity.DirectoryManagement
```
{{#endtab }}
{{#tab name="Azure AD" }}
```bash
# Enumerate Devices
# Geräte auflisten
Get-AzureADDevice -All $true | fl *
# List all the active devices (and not the stale devices)
# Liste aller aktiven Geräte (und nicht der veralteten Geräte)
Get-AzureADDevice -All $true | ?{$_.ApproximateLastLogonTimeStamp -ne $null}
# Get owners of all devices
# Besitzer aller Geräte abrufen
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
# Registrierte Benutzer aller Geräte
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredUser
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredUser -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Get dives managed using Intune
# Geräte abrufen, die mit Intune verwaltet werden
Get-AzureADDevice -All $true | ?{$_.IsCompliant -eq "True"}
# Get devices owned by a user
# Geräte abrufen, die einem Benutzer gehören
Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Get Administrative Units of a device
# Administrative Einheiten eines Geräts abrufen
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -ObjectId $_.ObjectId | where {$_.ObjectId -eq $deviceObjId} }
```
{{#endtab }}
{{#endtabs }}
> [!WARNING]
> Wenn ein Gerät (VM) **AzureAD verbunden** ist, können Benutzer von AzureAD sich **einloggen**.\
> Darüber hinaus, wenn der angemeldete Benutzer **Besitzer** des Geräts ist, wird er **lokaler Administrator** sein.
> 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 Einheiten
### Administrative Units
Für weitere Informationen über administrative Einheiten siehe:
For more information about administrative units check:
{{#ref}}
../az-basic-information/
@@ -1033,72 +1055,76 @@ Für weitere Informationen über administrative Einheiten siehe:
{{#tabs }}
{{#tab name="az cli" }}
```bash
# List all administrative units
# Liste aller administrativen Einheiten
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits"
# Get AU info
# Informationen zur AU abrufen
az rest --method GET --uri "https://graph.microsoft.com/v1.0/directory/administrativeUnits/a76fd255-3e5e-405b-811b-da85c715ff53"
# Get members
# Mitglieder abrufen
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
# Prinzipale mit Rollen über der AU abrufen
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
# Administrativen Einheiten abrufen
Get-AzureADMSAdministrativeUnit
Get-AzureADMSAdministrativeUnit -Id <id>
# Get ID of admin unit by string
# ID der administrativen Einheit durch Zeichenfolge abrufen
$adminUnitObj = Get-AzureADMSAdministrativeUnit -Filter "displayname eq 'Test administrative unit 2'"
# List the users, groups, and devices affected by the administrative unit
# Die Benutzer, Gruppen und Geräte auflisten, die von der administrativen Einheit betroffen sind
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
# Die Rollen abrufen, die Benutzer über die Mitglieder der AU haben
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Rollen-ID und Rollenmitglieder abrufen
```
{{#endtab }}
{{#endtabs }}
## Entra ID Privilegieneskalation
## Entra ID Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/
{{#endref}}
## Azure Privilegieneskalation
## Azure Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-authorization-privesc.md
{{#endref}}
## Verteidigungsmechanismen
## Defensive Mechanisms
### Privileged Identity Management (PIM)
Privileged Identity Management (PIM) in Azure hilft, **übermäßige Berechtigungen** zu verhindern, die unnötig Benutzern zugewiesen werden.
Privileged Identity Management (PIM) in Azure helps to **prevent excessive privileges** to being assigned to users unnecessarily.
Eine der Hauptfunktionen von PIM ist, dass es ermöglicht, Rollen nicht ständig aktiven Benutzern zuzuweisen, sondern sie **für einen bestimmten Zeitraum (z.B. 6 Monate)** bereitzustellen. Dann, wann immer der Benutzer diese Rolle aktivieren möchte, muss er sie anfordern und die Zeit angeben, für die er die Berechtigung benötigt (z.B. 3 Stunden). Dann muss ein **Admin die Anfrage genehmigen**.\
Beachten Sie, dass der Benutzer auch die Möglichkeit hat, die Zeit zu **verlängern**.
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.
Darüber hinaus **sendet PIM E-Mails**, wann immer eine privilegierte Rolle jemandem zugewiesen wird.
Moreover, **PIM send emails** whenever a privileged role is being assigned to someone.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
Wenn PIM aktiviert ist, ist es möglich, jede Rolle mit bestimmten Anforderungen zu konfigurieren, wie:
When PIM is enabled it's possible to configure each role with certain requirements like:
- Maximale Dauer (Stunden) der Aktivierung
- MFA bei Aktivierung erforderlich
- Erfordert den Kontext der bedingten Zugriffsauthentifizierung
- Erfordert eine Begründung bei Aktivierung
- Erfordert Ticketinformationen bei Aktivierung
- Genehmigung zur Aktivierung erforderlich
- Maximale Zeit bis zum Ablauf der berechtigten Zuweisungen
- Viele weitere Konfigurationen, wann und an wen Benachrichtigungen gesendet werden, wenn bestimmte Aktionen mit dieser Rolle stattfinden
- 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
### Bedingte Zugriffsrichtlinien
### Conditional Access Policies
Überprüfen Sie:
Check:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -1106,27 +1132,27 @@ Wenn PIM aktiviert ist, ist es möglich, jede Rolle mit bestimmten Anforderungen
### Entra Identity Protection
Entra Identity Protection ist ein Sicherheitsdienst, der es ermöglicht, **zu erkennen, wann ein Benutzer oder eine Anmeldung zu riskant** ist, um akzeptiert zu werden, und es ermöglicht, den Benutzer oder den Anmeldeversuch zu **blockieren**.
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.
Es ermöglicht dem Admin, es so zu konfigurieren, dass es Versuche blockiert, wenn das Risiko "Niedrig und darüber", "Mittel und darüber" oder "Hoch" ist. Obwohl es standardmäßig vollständig **deaktiviert** ist:
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]
> Heutzutage wird empfohlen, diese Einschränkungen über bedingte Zugriffsrichtlinien hinzuzufügen, wo es möglich ist, die gleichen Optionen zu konfigurieren.
> Nowadays it's recommended to add these restrictions via Conditional Access policies where it's possible to configure the same options.
### Entra Passwortschutz
### Entra Password Protection
Entra Passwortschutz ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) ist eine Sicherheitsfunktion, die **hilft, den Missbrauch schwacher Passwörter zu verhindern, indem Konten gesperrt werden, wenn mehrere erfolglose Anmeldeversuche auftreten**.\
Es ermöglicht auch, eine **benutzerdefinierte Passwortliste zu sperren**, die Sie bereitstellen müssen.
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.
Es kann **sowohl** auf Cloud-Ebene als auch im lokalen Active Directory angewendet werden.
It can be **applied both** at the cloud level and on-premises Active Directory.
Der Standardmodus ist **Audit**:
The default mode is **Audit**:
<figure><img src="../../../images/image (355).png" alt=""><figcaption></figcaption></figure>
## Referenzen
## 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)