Vytvoření instančního objektu s certifikátem pomocí Azure PowerShellu

Pokud máte aplikaci nebo skript, který potřebuje přístup k prostředkům, můžete pro aplikaci nastavit identitu a ověřit tuto aplikaci jejími vlastními přihlašovacími údaji. Tato identita se označuje jako instanční objekt. Tento přístup vám umožní:

  • Přiřadit identitě aplikace oprávnění, která se budou lišit od vašich vlastních oprávnění. Tato oprávnění jsou obvykle omezená přesně na to, co aplikace potřebuje dělat.
  • Při provádění bezobslužného skriptu použít k ověření certifikát.

Důležité

Místo vytváření instančního objektu zvažte použití spravovaných identit pro prostředky Azure pro identitu aplikace. Pokud váš kód běží ve službě, která podporuje spravované identity a přistupuje k prostředkům, které podporují ověřování Azure Active Directory (Azure AD), jsou pro vás spravované identity lepší volbou. Další informace o spravovaných identitách pro prostředky Azure, včetně služeb, které je aktuálně podporují, najdete v tématu Co jsou spravované identity pro prostředky Azure.

Tento článek vám ukazuje, jak vytvořit instanční objekt, který se ověřuje certifikátem. Pokud chcete nastavit instanční objekt s heslem, podívejte se na článek věnovaný vytvoření instančního objektu Azure s použitím prostředí Azure PowerShell.

K tomuto článku musíte mít nejnovější verzi PowerShellu.

Poznámka

K interakci s Azure doporučujeme použít modul Azure Az PowerShell. Začněte tím, že si projděte téma Instalace Azure PowerShell. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.

Požadovaná oprávnění

K dokončení tohoto článku musíte mít dostatečná oprávnění v Azure AD i v předplatném Azure. Konkrétně musíte být schopni vytvořit aplikaci v Azure AD a přiřadit instanční objekt k roli.

Nejjednodušším způsobem, jak zkontrolovat, jestli má váš účet dostatečná oprávnění, je použít k tomu portál. Informace najdete v článku Kontrola požadovaných oprávnění.

Přiřazení aplikace k roli

Pokud chcete získat přístup k prostředkům ve vašem předplatném, musíte aplikaci přiřadit k roli. Rozhodněte, která role nabízí správná oprávnění pro aplikaci. Informace o dostupných rolích najdete v tématu Předdefinované role Azure.

Rozsah můžete nastavit na úrovni předplatného, skupiny prostředků nebo prostředku. Oprávnění se dědí do nižších úrovní oboru. Například přidání aplikace do role Čtenář pro skupinu prostředků znamená, že aplikace může číst skupinu prostředků a všechny prostředky, které obsahuje. Pokud chcete aplikaci povolit spouštění akcí, jako je restartování, spuštění a zastavení instancí, vyberte roli Přispěvatel .

Vytvoření instančního objektu s certifikátem podepsaným svým držitelem

Následující příklad popisuje jednoduchou situaci. Pomocí rutiny New-AzADServicePrincipal vytvoří instanční objekt s certifikátem podepsaným svým držitelem a pomocí rutiny New-AzRoleAssignment přiřadí roli Čtenář k instančnímu objektu. Přiřazení role je vymezené vaším aktuálně vybraným předplatným Azure. Pokud chcete vybrat jiné předplatné, použijte Set-AzContext.

Poznámka

PowerShell Core v současné době nepodporuje rutinu New-SelfSignedCertificate a modul PKI.

$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.AppId

Příklad po dobu 20 sekund spí, aby se nový instanční objekt mohl rozšířit do Azure AD. Pokud váš skript nečeká dostatečně dlouho, zobrazí se chyba s oznámením, že objekt zabezpečení {ID} v adresáři {DIR-ID} neexistuje. Pokud chcete tuto chybu vyřešit, chvíli počkejte a pak znovu spusťte příkaz New-AzRoleAssignment .

Přiřazení role můžete vymezit na konkrétní skupinu prostředků pomocí parametru ResourceGroupName. Vymezit konkrétní rozsah můžete také pomocí parametrů ResourceType a ResourceName.

Pokud nemáte Windows 10 nebo Windows Server 2016, stáhněte si z řešení PKI rutinu New-SelfSignedCertificateEx. Rozbalte jeho obsah a importujte potřebnou rutinu.

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

Ve skriptu nahraďte následující dva řádky, aby se vygeneroval certifikát.

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

Poskytnutí certifikátu pomocí automatizovaného skriptu PowerShellu

Pokaždé, když se přihlásíte jako instanční objekt, zadejte ID tenanta adresáře pro vaši aplikaci AD. Tenant je instance Azure AD.

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

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

Vytvoření instančního objektu pomocí certifikátu z certifikační autority

Následující příklad používá k vytvoření instančního objektu certifikát vydaný certifikační autoritou. Přiřazení je vymezené na zadané předplatné Azure. Přidá instanční objekt do role Čtenář . Pokud dojde k chybě při přiřazení role, dojde k dalšímu pokusu o přiřazení.

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.AppId | Write-Verbose -ErrorAction SilentlyContinue
    $NewRole = Get-AzRoleAssignment -ObjectId $ServicePrincipal.Id -ErrorAction SilentlyContinue
    $Retries++;
 }

 $NewRole

Poskytnutí certifikátu pomocí automatizovaného skriptu PowerShellu

Pokaždé, když se přihlásíte jako instanční objekt, zadejte ID tenanta adresáře pro vaši aplikaci AD. Tenant je instance 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

ID aplikace a ID tenanta nejsou důvěrná, takže je můžete vložit přímo do skriptu. Pokud potřebujete načíst ID tenanta, použijte tento kód:

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

Pokud potřebujete načíst ID aplikace, použijte tento kód:

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

Změna přihlašovacích údajů

Pokud chcete změnit přihlašovací údaje pro aplikaci AD, ať už kvůli ohrožení zabezpečení nebo vypršení platnosti přihlašovacích údajů, použijte rutiny Remove-AzADAppCredential a New-AzADAppCredential .

Pokud chcete odebrat všechny přihlašovací údaje pro aplikaci, použijte tento kód:

Get-AzADApplication -DisplayName exampleapp | Remove-AzADAppCredential

Pokud chcete přidat hodnotu certifikátu, vytvořte certifikát podepsaný svým držitelem, jak je znázorněno v tomto článku. Potom použijte:

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

Ladění

Při vytváření instančního objektu může dojít k následujícím chybám:

  • "Authentication_Unauthorized" nebo "V kontextu se nenašlo žádné předplatné." – Tato chyba se zobrazí, když váš účet nemá požadovaná oprávnění na Azure AD k registraci aplikace. Tato chyba se obvykle zobrazí, když aplikace ve službě Azure Active Directory můžou registrovat jenom uživatelé s rolí správce a váš účet není správcem. Požádejte správce, aby vám buď přiřadil roli správce, nebo aby uživatelům umožnil registrovat aplikace.

  • Váš účet nemá oprávnění k provedení akce Microsoft.Authorization/roleAssignments/write v oboru /subscriptions/{guid}. – Tato chyba se zobrazí, když váš účet nemá dostatečná oprávnění k přiřazení role identitě. Požádejte správce předplatného, aby vás přidal do role Správce přístupu uživatelů.

Další kroky