Een Azure-service-principal maken met Azure PowerShell

Geautomatiseerde hulpprogramma's die gebruikmaken van Azure-services moeten altijd beperkte machtigingen krijgen. In plaats van dat toepassingen zich moeten aanmelden als volledig bevoegde gebruikers, biedt Azure service-principals.

Een Azure-service-principal is een identiteit die is gemaakt om toepassingen, gehoste services en geautomatiseerde hulpprogramma's toegang te geven tot Azure-resources. Deze toegang wordt beperkt door de rol die wordt toegewezen aan de service-principal, zodat u kunt bepalen welke resources kunnen worden geopend en op welk niveau. Uit veiligheidsoverwegingen is het altijd aanbevolen om voor geautomatiseerde tools service-principals te gebruiken, in plaats van deze zich te laten aanmelden met een gebruikers-id.

In dit artikel leest u hoe u service-principals kunt maken en opnieuw kunt instellen en hoe u hier meer informatie over kunt vinden.

Waarschuwing

Wanneer u een service-principal maakt met de opdracht New-AzADServicePrincipal, bevat de uitvoer de referenties die u moet beschermen. Als alternatief kunt u overwegen beheerde identiteiten te gebruiken om te voorkomen dat u referenties moet gebruiken.

Een service-principal maken

Maak een service-principal met de cmdlet New-AzADServicePrincipal. Wanneer u een service-principal maakt, kiest u het type verificatie dat voor aanmelding wordt gebruikt.

Belangrijk

Vanaf Az PowerShell-module versie 7.x wijst New-AzADServicePrincipal de rol Inzender standaard niet meer toe aan de service-principal. Zie Stappen voor het toevoegen van een roltoewijzing als u een specifieke rol wilt toewijzen aan een service-principal.

Notitie

Als uw account niet over de rechten beschikt om een service-principal te maken, zorgt New-AzADServicePrincipal voor de volgende foutmelding: 'U hebt onvoldoende bevoegdheden om de bewerking te voltooien.' Neem contact op met uw Azure Active Directory-beheerder om een service-principal te maken.

Er zijn twee typen verificatie beschikbaar voor service-principals: verificatie op basis van een wachtwoord en verificatie op basis van een certificaat.

Verificatie op basis van een wachtwoord

Belangrijk

De standaardrol voor een service-principal met verificatie op basis van een wachtwoord is Inzender. Deze rol heeft alle machtigingen om in een Azure-account te lezen en te schrijven. Zie voor informatie over het beheren van roltoewijzingen Rollen voor service-principal beheren.

Zonder verdere verificatieparameters wordt verificatie op basis van een wachtwoord gebruikt en wordt er een willekeurig wachtwoord voor u gemaakt. Als u verificatie op basis van een wachtwoord wilt gebruiken, wordt deze methode aanbevolen.

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

Het geretourneerde object bevat de PasswordCredentials.SecretText eigenschap met het gegenereerde wachtwoord. Zorg ervoor dat u deze waarde ergens op een beveiligde plek opslaat om te verifiëren met de service-principal. De waarde wordt niet weergegeven in de console-uitvoer. Als u het wachtwoord kwijtraakt, kunt u de referenties voor de service-principal opnieuw instellen.

Met de volgende code kunt u het geheim exporteren:

$sp.PasswordCredentials.SecretText

Het object dat wordt geretourneerd door New-AzADServicePrincipal, bevat de leden Id en DisplayName, die allebei kunnen worden gebruikt voor aanmelding met de service-principal.

Belangrijk

Bij aanmelden met een service-principal is de tenant-id vereist waaronder de service-principal is gemaakt. Voer onmiddellijk na het maken van de service-principal de volgende opdracht uit om de actieve tenant op te halen waaronder de service-principal is gemaakt:

(Get-AzContext).Tenant.Id

Verificatie op basis van certificaat

Belangrijk

Er is geen standaardrol toegewezen bij het maken van een service-principal met verificatie op basis van certificaten. Zie voor informatie over het beheren van roltoewijzingen Rollen voor service-principal beheren.

U kunt service-principals maken die gebruikmaken van verificatie op basis van een certificaat, met de parameter CertValue. Deze parameter gebruikt een ASCII-tekenreeks met Base64-codering van het openbare certificaat. Deze is opgeslagen als een PEM-bestand of een tekstgecodeerd CRT- of CER-bestand. Binaire coderingen van het openbare certificaat worden niet ondersteund. Voor deze instructies wordt ervan uitgegaan dat u al over een certificaat beschikt.

$cert = <public certificate as base64-encoded string>
$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName -CertValue $cert

Het object dat wordt geretourneerd uit New-AzADServicePrincipal bevat de Id en DisplayName eigenschappen, die kunnen worden gebruikt voor aanmelding met de service-principal. Clients die zich met de service-principal aanmelden, moeten ook toegang hebben tot de persoonlijke sleutel van het certificaat.

Belangrijk

Bij aanmelden met een service-principal is de tenant-id vereist waaronder de service-principal is gemaakt. Voer onmiddellijk na het maken van de service-principal de volgende opdracht uit om de actieve tenant op te halen waaronder de service-principal is gemaakt:

(Get-AzContext).Tenant.Id

Een bestaande service-principal ophalen

