共用方式為


使用 Azure PowerShell 來建立 Azure 服務主體

警告

自 2024 年 2 月 29 日起,AzureRM PowerShell 模組已正式淘汰。 建議使用者從 AzureRM 遷移至 Az PowerShell 模組,以確保持續支援和更新。

雖然 AzureRM 模組可能仍可運作,但不再維護或支援它,但會根據用戶的判斷權和風險放置任何繼續使用。 如需轉換至 Az 模組的指引,請參閱我們的 移轉資源

如果您打算使用 Azure PowerShell 管理應用程式或服務,您應該在 Azure Microsoft Entra 服務主體下執行它,而不是您自己的認證。 本文將逐步引導您使用 Azure PowerShell 建立安全性主體。

注意

您也可以透過 Azure 入口網站 建立服務主體。 如需詳細資訊,請參閱 使用入口網站建立可存取資源的 Active Directory 應用程式和服務主體。

什麼是「服務主體」?

Azure 服務主體是使用者建立的應用程式、服務和自動化工具用來存取特定 Azure 資源的安全性身分識別。 將其視為具有特定角色的「使用者身分識別」(使用者名稱和密碼或憑證),並嚴格控制許可權。 服務主體應該只需要執行特定動作,不像一般使用者身分識別。 如果您只授與執行其管理工作所需的最低許可權層級,它可改善安全性。

確認您自己的許可權等級

首先,您必須在 Microsoft Entra ID 和 Azure 訂用帳戶中擁有足夠的許可權。 您必須能夠在 Active Directory 中建立應用程式,並將角色指派給服務主體。

檢查您的帳戶是否有正確的許可權,最簡單的方式是透過入口網站。 請參閱 在入口網站中檢查必要的許可權。

為您的應用程式建立服務主體

登入您的 Azure 帳戶之後,您可以建立服務主體。 您必須有下列其中一種方式來識別已部署的應用程式:

  • 已部署應用程式的唯一名稱,例如下列範例中的 「MyDemoWebApp」 或
  • 應用程式標識碼,與已部署的應用程式、服務或對象相關聯的唯一 GUID

取得應用程式的相關信息

Cmdlet Get-AzureRmADApplication 可用來取得應用程式的相關信息。

