使用使用者指派的受控識別建立 Azure SQL 受控執行個體
- 發行項
適用於:Azure SQL 受控執行個體
本操作指南概述從 Microsoft Entra ID (先前稱為 Azure Active Directory) 以使用者指派的受控識別建立 Azure SQL 受控執行個體的步驟。 如需在 Azure SQL 資料庫中以使用者指派的受控識別作為伺服器身分識別有何優點的詳細資訊,請參閱適用於 Azure SQL 的 Microsoft Entra 中使用者指派的受控識別。
注意
Microsoft Entra ID 先前稱為 Azure Active Directory (Azure AD)。
必要條件
- 若要以使用者指派的受控識別來佈建 SQL 受控執行個體,需要 SQL 受控執行個體參與者角色 (或具有更高權限的角色),以及包含下列必要動作的 Azure RBAC 角色:
- Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action - 例如,受控識別操作員具有此動作。
- 建立使用者指派的受控識別,並指派必要權限,以作為伺服器身分識別或受控執行個體身分識別。 如需詳細資訊,請參閱管理使用者指派的受控識別和適用於 Azure SQL 的使用者指派受控識別權限。
- 使用 PowerShell 來設定使用者指派的受控識別時,需要 Az.Sql 模組 3.4 或更高版本。
- 需要 Azure CLI 2.26.0 或更高版本,才能使用 Azure CLI 來設定使用者指派的受控識別。
- 有關利用使用者指派的受控識別時的限制和已知問題清單,請參閱適用於 Azure SQL 的 Microsoft Entra 中使用者指派的受控識別
瀏覽至 Azure 入口網站中的 [選取 SQL 部署] 選項頁面。
如果您尚未登入 Azure 入口網站,請在出現提示時登入。
在 [SQL 受控執行個體] 下,將 [資源類型] 設定為 [單一實例],然後選取 [建立]。
針對 [專案詳細資料] 和 [受控執行個體詳細資料],填寫 [基本] 索引標籤上所需的必要資訊。 這是佈建 SQL 受控執行個體所需的最小一組資訊。
如需組態選項的詳細資訊,請參閱快速入門:建立 Azure SQL 受控執行個體。
在 [驗證] 下,選取慣用的驗證模型。 如果您想要設定 [僅限 Microsoft Entra 驗證],請參閱指南。
接下來,瀏覽 [網路] 索引標籤,或保留預設設定。
在 [安全性] 索引標籤的 [身分識別] 下方,選取 [設定身分識別]。
在 [身分識別] 窗格上,選取 [使用者指派的受控識別] 下方的 [新增]。 選取所需的訂用帳戶,然後在 [使用者指派的受控識別] 下,從選取的訂用帳戶選取所需的使用者指派受控識別。 然後選取 [選取] 按鈕。
在 [主要身分識別] 下方,選取上一個步驟中選取的相同使用者指派受控識別。
注意
如果系統指派的受控識別是主要身分識別,則 [主要身分識別] 欄位必須是空的。
選取 [套用]
您可以保留其餘的預設設定。 如需其他索引標籤和設定的詳細資訊,請遵循快速入門:建立 Azure SQL 受控執行個體一文中的指南。
完成設定之後,請選取 [檢閱 + 建立] 以繼續進行。 選取 [建立] 以開始佈建受控執行個體。
Azure CLI 命令 az sql mi create
可用來佈建新的 Azure SQL 受控執行個體。 下列命令會以使用者指派的受控識別來佈建受控執行個體,並啟用僅限 Microsoft Entra 驗證。
注意
指令碼需要建立虛擬網路和子網路作為先決條件。
將自動建立受控執行個體 SQL 系統管理員登入,密碼會設定為隨機密碼。 由於此佈建已停用 SQL 驗證連線,因此不會使用 SQL 系統管理員登入。
佈建完成時,Microsoft Entra 管理員是您為 <AzureADAccount>
設定的帳戶,可用來管理執行個體。
取代範例中的下列值:
<subscriptionId>
:在 Azure 入口網站中可以找到您的訂用帳戶識別碼<ResourceGroupName>
:受控執行個體的資源群組名稱。 資源群組還應包含建立的虛擬網路和子網路<managedIdentity>
:使用者指派的受控識別。 也可以用來作為主要身分識別。<primaryIdentity>
:要用來作為執行個體身分識別的主要身分識別<AzureADAccount>
:可以是 Microsoft Entra 使用者或群組。 例如,DummyLogin
<AzureADAccountSID>
:使用者的 Microsoft Entra 物件 ID<managedinstancename>
:要建立的受控執行個體名稱subnet
參數需要以<subscriptionId>
、<ResourceGroupName>
、<VNetName>
和<SubnetName>
更新。
# Define variables for resources
subscriptionId="<subscriptionId>"
resourceGroupName="<ResourceGroupName>"
managedIdentity="<managedIdentity>"
primaryIdentity="<primaryIdentity>"
AzureADAccount="<AzureADAccount>"
AzureADAccountSID="<AzureADAccountSID>"
VNetName="<VNetName>"
SubnetName="<SubnetName>"
managedinstancename="<managedinstancename>"
# Create a managed instance with a user-assigned managed identity
az sql mi create \
--assign-identity \
--identity-type UserAssigned \
--user-assigned-identity-id "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$managedIdentity" \
--primary-user-assigned-identity-id "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$primaryIdentity" \
--enable-ad-only-auth \
--external-admin-principal-type User \
--external-admin-name $AzureADAccount \
--external-admin-sid $AzureADAccountSID \
-g $resourceGroupName \
-n $managedinstancename \
--subnet "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Network/virtualNetworks/$VNetName/subnets/$SubnetName"
如需詳細資訊,請參閱 az sql mi create。
注意
上述範例只以使用者指派的受控識別來佈建受控執行個體。 您可以將 --identity-type
設定為 UserAssigned,SystemAssigned
,表示想要隨執行個體同時建立這兩種受控識別。
PowerShell 命令 New-AzSqlInstance
用來佈建新的 Azure SQL 受控執行個體。 下列命令會以使用者指派的受控識別來佈建受控執行個體,並啟用僅限 Microsoft Entra 驗證。
注意
指令碼需要建立虛擬網路和子網路作為先決條件。
將自動建立受控執行個體 SQL 系統管理員登入,密碼會設定為隨機密碼。 由於此佈建已停用 SQL 驗證連線,因此不會使用 SQL 系統管理員登入。
佈建完成時,Microsoft Entra 管理員是您為 <AzureADAccount>
設定的帳戶,可用來管理執行個體。
取代範例中的下列值:
<managedinstancename>
:要建立的受控執行個體名稱<ResourceGroupName>
:受控執行個體的資源群組名稱。 資源群組還應包含建立的虛擬網路和子網路<subscriptionId>
:在 Azure 入口網站中可以找到您的訂用帳戶識別碼<managedIdentity>
:使用者指派的受控識別。 也可以用來作為主要身分識別。<primaryIdentity>
:要用來作為執行個體身分識別的主要身分識別<Location>
:受控執行個體的位置,例如West US
或Central US
<AzureADAccount>
:可以是 Microsoft Entra 使用者或群組。 例如,DummyLogin
SubnetId
參數需要以<subscriptionId>
、<ResourceGroupName>
、<VNetName>
和<SubnetName>
更新。
$instanceName = @{
Name = "<managedinstancename>"
ResourceGroupName = "<ResourceGroupName>"
AssignIdentity = $true
IdentityType = "UserAssigned"
UserAssignedIdentityId = "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>"
PrimaryUserAssignedIdentityId = "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<primaryIdentity>"
ExternalAdminName = "<AzureADAccount>"
EnableActiveDirectoryOnlyAuthentication = $true
Location = "<Location>"
SubnetId = "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VNetName>/subnets/<SubnetName>"
LicenseType = "LicenseIncluded"
StorageSizeInGB = 1024
VCore = 16
Edition = "GeneralPurpose"
ComputeGeneration = "Gen5"
}
New-AzSqlInstance @instanceName
如需詳細資訊,請參閱 New-AzSqlInstance。
注意
上述範例只以使用者指派的受控識別來佈建受控執行個體。 您可以將 -IdentityType
設定為 "UserAssigned,SystemAssigned"
,表示想要隨執行個體同時建立這兩種受控識別。
SQL 受管理執行個體 - 建立或更新 REST API 可用來以使用者指派的受控識別建立受控執行個體。
注意
指令碼需要建立虛擬網路和子網路作為先決條件。
下列指令碼會以使用者指派的受控識別來佈建受控執行個體、將 Microsoft Entra 管理員設定為 <AzureADAccount>
,並啟用 [僅限 Microsoft Entra 驗證]。 還會自動建立執行個體 SQL 系統管理員登入,密碼會設定為隨機密碼。 由於此佈建已停用 SQL 驗證連線,因此不會使用 SQL 管理員登入。
佈建完成時,Microsoft Entra 管理員 <AzureADAccount>
可用來管理執行個體。
取代範例中的下列值:
<tenantId>
:前往 Azure 入口網站,然後前往您的 Microsoft Entra ID 資源,即可找到。 在 [概觀] 窗格中,應該會看到您的租用戶 ID<subscriptionId>
您可以在 Azure 入口網站中找到訂閱識別碼<instanceName>
:使用唯一的受控執行個體名稱<ResourceGroupName>
:您邏輯伺服器的資源群組名稱<AzureADAccount>
:可以是 Microsoft Entra 使用者或群組。 例如,DummyLogin
<Location>
:伺服器的位置,例如westus2
或centralus
<objectId>
:前往 Azure 入口網站,然後前往您的 Microsoft Entra ID 資源,即可找到。 在 [使用者] 窗格中,搜尋 Microsoft Entra 使用者並尋找其物件識別碼subnetId
參數需要以<ResourceGroupName>
、Subscription ID
、<VNetName>
和<SubnetName>
更新
Import-Module Azure
Import-Module MSAL.PS
$tenantId = '<tenantId>'
$clientId = '1950a258-227b-4e31-a9cf-717495945fc2' # Static Microsoft client ID used for getting a token
$subscriptionId = '<subscriptionId>'
$uri = "urn:ietf:wg:oauth:2.0:oob"
$instanceName = "<instanceName>"
$resourceGroupName = "<ResourceGroupName>"
$scopes ="https://management.core.windows.net/.default"
Login-AzAccount -tenantId $tenantId
# Login as an Azure AD user with permission to provision a managed instance
$result = Get-MsalToken -RedirectUri $uri -ClientId $clientId -TenantId $tenantId -Scopes $scopes
$authHeader = @{
'Content-Type'='application\json; '
'Authorization'=$result.CreateAuthorizationHeader()
}
$body = '{
"name": "<instanceName>", "type": "Microsoft.Sql/managedInstances", "identity": {"type" : "UserAssigned", "UserAssignedIdentities" : {"/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>" : {}}},"location": "<Location>", "sku": {"name": "GP_Gen5", "tier": "GeneralPurpose", "family":"Gen5","capacity": 8},
"properties": { "PrimaryUserAssignedIdentityId":"/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<primaryIdentity>","administrators":{ "login":"<AzureADAccount>", "sid":"<objectId>", "tenantId":"<tenantId>", "principalType":"User", "azureADOnlyAuthentication":true },
"subnetId": "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VNetName>/subnets/<SubnetName>",
"licenseType": "LicenseIncluded", "vCores": 8, "storageSizeInGB": 2048, "collation": "SQL_Latin1_General_CP1_CI_AS", "proxyOverride": "Proxy", "timezoneId": "UTC", "privateEndpointConnections": [], "storageAccountType": "GRS", "zoneRedundant": false
}
}'
# To provision the instance, execute the `PUT` command
Invoke-RestMethod -Uri https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/managedInstances/$instanceName/?api-version=2020-11-01-preview -Method PUT -Headers $authHeader -Body $body -ContentType "application/json"
若要檢查結果,請執行 GET
命令:
Invoke-RestMethod -Uri https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/managedInstances/$instanceName/?api-version=2020-11-01-preview -Method GET -Headers $authHeader | Format-List
若要佈建使用 Microsoft Entra 管理員、使用者指派的受控識別和僅限 Microsoft Entra 驗證設定的新的虛擬網路、子網路和新的受控執行個體,請使用下列範本。
使用 Azure 入口網站中的自訂部署,然後在編輯器中建置您自己的範本。 接下來,將設定貼進範例之後,加以儲存。
若要取得使用者指派的受控識別資源識別碼,請在 Azure 入口網站中搜尋受控識別。 尋找您的受控識別,並移至 [屬性]。 UMI 資源識別碼的範例看起來像 /subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>
。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.1",
"parameters": {
"managedInstanceName": {
"type": "String",
"metadata": {
"description": "Enter managed instance name."
}
},
"aad_admin_name": {
"type": "String",
"metadata": {
"description": "The name of the Azure AD admin for the SQL managed instance."
}
},
"aad_admin_objectid": {
"type": "String",
"metadata": {
"description": "The Object ID of the Azure AD admin."
}
},
"aad_admin_tenantid": {
"type": "String",
"defaultValue": "[subscription().tenantId]",
"metadata": {
"description": "The Tenant ID of the Azure Active Directory"
}
},
"aad_admin_type": {
"defaultValue": "User",
"allowedValues": [
"User",
"Group",
"Application"
],
"type": "String"
},
"aad_only_auth": {
"defaultValue": true,
"type": "Bool"
},
"user_identity_resource_id": {
"defaultValue": "",
"type": "String",
"metadata": {
"description": "The Resource ID of the user-assigned managed identity, in the form of /subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>."
}
},
"location": {
"defaultValue": "[resourceGroup().location]",
"type": "String",
"metadata": {
"description": "Enter location. If you leave this field blank resource group location would be used."
}
},
"virtualNetworkName": {
"type": "String",
"defaultValue": "SQLMI-VNET",
"metadata": {
"description": "Enter virtual network name. If you leave this field blank name will be created by the template."
}
},
"addressPrefix": {
"defaultValue": "10.0.0.0/16",
"type": "String",
"metadata": {
"description": "Enter virtual network address prefix."
}
},
"subnetName": {
"type": "String",
"defaultValue": "ManagedInstances",
"metadata": {
"description": "Enter subnet name. If you leave this field blank name will be created by the template."
}
},
"subnetPrefix": {
"defaultValue": "10.0.0.0/24",
"type": "String",
"metadata": {
"description": "Enter subnet address prefix."
}
},
"skuName": {
"defaultValue": "GP_Gen5",
"allowedValues": [
"GP_Gen5",
"BC_Gen5"
],
"type": "String",
"metadata": {
"description": "Enter sku name."
}
},
"vCores": {
"defaultValue": 16,
"allowedValues": [
8,
16,
24,
32,
40,
64,
80
],
"type": "Int",
"metadata": {
"description": "Enter number of vCores."
}
},
"storageSizeInGB": {
"defaultValue": 256,
"minValue": 32,
"maxValue": 8192,
"type": "Int",
"metadata": {
"description": "Enter storage size."
}
},
"licenseType": {
"defaultValue": "LicenseIncluded",
"allowedValues": [
"BasePrice",
"LicenseIncluded"
],
"type": "String",
"metadata": {
"description": "Enter license type."
}
}
},
"variables": {
"networkSecurityGroupName": "[concat('SQLMI-', parameters('managedInstanceName'), '-NSG')]",
"routeTableName": "[concat('SQLMI-', parameters('managedInstanceName'), '-Route-Table')]"
},
"resources": [
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2020-06-01",
"name": "[variables('networkSecurityGroupName')]",
"location": "[parameters('location')]",
"properties": {
"securityRules": [
{
"name": "allow_tds_inbound",
"properties": {
"description": "Allow access to data",
"protocol": "Tcp",
"sourcePortRange": "*",
"destinationPortRange": "1433",
"sourceAddressPrefix": "VirtualNetwork",
"destinationAddressPrefix": "*",
"access": "Allow",
"priority": 1000,
"direction": "Inbound"
}
},
{
"name": "allow_redirect_inbound",
"properties": {
"description": "Allow inbound redirect traffic to Managed Instance inside the virtual network",
"protocol": "Tcp",
"sourcePortRange": "*",
"destinationPortRange": "11000-11999",
"sourceAddressPrefix": "VirtualNetwork",
"destinationAddressPrefix": "*",
"access": "Allow",
"priority": 1100,
"direction": "Inbound"
}
},
{
"name": "deny_all_inbound",
"properties": {
"description": "Deny all other inbound traffic",
"protocol": "*",
"sourcePortRange": "*",
"destinationPortRange": "*",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*",
"access": "Deny",
"priority": 4096,
"direction": "Inbound"
}
},
{
"name": "deny_all_outbound",
"properties": {
"description": "Deny all other outbound traffic",
"protocol": "*",
"sourcePortRange": "*",
"destinationPortRange": "*",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*",
"access": "Deny",
"priority": 4096,
"direction": "Outbound"
}
}
]
}
},
{
"type": "Microsoft.Network/routeTables",
"apiVersion": "2020-06-01",
"name": "[variables('routeTableName')]",
"location": "[parameters('location')]",
"properties": {
"disableBgpRoutePropagation": false
}
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2020-06-01",
"name": "[parameters('virtualNetworkName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[variables('routeTableName')]",
"[variables('networkSecurityGroupName')]"
],
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('addressPrefix')]"
]
},
"subnets": [
{
"name": "[parameters('subnetName')]",
"properties": {
"addressPrefix": "[parameters('subnetPrefix')]",
"routeTable": {
"id": "[resourceId('Microsoft.Network/routeTables', variables('routeTableName'))]"
},
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
},
"delegations": [
{
"name": "miDelegation",
"properties": {
"serviceName": "Microsoft.Sql/managedInstances"
}
}
]
}
}
]
}
},
{
"type": "Microsoft.Sql/managedInstances",
"apiVersion": "2020-11-01-preview",
"name": "[parameters('managedInstanceName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[parameters('virtualNetworkName')]"
],
"sku": {
"name": "[parameters('skuName')]"
},
"identity": {
"type": "UserAssigned",
"UserAssignedIdentities": {
"[parameters('user_identity_resource_id')]": {}
}
},
"properties": {
"subnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnetName'))]",
"storageSizeInGB": "[parameters('storageSizeInGB')]",
"vCores": "[parameters('vCores')]",
"licenseType": "[parameters('licenseType')]",
"PrimaryUserAssignedIdentityId": "[parameters('user_identity_resource_id')]",
"administrators": {
"login": "[parameters('aad_admin_name')]",
"sid": "[parameters('aad_admin_objectid')]",
"tenantId": "[parameters('aad_admin_tenantid')]",
"principalType": "[parameters('aad_admin_type')]",
"azureADOnlyAuthentication": "[parameters('aad_only_auth')]"
}
}
}
]
}
相關內容
意見反應
此頁面對您有幫助嗎?