U kunt een lijst met service-principals ophalen voor de actieve tenant met de opdracht Get-AzADServicePrincipal. Deze opdracht retourneert standaard alle service-principals in een tenant. Bij grote organisaties kan het lang duren om resultaten te retourneren. In dergelijke gevallen raden we aan een van de optionele argumenten te gebruiken om al aan de serverzijde te filteren:

  • Met DisplayNameBeginsWith vraagt u service-principals op waarvan het voorvoegsel overeenkomt met de opgegeven waarde. De weergavenaam van een service-principal is de waarde die tijdens het aanmaken is ingesteld met DisplayName.
  • Met DisplayName vraagt u resultaten op die exact overeenkomen met de opgegeven service-principal-naam.

Service-principalrollen beheren

Azure PowerShell beschikt over de volgende cmdlets voor het beheren van roltoewijzingen:

Zie voor meer informatie over rollen en op rollen gebaseerd toegangsbeheer (RBAC) RBAC: Ingebouwde rollen.

In het volgende voorbeeld wordt de rol Lezer toegevoegd en wordt de rol Inzender verwijderd:

New-AzRoleAssignment -ApplicationId <service principal application ID> -RoleDefinitionName 'Reader'
Remove-AzRoleAssignment -ObjectId <service principal object ID> -RoleDefinitionName 'Contributor'

Belangrijk

Cmdlets voor roltoewijzing werken niet met het object-id van de service-principal. In plaats daarvan gebruiken ze de bijbehorende toepassings-id, die wordt gegenereerd tijdens het maken van de service-principal. U kunt de toepassings-id voor een service-principal ophalen met Get-AzADServicePrincipal.

Notitie

Als uw account niet beschikt over machtigingen om een rol toe te wijzen, wordt er een foutmelding weergegeven. Hierin staat dat uw account niet voldoende machtigingen heeft om de actie 'Microsoft.Authorization/roleAssignments/write' uit te voeren. Neem contact op met uw Azure Active Directory-beheerder om rollen te beheren.

Als u een rol toevoegt, worden eerder toegewezen machtigingen niet beperkt. Wanneer de machtigingen van een service-principal worden beperkt, moet de rol Inzender worden verwijderd.

De wijzigingen kunnen worden geverifieerd door de toegewezen rollen in een lijst weer te geven:

Get-AzRoleAssignment -ServicePrincipalName ServicePrincipalName

Aanmelden met een service-principal

Test de referenties van de nieuwe service-principal en de machtigingen door u met deze referenties aan te melden. Om u aan te melden met een service-principal, hebt u de waarde voor applicationId nodig die eraan is gekoppeld en de tenant waaronder de service-principal is gemaakt.

Als u zich wilt aanmelden met de service-principal met behulp van een wachtwoord, gebruikt u:

# Use the application ID as the username, and the secret as password
$credentials = Get-Credential
Connect-AzAccount -ServicePrincipal -Credential $credentials -Tenant <tenant ID>

Voor verificatie op basis van een certificaat is het nodig dat Azure PowerShell informatie kan ophalen uit een lokaal certificaatarchief, op basis van de vingerafdruk van een certificaat.

Connect-AzAccount -ServicePrincipal -Tenant <TenantId> -CertificateThumbprint <Thumbprint> -ApplicationId <ApplicationId>

Voor instructies over het importeren van een certificaat in een referentie-archief dat toegankelijk is voor PowerShell, raadpleegt u het artikel Aanmelden met Azure PowerShell

Referenties opnieuw instellen

Als u de referenties voor een service-principal bent vergeten, gebruikt u New-AzADSpCredential om nieuwe referenties toe te voegen met een willekeurig wachtwoord. Deze cmdlet biedt geen ondersteuning voor door de gebruiker gedefinieerde referenties wanneer het wachtwoord opnieuw wordt ingesteld.

Belangrijk

Voordat u nieuwe referenties toewijst, kunt u het beste bestaande referenties verwijderen, om te voorkomen dat hiermee wordt aangemeld. Om dit te doen, gebruikt u de cmdlet Remove-AzADSpCredential:

Remove-AzADSpCredential -DisplayName ServicePrincipalName
$newCredential = New-AzADSpCredential -ServicePrincipalName ServicePrincipalName

Problemen oplossen

Als de volgende foutmelding wordt weergegeven: 'New-AzADServicePrincipal: Er bestaat al een ander object met dezelfde waarde voor de URI's van de eigenschaps-ID.' Controleer of er niet al een service-principal met dezelfde naam bestaat.

Get-AzAdServicePrincipal -DisplayName ServicePrincipalName

Als de bestaande service-principal niet meer nodig is, kunt u deze verwijderen aan de hand van het volgende voorbeeld.

Remove-AzAdServicePrincipal -DisplayName ServicePrincipalName

Deze fout kan ook optreden als u eerder een service-principal voor een Azure Active Directory toepassing hebt gemaakt. Als u de service-principal verwijdert, is de toepassing nog steeds beschikbaar. Deze toepassing zorgt ervoor dat u geen andere service-principal met dezelfde naam kunt maken.

U kunt het volgende voorbeeld gebruiken om te controleren of er geen Azure Active Directory-toepassing met dezelfde naam bestaat:

Get-AzADApplication -DisplayName ServicePrincipalName

Als er een toepassing met dezelfde naam bestaat en niet meer nodig is, kan deze worden verwijderd aan de hand van het volgende voorbeeld.

Remove-AzADApplication -DisplayName ServicePrincipalName

U kunt er ook voor kiezen de nieuwe service-principal een andere naam te geven.