Använd Azure PowerShell för att skapa ett huvudnamn för tjänsten med certifikat

När du har en app eller ett skript som behöver åtkomst till resurser, kan du ställa in en identitet för appen och autentisera den med sina egna autentiseringsuppgifter. Den här identiteten kallas tjänstens huvudnamn. Med den här metoden kan du:

  • Tilldela behörigheter till app-identiteten som skiljer sig från din egen behörighet. Vanligen är dessa behörigheter begränsade till exakt vad appen behöver göra.
  • Använda ett certifikat för autentisering när du kör oövervakade skript.

Viktigt

Överväg att använda hanterade identiteter för Azure-resurser som programidentitet i stället för att skapa ett huvudnamn för tjänsten. Om din kod körs på en tjänst som stöder hanterade identiteter och har åtkomst till resurser som stöder Azure Active Directory-autentisering (Azure AD) är hanterade identiteter ett bättre alternativ för dig. Mer information om hanterade identiteter för Azure-resurser, inklusive vilka tjänster som för närvarande stöder det, finns i Vad är hanterade identiteter för Azure-resurser?.

Den här artikeln visar hur du skapar ett huvudnamn för tjänsten som autentiserar med ett certifikat. Om du vill konfigurera ett huvudnamn för tjänsten med lösenord, se Skapa tjänstens huvudnamn för Azure med Azure PowerShell.

Du måste ha den senaste versionen av PowerShell för den här artikeln.

Anteckning

Den här artikeln har uppdaterats till att använda Azure Az PowerShell-modulen. Az PowerShell-modulen är den rekommenderade PowerShell-modulen för att interagera med Azure. För att komma igång med Az PowerShell kan du läsa artikeln om att installera Azure PowerShell. Information om hur du migrerar till Az PowerShell-modulen finns i artikeln om att migrera Azure PowerShell från AzureRM till Az.

Behörigheter som krävs

För att kunna slutföra den här artikeln måste du ha tillräcklig behörighet i både din Azure AD- och Azure-prenumeration. Mer specifikt måste du kunna skapa en app i Azure AD och tilldela tjänstens huvudnamn till en roll.

Det enklaste sättet att kontrollera om kontot har tillräcklig behörighet är via portalen. Se Kontrollera behörighet som krävs.

Tilldela programmet till en roll

Om du vill komma åt resurser i din prenumeration måste du tilldela programmet till en roll. Bestäm vilken roll som ger rätt behörigheter för programmet. Mer information om tillgängliga roller finns i Inbyggda Roller i Azure.

Du kan ange omfånget på prenumerationsnivå, resursgrupp eller resursnivå. Behörigheter ärvs till lägre omfångsnivåer. Om du till exempel lägger till ett program i rollen Läsare för en resursgrupp kan den läsa resursgruppen och alla resurser som den innehåller. Om du vill tillåta att programmet kör åtgärder som omstart, startar och stoppar du instanser genom att välja rollen Deltagare.

Skapa huvudnamn för tjänsten med självsignerade certifikat

Följande exempel visar ett enkelt scenario. Den använder New-AzADServicePrincipal för att skapa ett huvudnamn för tjänsten med ett självsignerat certifikat och använder New-AzRoleAssignment för att tilldela rollen Läsare till tjänstens huvudnamn. Rolltilldelningen är begränsad till den valda Azure-prenumerationen. Om du vill välja en annan prenumeration använder du Set-AzContext.

Anteckning

Den New-SelfSignedCertificate cmdleten och PKI-modulen stöds för närvarande inte i PowerShell Core.

$cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" `
  -Subject "CN=exampleappScriptCert" `
  -KeySpec KeyExchange
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())

$sp = New-AzADServicePrincipal -DisplayName exampleapp `
  -CertValue $keyValue `
  -EndDate $cert.NotAfter `
  -StartDate $cert.NotBefore
Sleep 20
New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $sp.ApplicationId

Exemplet vilar i 20 sekunder så att det nya tjänstens huvudnamn kan spridas i Hela Azure AD. Om skriptet inte väntar tillräckligt länge visas ett felmeddelande: "Principal {ID} does not exist in the directory {DIR-ID}." (Huvudkontot {ID} finns inte i katalogen {DIR-ID}). Lös problemet genom att vänta en stund och sedan köra kommandot New-AzRoleAssignment igen.

Du kan ange omfånget för rolltilldelningen till en viss resursgrupp med hjälp av parametern ResourceGroupName. Du kan också ange omfånget för en viss resurs med parametrarna ResourceType och ResourceName.

Om du inte har Windows 10 eller Windows Server 2016 laddar du ned cmdleten New-SelfSignedCertificateEx från PKI Solutions. Extrahera innehållet och importera den cmdlet som du behöver.

# Only run if you could not use New-SelfSignedCertificate
Import-Module -Name c:\ExtractedModule\New-SelfSignedCertificateEx.ps1

Ersätt följande två rader i skriptet för att generera certifikatet.

New-SelfSignedCertificateEx -StoreLocation CurrentUser `
  -Subject "CN=exampleapp" `
  -KeySpec "Exchange" `
  -FriendlyName "exampleapp"
$cert = Get-ChildItem -path Cert:\CurrentUser\my | where {$PSitem.Subject -eq 'CN=exampleapp' }

Ange certifikat via det automatiska PowerShell-skriptet

När du loggar in som ett huvudnamn för tjänsten anger du klientorganisations-ID:t för katalogen för din AD-app. En klientorganisation är en instans av Azure AD.

$TenantId = (Get-AzSubscription -SubscriptionName "Contoso Default").TenantId
$ApplicationId = (Get-AzADApplication -DisplayNameStartWith exampleapp).ApplicationId

$Thumbprint = (Get-ChildItem cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq "CN=exampleappScriptCert" }).Thumbprint
Connect-AzAccount -ServicePrincipal `
  -CertificateThumbprint $Thumbprint `
  -ApplicationId $ApplicationId `
  -TenantId $TenantId

