Bicep:使用 Azure 函数托管标识进行 SQL Server 部署

问题描述 投票:0回答:1

我正在尝试使用二头肌来复制以下场景:

  • 具有单个数据库的 Azure SQL 实例
  • 需要通过托管身份连接到该数据库的 Azure 功能。

就目前情况而言,一旦部署了基础设施,我们就必须使用 SSMS 或类似的工具来添加相关角色:

CREATE USER [functioName] FROM EXTERNAL PROVIDER
ALTER ROLE db_datareader ADD MEMBER [functionName]

我一直在研究一种在二头肌本身内执行此操作的方法,但无法使其工作,我尝试创建具有贡献者角色的用户管理身份,并在包含 powershell 的部署脚本中使用该身份来运行 InvokeSQL反对 dB 但遇到错误。

我不确定这是否是正确的方法,或者这在二头肌中是否可行,所以任何指导将不胜感激。

azure-functions azure-sql-database azure-managed-identity azure-bicep
1个回答
0
投票

我们也为此苦苦挣扎。您可以将基础设施和软件的部署作为两个独立的事情来处理。 然后,您可以选择将数据库迁移作为软件部署管道的一部分。然后,将 sql 用户/角色添加为软件部署的一部分(而不是基础设施部署的一部分)只是一小步。

您可以创建一个如下所示的文件

assign-user-roles.sql

IF NOT EXISTS(SELECT 1 FROM sys.database_principals WHERE name = '<placeholder-for-userid>')
BEGIN
      CREATE USER [<placeholder-for-userid>] FROM EXTERNAL PROVIDER
      ALTER ROLE db_datareader ADD MEMBER [<placeholder-for-userid>]
      ALTER ROLE db_datawriter ADD MEMBER [<placeholder-for-userid>]
END

请注意,您需要

IF NOT EXISTS
,因为您必须仅在用户已存在的情况下创建该用户,否则管道将失败。 软件部署管道 (Azure DevOps) 的一部分应包含以下内容:

  - powershell: |
      (Get-Content $(Build.SourcesDirectory)/pipelines/assign-user-roles.sql -Encoding UTF8).Replace('<placeholder-for-userid>', '${{ parameters.appName }}') | 
        Set-Content $(Build.SourcesDirectory)/pipelines/assign-user-roles.sql
    displayName: 'Add name of managed identity to sql script'           
  - task: SqlAzureDacpacDeployment@1
    displayName: Assign roles to users in database
    inputs:
      azureSubscription: ${{ parameters.azureSubscription }}
      AuthenticationType: 'servicePrincipal'
      ServerName: ${{ parameters.fqnSqlServer }}
      DatabaseName: ${{ parameters.db }}
      deployType: 'SqlTask'
      SqlFile: '$(Build.SourcesDirectory)/pipelines/assign-user-roles.sql'
      IpDetectionMethod: 'AutoDetect'   

关于安全:

  • 管道中使用的服务主体(Azure DevOps 中的服务连接,上面 yaml 中的
    azureSubscription
    )需要 sql 数据库中的权限才能创建用户/角色
  • sqlServer 的(托管)身份需要 directory reader 角色才能从
    EXTERNAL PROVIDER
    (本例中为 Entra ID)读取用户信息。如果您想为 sqlServer 身份赋予此角色作为基础设施部署管道的一部分,您应该考虑将其添加到具有此角色的组中,而不是直接将该角色分配给该身份。
© www.soinside.com 2019 - 2024. All rights reserved.