為應用程式提供 Azure Stack Hub 資源的存取權
透過 Azure Resource Manager 部署或設定資源的應用程式必須以自己的身分識別來表示,稱為安全性主體。 就像用戶主體所代表一樣,應用程式會以服務主體表示。
身分識別也可以用來只將必要的許可權委派給使用者或應用程式。 例如,組態管理應用程式可能會使用 Azure Resource Manager 來清查 Azure 資源。 應用程式會在目錄中註冊,然後在適當的範圍中新增至「讀取者」角色,限制應用程式為只讀存取。
概觀
就像使用者一樣,應用程式必須在驗證期間出示認證,這需要兩個元素:
- 應用程式識別碼,有時稱為 [用戶端識別碼]。 可唯一識別 Active Directory 租使用者中應用程式註冊的 GUID。
- 秘密。 您可以產生客戶端密碼字串(類似於密碼),或指定 X509 憑證指紋(其使用其公鑰)。
基於下列原因,最好是在自己的身分識別下執行應用程式:
- 更強的認證 - 應用程式可以使用 X509 憑證登入,而非文字共用秘密/密碼。
- 可指派 更嚴格的權限 給應用程式。 一般而言,這些權限僅限於應用程式需要執行的作業,稱為 最低權限原則。
- 針對應用程式,認證和權限不會頻繁變更 如使用者認證那樣。 例如,當使用者的責任變更時,密碼需求會決定變更 (或當使用者離開公司時)。
首先,您會在目錄中建立新的應用程式註冊,以建立相關聯的 服務主體對象 來代表目錄中的應用程式身分識別。 註冊程式會根據您為 Azure Stack Hub 實例選擇的目錄而有所不同:
- Microsoft Entra ID:Microsoft Entra ID 是多租用戶、雲端式、目錄和身分識別管理服務。 您可以使用 Microsoft Entra 識別碼搭配已連線的 Azure Stack Hub 實例。 稍後顯示的範例會使用 Azure 入口網站 進行 Microsoft Entra 應用程式註冊。
- Active Directory 同盟服務 (AD FS):AD FS 提供簡化、受保護的身分識別同盟,以及Web單一登錄 (SSO) 功能。 您可以使用 AD FS 搭配已連線和中斷連線的 Azure Stack Hub 實例。 稍後提供的範例會使用 Azure Stack Hub PowerShell 進行 AD FS 應用程式註冊。
註冊應用程式之後,您會瞭解如何將其指派給角色,並限制其資源存取權。
管理 Microsoft Entra 應用程式
如果您使用 Microsoft Entra ID 作為身分識別管理服務部署 Azure Stack Hub,您可以建立和管理應用程式的身分識別,就像您為 Azure 所做的一樣。 本節說明如何使用 Azure 入口網站 來執行步驟。 檢閱 在開始之前註冊應用程式 所需的許可權,以確定您有足夠的許可權可註冊應用程式。
建立使用客戶端密碼認證的應用程式註冊
在本節中,您會使用 Azure 入口網站,在 Microsoft Entra 租用戶中註冊您的應用程式。 在下列範例中,您可以指定客戶端密碼認證,但入口網站也支援 X509 憑證型認證。
使用 Azure 帳戶登入 Azure 入口網站。
選取 [Microsoft [項目標識符>]應用程式註冊> [新增註冊]。
提供 應用程式的名稱 。
選取適當的 支持帳戶類型。
在 [重新導向 URI] 下,選取 [Web] 作為應用程式類型,並在您的應用程式需要時指定重新導向 URI。
設定值之後,請選取 [ 註冊]。 系統會建立應用程式註冊,並顯示 [ 概觀 ] 頁面。
複製應用程式識別碼以用於您的應用程式程式代碼。 這個值也稱為用戶端標識碼。
若要產生客戶端密碼,請選取 [憑證與秘密 ] 頁面。 選取 [新用戶端密碼]。
提供 秘密的描述 ,以及 到期 期間。
完成時,選取 [新增]。
秘密的值隨即顯示。 複製此值並儲存在另一個位置,因為您稍後無法擷取此值。 您會在用戶端應用程式中提供秘密以取得登入的應用程式識別碼。
繼續指派 角色 ,以瞭解如何建立應用程式身分識別的角色型訪問控制。
其他Microsoft Entra 應用程式管理文章
如需管理 Microsoft Entra 應用程式的詳細資訊,請參閱下列 Azure 文章:
- 註冊Microsoft Entra 應用程式的詳細資訊,包括如何建立使用憑證認證的應用程式註冊。
- 如何 移除應用程式註冊。
- 如何 還原或移除最近刪除的應用程式註冊。
管理 AD FS 應用程式
如果您使用AD FS部署 Azure Stack Hub 作為身分識別管理服務,則必須使用PowerShell來管理應用程式的身分識別。 下列範例示範 X509 憑證和客戶端密碼認證。
腳本必須在提升許可權的 PowerShell 控制台中執行,此控制台會將另一個會話開啟至裝載 Azure Stack Hub 實例特殊許可權端點的 VM。 建立具特殊許可權的端點會話之後,會使用其他 Cmdlet 來建立和管理應用程式註冊。 如需特殊許可權端點的詳細資訊,請參閱 在 Azure Stack Hub 中使用具特殊許可權的端點。
建立使用憑證認證的應用程式註冊
在建立憑證認證時,必須符合下列需求:
- 針對生產環境,憑證必須由內部憑證授權單位或公用憑證授權單位發出。 使用公用授權單位時,您必須在基底操作系統映像中包含授權單位,做為Microsoft受信任根授權單位計劃的一部分。 如需完整清單,請參閱 參與者清單 - Microsoft受信任的根計劃。 在更新憑證認證期間,也會顯示建立「自我簽署」測試憑證的範例。
- 密碼編譯提供者必須指定為 Microsoft 舊版密碼編譯服務提供者 (CSP) 金鑰提供者。
- 憑證格式必須是 PFX 檔案,因為需要公用與私密金鑰。 Windows 伺服器會使用包含公用金鑰檔案 (TLS/SSL 憑證檔案) 及相關私密金鑰檔案的 .pfx 檔案。
- 您的 Azure Stack Hub 基礎結構必須能透過網路來存取憑證中所發佈憑證授權單位的憑證撤銷清單 (CRL) 位置。 這個 CRL 必須是 HTTP 端點。
擁有憑證之後,請使用下列 PowerShell 腳本來註冊您的應用程式,並使用應用程式的身分識別登入。 以您自己的值取代下列預留位置:
預留位置 | 描述: | 範例 |
---|---|---|
<PepVM> | Azure Stack Hub 實例上具特殊許可權端點 VM 的名稱。 | “AzS-ERCS01” |
<YourCertificateLocation> | X509 憑證在本機憑證存放區中的位置。 | “Cert:\CurrentUser\My\AB5A8A3533CC7AA2025BF05120117E06DE407B34” |
<YourAppName> | 新應用程式註冊的描述性名稱。 | 「我的管理工具」 |
開啟已提升權限的 Windows PowerShell 工作階段,然後執行下列指令碼。
# Sign in to PowerShell interactively, using credentials that have access to the VM running the Privileged Endpoint (typically <domain>\cloudadmin) $Creds = Get-Credential # Create a PSSession to the Privileged Endpoint VM $Session = New-PSSession -ComputerName "<PepVm>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # To use a managed certificate from the certificate store, use the Get-Item cmdlet. # To use a certificate file, use Get-Certificate for a .cer file, or Get-PfxCertificate for a .pfx file. # To use a test certificate, use the New-SelfSignedCertificate cmdlet # See https://learn.microsoft.com/powershell/module/pki/new-selfsignedcertificate for usage details, including using the -Provider parameter # $Cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" -Subject "CN=<YourAppName>" -KeySpec KeyExchange $Cert = Get-Item "<YourCertificateLocation>" # Use the privileged endpoint to create the new app registration $SpObject = Invoke-Command -Session $Session -ScriptBlock {New-GraphApplication -Name "<YourAppName>" -ClientCertificates $using:cert} $AzureStackInfo = Invoke-Command -Session $Session -ScriptBlock {Get-AzureStackStampInformation} $Session | Remove-PSSession # Using the stamp info for your Azure Stack Hub instance, populate the following variables: # - Az endpoint used for Azure Resource Manager operations # - Audience for acquiring an OAuth token used to access Graph API # - GUID of the directory tenant $ArmEndpoint = $AzureStackInfo.TenantExternalEndpoints.TenantResourceManager $GraphAudience = "https://graph." + $AzureStackInfo.ExternalDomainFQDN + "/" $TenantID = $AzureStackInfo.AADTenantID # Register and set an Az environment that targets your Azure Stack Hub instance Add-AzEnvironment -Name "AzureStackUser" -ArmEndpoint $ArmEndpoint # Sign in using the new service principal $SpSignin = Connect-AzAccount -Environment "AzureStackUser" ` -ServicePrincipal ` -CertificateThumbprint $SpObject.Thumbprint ` -ApplicationId $SpObject.ClientId ` -TenantId $TenantID # Output the service principal details $SpObject
腳本完成之後,它會顯示應用程式註冊資訊。
ClientID
和Thumbprint
在經過驗證後,將獲得授權而可存取 Azure Resource Manager 所管理的資源。ApplicationIdentifier : S-1-5-21-1512385356-3796245103-1243299919-1356 ClientId : 00001111-aaaa-2222-bbbb-3333cccc4444 Thumbprint : 30202C11BE6864437B64CE36C8D988442082A0F1 ApplicationName : Azurestack-MyApp-c30febe7-1311-4fd8-9077-3d869db28342 ClientSecret : PSComputerName : azs-ercs01 RunspaceId : a78c76bb-8cae-4db4-a45a-c1420613e01b
讓 PowerShell 控制台工作階段保持開啟,因為您會在下一節中搭配 ApplicationIdentifier
值使用它。
更新憑證認證
現在您已註冊應用程式,本節將示範如何:
- 建立新的自我簽署 X509 憑證進行測試。
- 更新應用程式的認證,方法是更新其 Thumbprint 屬性以符合新的憑證。
使用 PowerShell 更新憑證認證,並以您自己的值取代下列佔位元:
預留位置 | 描述: | 範例 |
---|---|---|
<PepVM> | Azure Stack Hub 實例上具特殊許可權端點 VM 的名稱。 | “AzS-ERCS01” |
<YourAppName> | 新應用程式註冊的描述性名稱。 | 「我的管理工具」 |
<YourCertificateLocation> | X509 憑證在本機憑證存放區中的位置。 | “Cert:\CurrentUser\My\AB5A8A3533CC7AA2025BF05120117E06DE407B34” |
<AppIdentifier> | 指派給應用程式註冊的標識碼。 | “S-1-5-21-1512385356-3796245103-1243299919-1356” |
使用提升許可權的 Windows PowerShell 工作階段,執行下列 Cmdlet:
# Create a PSSession to the PrivilegedEndpoint VM $Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Create a self-signed certificate for testing purposes, using the New-SelfSignedCertificate cmdlet # See https://learn.microsoft.com/powershell/module/pki/new-selfsignedcertificate for usage details, including using the -Provider parameter $NewCert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" -Subject "CN=<YourAppName>" -KeySpec KeyExchange # In production, use Get-Item to retrieve a managed certificate from the certificate store. # Alteratively, use Get-Certificate for a .cer file, or Get-PfxCertificate for a .pfx file. # $Cert = Get-Item "<YourCertificateLocation>" # Use the privileged endpoint to update the certificate thumbprint, used by <AppIdentifier> $SpObject = Invoke-Command -Session $Session -ScriptBlock {Set-GraphApplication -ApplicationIdentifier "<AppIdentifier>" -ClientCertificates $using:NewCert} $Session | Remove-PSSession # Output the updated service principal details $SpObject
腳本完成之後,會顯示更新的應用程式註冊資訊,包括新自我簽署憑證的指紋值。
ApplicationIdentifier : S-1-5-21-1512385356-3796245103-1243299919-1356 ClientId : Thumbprint : AF22EE716909041055A01FE6C6F5C5CDE78948E9 ApplicationName : Azurestack-MyApp-c30febe7-1311-4fd8-9077-3d869db28342 ClientSecret : PSComputerName : azs-ercs01 RunspaceId : a580f894-8f9b-40ee-aa10-77d4d142b4e5
建立使用客戶端密碼認證的應用程式註冊
警告
使用客戶端密碼比使用 X509 憑證認證不安全。 驗證機制不僅較不安全,而且通常需要在用戶端應用程式原始程式碼中內嵌秘密。 因此,對於生產應用程式,強烈建議您使用憑證認證。
現在您會建立另一個應用程式註冊,但這次請指定客戶端密碼認證。 不同于憑證認證,目錄能夠產生用戶端密碼認證。 您不需要指定客戶端密碼,而是使用 -GenerateClientSecret
參數來要求產生它。 以您自己的值取代下列預留位置:
預留位置 | 描述: | 範例 |
---|---|---|
<PepVM> | Azure Stack Hub 實例上具特殊許可權端點 VM 的名稱。 | “AzS-ERCS01” |
<YourAppName> | 新應用程式註冊的描述性名稱。 | 「我的管理工具」 |
開啟提升權限的 Windows PowerShell 工作階段,並執行下列 cmdlet:
# Sign in to PowerShell interactively, using credentials that have access to the VM running the Privileged Endpoint (typically <domain>\cloudadmin) $Creds = Get-Credential # Create a PSSession to the Privileged Endpoint VM $Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Use the privileged endpoint to create the new app registration $SpObject = Invoke-Command -Session $Session -ScriptBlock {New-GraphApplication -Name "<YourAppName>" -GenerateClientSecret} $AzureStackInfo = Invoke-Command -Session $Session -ScriptBlock {Get-AzureStackStampInformation} $Session | Remove-PSSession # Using the stamp info for your Azure Stack Hub instance, populate the following variables: # - Az endpoint used for Azure Resource Manager operations # - Audience for acquiring an OAuth token used to access Graph API # - GUID of the directory tenant $ArmEndpoint = $AzureStackInfo.TenantExternalEndpoints.TenantResourceManager $GraphAudience = "https://graph." + $AzureStackInfo.ExternalDomainFQDN + "/" $TenantID = $AzureStackInfo.AADTenantID # Register and set an Az environment that targets your Azure Stack Hub instance Add-AzEnvironment -Name "AzureStackUser" -ArmEndpoint $ArmEndpoint # Sign in using the new service principal $securePassword = $SpObject.ClientSecret | ConvertTo-SecureString -AsPlainText -Force $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $SpObject.ClientId, $securePassword $SpSignin = Connect-AzAccount -Environment "AzureStackUser" -ServicePrincipal -Credential $credential -TenantId $TenantID # Output the service principal details $SpObject
腳本完成之後,它會顯示應用程式註冊資訊。
ClientID
和ClientSecret
在經過驗證後,將獲得授權而可存取 Azure Resource Manager 所管理的資源。ApplicationIdentifier : S-1-5-21-1634563105-1224503876-2692824315-2623 ClientId : 11112222-bbbb-3333-cccc-4444dddd5555 Thumbprint : ApplicationName : Azurestack-YourApp-6967581b-497e-4f5a-87b5-0c8d01a9f146 ClientSecret : 6RUWLRoBw3EebBLgaWGiowCkoko5_j_ujIPjA8dS PSComputerName : azs-ercs01 RunspaceId : 286daaa1-c9a6-4176-a1a8-03f543f90998
讓 PowerShell 控制台工作階段保持開啟,因為您會在下一節中搭配 ApplicationIdentifier
值使用它。
更新客戶端密碼認證
使用 PowerShell 更新用戶端密碼認證,並使用 ResetClientSecret 參數,以立即變更客戶端密碼。 以您自己的值取代下列預留位置:
預留位置 | 描述: | 範例 |
---|---|---|
<PepVM> | Azure Stack Hub 實例上具特殊許可權端點 VM 的名稱。 | “AzS-ERCS01” |
<AppIdentifier> | 指派給應用程式註冊的標識碼。 | “S-1-5-21-1634563105-1224503876-2692824315-2623” |
使用提升許可權的 Windows PowerShell 工作階段,執行下列 Cmdlet:
# Create a PSSession to the PrivilegedEndpoint VM $Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Use the privileged endpoint to update the client secret, used by <AppIdentifier> $SpObject = Invoke-Command -Session $Session -ScriptBlock {Set-GraphApplication -ApplicationIdentifier "<AppIdentifier>" -ResetClientSecret} $Session | Remove-PSSession # Output the updated service principal details $SpObject
腳本完成之後,它會顯示更新的應用程式註冊資訊,包括新產生的客戶端密碼。
ApplicationIdentifier : S-1-5-21-1634563105-1224503876-2692824315-2623 ClientId : 11112222-bbbb-3333-cccc-4444dddd5555 Thumbprint : ApplicationName : Azurestack-YourApp-6967581b-497e-4f5a-87b5-0c8d01a9f146 ClientSecret : MKUNzeL6PwmlhWdHB59c25WDDZlJ1A6IWzwgv_Kn PSComputerName : azs-ercs01 RunspaceId : 6ed9f903-f1be-44e3-9fef-e7e0e3f48564
移除應用程式註冊
現在您將瞭解如何使用PowerShell 從目錄中移除應用程式註冊。
以您自己的值取代下列預留位置:
預留位置 | 描述: | 範例 |
---|---|---|
<PepVM> | Azure Stack Hub 實例上具特殊許可權端點 VM 的名稱。 | “AzS-ERCS01” |
<AppIdentifier> | 指派給應用程式註冊的標識碼。 | “S-1-5-21-1634563105-1224503876-2692824315-2623” |
# Sign in to PowerShell interactively, using credentials that have access to the VM running the Privileged Endpoint (typically <domain>\cloudadmin)
$Creds = Get-Credential
# Create a PSSession to the PrivilegedEndpoint VM
$Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
# OPTIONAL: Use the privileged endpoint to get a list of applications registered in AD FS
$AppList = Invoke-Command -Session $Session -ScriptBlock {Get-GraphApplication}
# Use the privileged endpoint to remove application <AppIdentifier>
Invoke-Command -Session $Session -ScriptBlock {Remove-GraphApplication -ApplicationIdentifier "<AppIdentifier>"}
在特殊許可權端點上呼叫 Remove-GraphApplication Cmdlet 時,不會傳回任何輸出,但您會在執行 Cmdlet 期間看到控制台的逐字確認輸出:
VERBOSE: Deleting graph application with identifier S-1-5-21-1634563105-1224503876-2692824315-2623.
VERBOSE: Remove-GraphApplication : BEGIN on AZS-ADFS01 on ADFSGraphEndpoint
VERBOSE: Application with identifier S-1-5-21-1634563105-1224503876-2692824315-2623 was deleted.
VERBOSE: Remove-GraphApplication : END on AZS-ADFS01 under ADFSGraphEndpoint configuration
指派角色
使用者和應用程式的 Azure 資源存取權是透過角色型 存取控制 (RBAC) 授權的。 若要允許應用程式存取訂用帳戶中的資源,您必須將其服務主體指派給特定資源的角色。 首先,決定哪個角色代表應用程式的正確 許可權 。 若要瞭解可用的角色,請參閱 Azure 資源的內建角色。
您選擇的資源類型也會建立 應用程式的存取範圍 。 您可以在訂用帳戶、資源群組或資源層級設定存取範圍。 權限會繼承至較低層級的範圍。 例如,將應用程式新增至資源群組的「讀取者」角色,表示它可以讀取資源群組及其包含的任何資源。
根據您在 Azure Stack Hub 安裝期間指定的目錄登入適當的入口網站(例如,Microsoft Entra ID 的 Azure 入口網站,或 AD FS 的 Azure Stack Hub 使用者入口網站)。 在此範例中,我們會顯示登入 Azure Stack Hub 使用者入口網站的使用者。
注意
若要新增指定資源的角色指派,您的用戶帳戶必須屬於宣告
Microsoft.Authorization/roleAssignments/write
許可權的角色。 例如, 擁有者 或 使用者存取系統管理員 內建角色。流覽至您想要允許應用程式存取的資源。 在此範例中,選取 [訂用帳戶],然後選取 [訂用帳戶],然後將應用程式指派給訂用帳戶範圍的角色。 您可以改為選取資源群組,或像是虛擬機的特定資源。
選取 [存取控制 (IAM) 頁面,其適用於所有支援 RBAC 的資源。
選取 [+ 新增]
在 [角色] 底下,挑選您想要指派給應用程式的角色。
在 [選取] 下,使用完整或部分應用程式名稱搜尋您的應用程式。 註冊期間,應用程式名稱會以 Azurestack-YourAppName-GUID><<> 的形式產生。 例如,如果您在建立期間使用了App2的應用程式名稱,且 GUID 2bbe67d8-3fdb-4b62-87cf-cc41dd4344ff 已指派,完整名稱會是 Azurestack-App2-2bbe67d8-3fdb-4b62-87cf-cc41dd4344ff。 您可以搜尋確切字串或部分,例如 Azurestack 或 Azurestack-App2。
找到應用程式之後,請加以選取,且會顯示在 [選取的成員] 底下。
選取 [ 儲存 ] 以完成指派角色。
完成時,應用程式會顯示在指定角色指派給目前範圍的主體清單中。
既然您已為應用程式提供身分識別並授權它進行資源存取,您可以啟用腳本或程式代碼來登入並安全地存取 Azure Stack Hub 資源。