Get-AzureRmADApplication -DisplayNameStartWith MyDemoWebApp
DisplayName             : MyDemoWebApp
ObjectId                : 775f64cd-0ec8-4b9b-b69a-8b8946022d9f
IdentifierUris          : {http://MyDemoWebApp}
HomePage                : http://www.contoso.com
Type                    : Application
ApplicationId           : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
AvailableToOtherTenants : False
AppPermissions          :
ReplyUrls               : {}

為您的應用程式建立服務主體

Cmdlet New-AzureRmADServicePrincipal 可用來建立服務主體。

$servicePrincipal = New-AzureRmADServicePrincipal -ApplicationId 00c01aaa-1603-49fc-b6df-b78c4e5138b4
Secret                : System.Security.SecureString
ServicePrincipalNames : {00c01aaa-1603-49fc-b6df-b78c4e5138b4, http://MyDemoWebApp}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
AdfsId                :
Type                  : ServicePrincipal

您可以從這裡直接使用 連線-AzureRmAccount 中的 $servicePrincipal.Secret 屬性(請參閱下方的「使用服務主體登入」),或者您可以將此 SecureString 轉換為純文本字串,以供稍後使用:

$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($servicePrincipal.Secret)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)

使用服務主體登入

您現在可以使用 您提供的 appId自動產生的密碼 ,以應用程式的新服務主體身分登入。 您也需要服務主體的租用戶標識碼。 當您使用個人認證登入 Azure 時,會顯示您的租使用者識別碼。 若要使用服務主體登入,請使用下列命令:

$cred = New-Object System.Management.Automation.PSCredential ("00c01aaa-1603-49fc-b6df-b78c4e5138b4", $servicePrincipal.Secret)
Connect-AzureRmAccount -Credential $cred -ServicePrincipal -TenantId 00000000-0000-0000-0000-000000000000

成功登入之後,您會看到如下的輸出:

Environment           : AzureCloud
Account               : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
TenantId              : 00000000-0000-0000-0000-000000000000
SubscriptionId        :
SubscriptionName      :
CurrentStorageAccount :

恭喜! 您可以使用這些認證來執行您的應用程式。 接下來,您必須調整服務主體的許可權。

管理角色

注意

Azure 角色型 存取控制 (RBAC) 是定義和管理使用者和服務主體角色的模型。 角色具有與其相關聯的許可權集合,可決定主體可以讀取、存取、寫入或管理的資源。 如需 RBAC 和角色的詳細資訊,請參閱 RBAC:內建角色

Azure PowerShell 提供下列 Cmdlet 來管理角色指派:

服務主體的預設角色是 參與者。 根據應用程式與 Azure 服務的互動範圍,它可能不是最佳選擇,因為它具有廣泛的許可權。 讀者角色比較嚴格,而且對於唯讀應用程式而言是不錯的選擇。 您可以檢視角色特定許可權的詳細數據,或透過 Azure 入口網站 建立自定義許可權。

在此範例中,我們會將 讀者 角色新增至先前的範例,並刪除 參與者 角色:

New-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Reader
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/818892f2-d075-46a1-a3a2-3a4e1a12fcd5
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : b24988ac-6180-42a0-ab88-20f7382dd24c
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal
Remove-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4 -RoleDefinitionName Contributor

若要檢視指派的目前角色:

Get-AzureRmRoleAssignment -ResourceGroupName myRG -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
RoleAssignmentId   : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Authorization/roleAssignments/0906bbd8-9982-4c03-8dae-aeaae8b13f9e
Scope              : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG
DisplayName        : MyDemoWebApp
SignInName         :
RoleDefinitionName : Reader
RoleDefinitionId   : acdd72a7-3385-48ef-bd42-f606fba81ae7
ObjectId           : 698138e7-d7b6-4738-a866-b4e3081a69e4
ObjectType         : ServicePrincipal

其他用於角色管理的 Azure PowerShell Cmdlet:

變更安全性主體的認證

檢閱許可權並定期更新密碼是很好的安全性做法。 您也可以在應用程式變更時管理及修改安全性認證。 例如,我們可以藉由建立新密碼並移除舊的密碼,來變更服務主體的密碼。

為服務主體新增密碼

New-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
Secret    : System.Security.SecureString
StartDate : 11/16/2018 12:38:23 AM
EndDate   : 11/16/2019 12:38:23 AM
KeyId     : 6f801c3e-6fcd-42b9-be8e-320b17ba1d36
Type      : Password

取得服務主體的認證清單

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password
5/5/2016 4:55:27 PM 5/5/2017 4:55:27 PM ca9d4846-4972-4c70-b6f5-a4effa60b9bc Password

從服務主體移除舊密碼

Remove-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp -KeyId ca9d4846-4972-4c70-b6f5-a4effa60b9bc
Confirm
Are you sure you want to remove credential with keyId '6f801c3e-6fcd-42b9-be8e-320b17ba1d36' for
service principal objectId '698138e7-d7b6-4738-a866-b4e3081a69e4'.
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

確認服務主體的認證清單

Get-AzureRmADSpCredential -ServicePrincipalName http://MyDemoWebApp
StartDate           EndDate             KeyId                                Type
---------           -------             -----                                ----
3/8/2017 5:58:24 PM 3/8/2018 5:58:24 PM 6f801c3e-6fcd-42b9-be8e-320b17ba1d36 Password

取得服務主體的相關信息

$svcprincipal = Get-AzureRmADServicePrincipal -ObjectId 698138e7-d7b6-4738-a866-b4e3081a69e4
$svcprincipal | Select-Object -Property *
ServicePrincipalNames : {http://MyDemoWebApp, 00c01aaa-1603-49fc-b6df-b78c4e5138b4}
ApplicationId         : 00c01aaa-1603-49fc-b6df-b78c4e5138b4
DisplayName           : MyDemoWebApp
Id                    : 698138e7-d7b6-4738-a866-b4e3081a69e4
Type                  : ServicePrincipal