【发布时间】:2022-07-07 01:40:13
【问题描述】:
我正在尝试使用用户分配的托管标识设置 Azure SQL 服务器。我希望能够使用令牌身份验证对这个数据库运行查询,如here 概述的内容。这一切都必须是自动化的,可在多个身份上重复,并在 GitHub 的工作流程中设置。
在设置过程中,我在二头肌中创建了一个 UAMI:
resource uami 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: 'name'
location: location
tags: tags
}
output uamiName string = uami.name
然后,我将此身份以及管理员帐户分配给数据库。我并行使用多个身份验证机制,因为到目前为止我们的大部分工具只接受连接字符串。
但是,在工具支持使用身份的基于令牌的身份验证的情况下,我希望尽可能多地使用它。
var userAssignedManagedIdentityResId = resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', userAssignedIdentityName)
resource sqlServer 'Microsoft.Sql/servers@2021-11-01-preview' = {
name: 'sql-xxx'
location: defaultLocation
tags: tags
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${userAssignedManagedIdentityResId}': {}
}
}
properties: {
primaryUserAssignedIdentityId: userAssignedManagedIdentityResId
administratorLogin: administratorLoginName
administratorLoginPassword: administratorLoginPassword
administrators: {
administratorType: 'ActiveDirectory'
azureADOnlyAuthentication: false
login: sqlAdminLoginName
principalType: 'Application'
sid: sqlAdminClientId
tenantId: tenantId
}
}
}
此处分配的 UAMI 也被 Function App 使用,我希望能够使用令牌身份验证从那里对数据库执行查询。为了实现这一点,我尝试使用命令CREATE USER [Azure_AD_Object] FROM EXTERNAL PROVIDER 将身份添加为用户,正如here 所记录的那样。
要创建此用户,我在我自己的计算机上使用上面分配为管理员的相同主体登录。现在我登录的帐户与服务器上的 Active Directory 管理部分匹配:
然后我运行以下脚本:
#!/usr/bin/env pwsh
Write-Host (Get-AzContext).Account # Prints 'objectid', same as admin on server
$token = (Get-AzAccessToken -ResourceUrl https://database.windows.net).Token
$uamiName="uamiName"
$queryString = "IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name='$uamiName') BEGIN CREATE USER [$uamiName] FROM EXTERNAL PROVIDER; EXEC sp_addrolemember 'db_owner', [$uamiName] END"
$serverInstance = "sql-xxx.database.windows.net"
$database = "sqld-xxx"
Invoke-Sqlcmd -ServerInstance $serverInstance `
-Database $database `
-AccessToken $token `
-QueryTimeout 30 `
-Query $queryString
但是,这失败了:
Invoke-Sqlcmd:
Line |
13 | Invoke-Sqlcmd -ServerInstance $serverInstance `
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Server identity does not have the required permissions to access the MS graph. Please follow the steps here : https://aka.ms/UMI-AzureSQL-permissions
User or role 'uamiName' does not exist in this database.
Msg 37465, Level 16, State 1, Procedure , Line 1.
所以据我了解,something 需要Directory Reader 角色。但是什么?是管理员帐户,还是我尝试添加的托管标识?这是一个巨大的障碍,因为显然这需要为每个需要此角色的托管身份设置一个全局管理员。
然后运行与上面相同的脚本,我可以找到用户:
SELECT * FROM sys.database_principals WHERE name = 'uamiName'
我缺少什么能够使用服务主体来做到这一点?
是需要 Directory Reader 的管理员帐户,还是我尝试使用 CREATE USER [Azure_AD_Object] FROM EXTERNAL PROVIDER 添加的身份?
【问题讨论】:
标签: sql-server azure azure-identity