Skapa tjänstens huvudnamn med certifikat från certifikatutfärdaren

I följande exempel används ett certifikat som utfärdats från en certifikatutfärdare för att skapa tjänstens huvudnamn. Tilldelningen begränsas till den angivna Azure-prenumerationen. Tjänstens huvudnamn läggs till i rollen Läsare. Om ett fel inträffar under rolltilldelningen försöker det göra om tilldelningen.

Param (
 [Parameter(Mandatory=$true)]
 [String] $ApplicationDisplayName,

 [Parameter(Mandatory=$true)]
 [String] $SubscriptionId,

 [Parameter(Mandatory=$true)]
 [String] $CertPath,

 [Parameter(Mandatory=$true)]
 [String] $CertPlainPassword
 )

 Connect-AzAccount
 Import-Module Az.Resources
 Set-AzContext -Subscription $SubscriptionId

 $CertPassword = ConvertTo-SecureString $CertPlainPassword -AsPlainText -Force

 $PFXCert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @($CertPath, $CertPassword)
 $KeyValue = [System.Convert]::ToBase64String($PFXCert.GetRawCertData())

 $ServicePrincipal = New-AzADServicePrincipal -DisplayName $ApplicationDisplayName
 New-AzADSpCredential -ObjectId $ServicePrincipal.Id -CertValue $KeyValue -StartDate $PFXCert.NotBefore -EndDate $PFXCert.NotAfter
 Get-AzADServicePrincipal -ObjectId $ServicePrincipal.Id 

 $NewRole = $null
 $Retries = 0;
 While ($NewRole -eq $null -and $Retries -le 6)
 {
    # Sleep here for a few seconds to allow the service principal application to become active (should only take a couple of seconds normally)
    Sleep 15
    New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $ServicePrincipal.ApplicationId | Write-Verbose -ErrorAction SilentlyContinue
    $NewRole = Get-AzRoleAssignment -ObjectId $ServicePrincipal.Id -ErrorAction SilentlyContinue
    $Retries++;
 }

 $NewRole

Ange certifikat via det automatiska PowerShell-skriptet

När du loggar in som ett huvudnamn för tjänsten anger du klientorganisations-ID:t för katalogen för din AD-app. En klientorganisation är en instans av Azure AD.

Param (

 [Parameter(Mandatory=$true)]
 [String] $CertPath,

 [Parameter(Mandatory=$true)]
 [String] $CertPlainPassword,

 [Parameter(Mandatory=$true)]
 [String] $ApplicationId,

 [Parameter(Mandatory=$true)]
 [String] $TenantId
 )

 $CertPassword = ConvertTo-SecureString $CertPlainPassword -AsPlainText -Force
 $PFXCert = New-Object `
  -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 `
  -ArgumentList @($CertPath, $CertPassword)
 $Thumbprint = $PFXCert.Thumbprint

 Connect-AzAccount -ServicePrincipal `
  -CertificateThumbprint $Thumbprint `
  -ApplicationId $ApplicationId `
  -TenantId $TenantId

App-ID och klientorganisations-ID är inte känsliga data, så du kan bädda in dem direkt i skriptet. Om du behöver hämta klientorganisations-ID, använd:

(Get-AzSubscription -SubscriptionName "Contoso Default").TenantId

Om du behöver hämta app-ID, använd:

(Get-AzADApplication -DisplayNameStartWith {display-name}).ApplicationId

Ändra autentiseringsuppgifter

Om du vill ändra autentiseringsuppgifterna för en AD-app använder du cmdletarna Remove-AzADAppCredential och New-AzADAppCredential på grund av en säkerhetskompromettering eller en förfallotid för autentiseringsuppgifter.

För att ta bort alla autentiseringsuppgifter för en app, använd:

Get-AzADApplication -DisplayName exampleapp | Remove-AzADAppCredential

Skapa ett självsignerat certifikat för att lägga till ett certifikatvärde som visas i den här artikeln. Använd sedan:

Get-AzADApplication -DisplayName exampleapp | New-AzADAppCredential `
  -CertValue $keyValue `
  -EndDate $cert.NotAfter `
  -StartDate $cert.NotBefore

Felsöka

Du kan få följande fel när du skapar ett huvudnamn för tjänsten:

  • "Authentication_Unauthorized" (Ej auktoriserad autentisering) eller "No subscription found in the context." (Ingen prenumeration hittades i sammanhanget). – Du ser det här felet när ditt konto inte har de behörigheter som krävs för att registrera en app i Azure AD. Vanligtvis visas det här felet när endast administratörsanvändare i Azure Active Directory kan registrera appar och ditt konto inte är administratör. Be administratören att antingen tilldela dig en administratörsroll eller göra det möjligt för användare att registrera appar.

  • Ditt konto "har inte behörighet att utföra åtgärden Microsoft.Authorization/roleAssignments/write" över omfånget "/subscriptions/{guid}"." – Du ser det här felet när ditt konto inte har tillräcklig behörighet för att tilldela en roll till en identitet. Be din prenumerationsadministratör att ge dig rollen som administratör för användaråtkomst.

Nästa steg