【问题标题】:Azure SQL server user assigned managed identity and external user automationAzure SQL Server 用户分配的托管标识和外部用户自动化
【发布时间】: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


    【解决方案1】:

    您是否在某处调用 Microsoft Graph API?正如这指出的那样,您需要授予给定角色的权限。如果我错了,请纠正我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 2021-08-31
      • 2022-01-07
      • 2021-01-28
      • 2019-09-19
      • 2021-11-20
      • 2021-07-26
      • 2021-12-28
      相关资源
      最近更新 更多