You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ARM模板自动配置应用服务主体实现数据库集成安全?

我来帮你搞定这个端到端的自动化部署需求——用ARM模板从零搭建环境,自动配置服务主体,让应用通过AAD安全连接数据库,全程零手动操作。下面是具体的实现思路和关键步骤:

一、核心逻辑梳理

整个流程的核心是让ARM模板串联起三个关键环节:创建应用服务(及配套资源)、自动生成/关联AAD服务主体、配置数据库的AAD访问权限。这里有两种主流的服务主体实现方式,我都会给你讲清楚。

二、ARM模板关键组件拆解

1. 自动生成服务主体的两种方式

方式一:系统分配托管标识(推荐,更安全)

这种方式最简单,也最符合安全最佳实践。在ARM模板定义应用服务时,只需开启SystemAssigned标识,Azure会自动为这个应用服务创建专属的服务主体,而且全程托管密钥的生命周期,不用你手动维护密码。

示例代码片段:

{
  "type": "Microsoft.Web/sites",
  "apiVersion": "2022-09-01",
  "name": "[parameters('appServiceName')]",
  "location": "[parameters('location')]",
  // 开启系统分配托管标识,自动创建服务主体
  "identity": {
    "type": "SystemAssigned"
  },
  "properties": {
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
    "siteConfig": {
      "appSettings": [
        {
          "name": "DB_SERVER",
          "value": "[concat(parameters('sqlServerName'), '.database.windows.net')]"
        },
        {
          "name": "DB_NAME",
          "value": "[parameters('sqlDbName')]"
        }
      ]
    }
  },
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]"
  ]
}

方式二:手动创建应用注册(生成服务主体)

如果你需要自定义服务主体的属性(比如标识符URI、重定向地址),可以在ARM模板中直接定义Microsoft.AAD/applicationRegistrations资源,部署时Azure会自动创建应用注册和对应的服务主体。

示例代码片段:

{
  "type": "Microsoft.AAD/applicationRegistrations",
  "apiVersion": "2021-04-01",
  "name": "[parameters('appRegistrationName')]",
  "properties": {
    "displayName": "[parameters('appRegistrationName')]",
    "web": {
      "redirectUris": ["https://localhost"]
    }
  }
}

⚠️ 注意:部署这个资源需要你有AAD的应用管理员或全局管理员权限,不然会报错。

2. 配置应用服务与服务主体的关联

如果用方式一(系统托管标识),应用服务会自动关联对应的服务主体,你只需要在应用设置里配置数据库的基本信息就行。

如果用方式二(手动应用注册),你需要把服务主体的客户端ID和生成的密钥配置到应用服务的应用设置中。可以用ARM模板的listPasswords函数获取应用注册的密钥:

{
  "name": "CLIENT_SECRET",
  "value": "[listPasswords(resourceId('Microsoft.AAD/applicationRegistrations', parameters('appRegistrationName')), '2021-04-01').passwords[0].secretText]"
}

3. 自动配置数据库的AAD访问权限

光有服务主体还不够,得给它配置数据库的访问权限。ARM模板本身没法直接操作SQL数据库的用户权限,所以我们可以用**部署脚本(Deployment Scripts)**来执行PowerShell命令,自动完成用户创建和权限赋值。

示例部署脚本(针对系统托管标识):

{
  "type": "Microsoft.Resources/deploymentScripts",
  "apiVersion": "2020-10-01",
  "name": "configureSqlAadPermissions",
  "location": "[parameters('location')]",
  "kind": "AzurePowerShell",
  "properties": {
    "azPowerShellVersion": "7.2",
    "scriptContent": "
      # 获取应用服务的托管标识信息
      $appServicePrincipalId = '[reference(resourceId('Microsoft.Web/sites', parameters('appServiceName'))).identity.principalId]'
      $appServiceIdentity = Get-AzADServicePrincipal -ObjectId $appServicePrincipalId
      
      # 获取SQL服务器信息
      $sqlServer = Get-AzSqlServer -ResourceGroupName '[resourceGroup().name]' -ServerName '[parameters('sqlServerName')]'
      
      # 在SQL数据库中创建AAD用户
      $createUserQuery = \"CREATE USER [$($appServiceIdentity.DisplayName)] FROM EXTERNAL PROVIDER;\"
      Invoke-SqlCmd -ServerInstance $sqlServer.FullyQualifiedDomainName -Database '[parameters('sqlDbName')]' -Query $createUserQuery -Authentication ActiveDirectoryDefault
      
      # 赋予用户读写权限
      $grantPermissionsQuery = \"ALTER ROLE db_datareader ADD MEMBER [$($appServiceIdentity.DisplayName)]; ALTER ROLE db_datawriter ADD MEMBER [$($appServiceIdentity.DisplayName)];\"
      Invoke-SqlCmd -ServerInstance $sqlServer.FullyQualifiedDomainName -Database '[parameters('sqlDbName')]' -Query $grantPermissionsQuery -Authentication ActiveDirectoryDefault
    ",
    "cleanupPreference": "OnSuccess",
    "timeout": "PT1H",
    "dependsOn": [
      "[resourceId('Microsoft.Web/sites', parameters('appServiceName'))]",
      "[resourceId('Microsoft.Sql/servers/databases', parameters('sqlServerName'), parameters('sqlDbName'))]"
    ]
  }
}

⚠️ 注意:执行这个脚本的账户需要有SQL服务器的管理员权限,以及读取AAD服务主体的权限。

三、完整部署流程
  1. 准备ARM模板:把应用服务计划、应用服务、SQL服务器、SQL数据库、部署脚本这些资源整合到一个模板里(用Bicep语法会更简洁易读,不过ARM JSON也完全没问题)。
  2. 执行部署:用Azure CLI或PowerShell运行部署命令,比如:
az deployment group create --resource-group <你的资源组名称> --template-file ./main.json --parameters appServiceName=<你的应用名称> sqlServerName=<你的SQL服务器名称> sqlDbName=<你的数据库名称>
  1. 验证连接:部署完成后,你的应用就可以通过AAD认证连接数据库了,比如在代码中使用ActiveDirectoryDefault认证方式,不需要硬编码任何密码。
四、关键注意事项
  • 权限要求:执行部署的账户需要足够的权限,比如创建应用服务、SQL资源的权限,以及对应的AAD和SQL管理权限。
  • 安全优先:尽量用系统分配的托管标识,避免手动维护服务主体的密钥,减少安全风险。
  • 部署脚本优化:可以给部署脚本配置自己的托管标识,避免用部署账户的权限执行,进一步提升安全性。

内容的提问来源于stack exchange,提问作者user9314395

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:16:57