仅使用 AD 管理员创建 Azure SQL 数据库

Create Azure SQL DB with ONLY AD Administrator

我正在转换我的 Azure SQL 数据库以使用 Active Directory 身份验证。

我已将此代码段添加到我的 ARM 模板中,该模板正确地将管理员设置为 AD 组。到目前为止,一切顺利!

{
  "type": "administrators",
  "name": "activeDirectory",
  "apiVersion": "2014-04-01-preview",
  "location": "[resourceGroup().location]",
  "properties": {
    "administratorType": "ActiveDirectory",
    "login": "[parameters('sql_ad_admin_username')]",
    "sid": "[parameters('sql_ad_admin_objectid')]",
    "tenantId": "[parameters('azure_ad_directory_id')]"
  },
  "dependsOn": [
    "[parameters('sql_db_name')]"
  ]
},

现在我已经开始工作了,我想从 ARM 模板中删除旧的 SQL Server Auth Administrator 详细信息(我想将模板存储在源代码管理中,所以显然没有凭据应该在里面)。

因此,我尝试从文件中删除这些 administratorLoginadministratorLoginPassword 条目(毕竟不再需要它们,我有一个 AD 管理员):

  "properties": {
    "administratorLogin": "admin",
    "administratorLoginPassword": "XXXXXX",
    "version": "12.0"
  },

但是,在删除这些之后,我收到以下错误 运行 模板:

Invalid value given for parameter Login. Specify a valid parameter value.

现在我有点困惑。为什么我不能摆脱这些?我现在使用的是比 SQL 身份验证更安全的 AD 身份验证,但它似乎迫使我设置不太安全的 username/password 管理员登录设置?我怎样才能禁用它?

对于 Azure SQL 数据库,您无法删除初始的 SQL 管理员登录名和密码。这始终是必需的,但是按照您为 AD 管理员参数化 "login"、"sid" 和 "tenantid" 的相同方式,您可以对 "administratorLogin" 和"administratorLoginPassword" 模板中的值。

已显示管理结构 here

根据我的研究,当我们使用 ARM 模板创建 Azure SQL 服务器时,我们没有办法不提供 administratorLogin 和 administratorLoginPassword。详情请参考document

我最终采用的解决方案:

在模板中参数化密码,然后配置参数文件以从 Key Vault 中获取:

"sql_admin_password": {
  "reference": {
    "keyVault": {
      "id": "/subscriptions/XXXXXX-XXXXXXXXX-XXXXXXXX/resourcegroups/MY_RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/MY_KEY_VAULT_NAME"
    },
    "secretName": "SQLDatabaseAdminPassword"
  }
}

这避免了需要在源代码管理中的任何地方或 CI 系统中的任何地方使用密码,这将有必要将其作为显式参数通过管道输入

来源:https://www.anexinet.com/blog/deploying-sql-azure-using-credentials-keyvault/

我也找不到删除 sql 管理员凭据的解决方案。 有一个名为 azureADOnlyAuthentication 的参数添加到 Microsoft.Sql/servers/administrators template"apiVersion": "2019-06-01-preview",但我一直试图在其中放置任何值,但数据库部署因超时而失败。

我喜欢 Vivien Chevallier 的解决方案 suggested - 为 Sql 管理员生成登录名和密码。我根据评论稍微修改了它,还使用随机生成的密码作为前缀。想法是在使用 AD 管理员凭据时省略 sql 管理员凭据参数,因此会生成 sql 管理员凭据,密码不会存储在任何地方,因此无法检索它。模板:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "sqlServerName": {
      "type": "string",
      "metadata": {
        "description": "The name of the SQL Server."
      }
    },
    "sqlServerAdministratorName": {
      "type": "string",
      "metadata": {
        "description": "The name for SQL Server administrator."
      },
      "defaultValue": "[uniqueString(resourceGroup().id, '{24CF6AE7-F4CA-44D7-8FBD-B7F85C0BDDF6}')]"
    },
    "sqlServerAdministratorPassword": {
      "type": "securestring",
      "metadata": {
        "description": "The password for SQL Server administrator."
      },
      "defaultValue": "[concat('C3@TnTAjqVnr', uniqueString(resourceGroup().id, newGuid()), toUpper(uniqueString(resourceGroup().id, newGuid())))]"
    },
    "sqlServerAdministratorADName": {
      "type": "string",
      "metadata": {
        "description": "The name of the AD user/group for SQL Server administrator."
      }
    },
    "sqlServerAdministratorADSid": {
      "type": "string",
      "metadata": {
        "description": "The SID of the AD user/group for SQL Server administrator."
      }
    },
    "transparentDataEncryption": {
      "type": "string",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "defaultValue": "Disabled",
      "metadata": {
        "description": "Enable or disable Transparent Data Encryption (TDE) for the database."
      }
    },
    "databaseName": {
      "type": "string",
      "metadata": {
        "description": "The name for the database."
      }
    },
    "databaseCollation": {
      "type": "string",
      "defaultValue": "SQL_Latin1_General_CP1_CI_AS",
      "metadata": {
        "description": "Database collation"
      }
    },
    "databaseServiceObjectiveName": {
      "type": "string",
      "defaultValue": "Basic",
      "metadata": {
        "description": "The name of the configured service level objective of the database."
      }
    },
    "sqlTier": {
      "type": "string",
      "defaultValue": "Standard"
    },
    "sqlSkuName": {
      "type": "string",
      "defaultValue": "S1"
    }
  },
  "resources": [
    {
      "name": "[parameters('sqlServerName')]",
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2019-06-01-preview",
      "location": "[parameters('location')]",
      "properties": {
        "administratorLogin": "[parameters('sqlServerAdministratorName')]",
        "administratorLoginPassword": "[string(parameters('sqlServerAdministratorPassword'))]"
      },
      "tags": {
        "displayName": "SqlServer"
      },
      "resources": [
        {
          "name": "[concat(parameters('sqlServerName'), '/', 'ActiveDirectory')]",
          "type": "Microsoft.Sql/servers/administrators",
          "apiVersion": "2019-06-01-preview",
          "properties": {
            "administratorType": "ActiveDirectory",
            "login": "[parameters('sqlServerAdministratorADName')]",
            "sid": "[parameters('sqlServerAdministratorADSid')]",
            "tenantId": "[subscription().tenantId]"
          },
          "dependsOn": [
            "[parameters('sqlServerName')]"
          ]
        },
        {
          "name": "[concat(parameters('sqlServerName'), '/', parameters('databaseName'))]",
          "type": "Microsoft.Sql/servers/databases",
          "apiVersion": "2019-06-01-preview",
          "location": "[parameters('location')]",
          "tags": {
            "displayName": "Database"
          },
          "properties": {
            "collation": "[parameters('databaseCollation')]",
            "requestedServiceObjectiveName": "[parameters('databaseServiceObjectiveName')]"
          },
          "sku": {
            "name": "[parameters('sqlSkuName')]",
            "tier": "[parameters('sqlTier')]"
          },
          "dependsOn": [
            "[parameters('sqlServerName')]"
          ],
          "resources": [
            {
              "comments": "Transparent Data Encryption",
              "name": "current",
              "type": "transparentDataEncryption",
              "apiVersion": "2014-04-01",
              "properties": {
                "status": "[parameters('transparentDataEncryption')]"
              },
              "dependsOn": [
                "[parameters('databaseName')]"
              ]
            }
          ]
        }
      ]
    }
  ],
  "outputs": {
    "sqlServerFqdn": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Sql/servers/', parameters('sqlServerName')),'2015-05-01-preview').fullyQualifiedDomainName]"
    },
    "databaseName": {
      "type": "string",
      "value": "[parameters('databaseName')]"
    }
  }
}

生成参数示例:

sqlServerAdministratorName           ka7bwq3hord7a
sqlServerAdministratorPassword       C3@TnTAjqVnrqquzzkrgjp4tuLS645X4JUANDU

Ivan 的建议现在似乎奏效了。
ARM 模板参考:https://docs.microsoft.com/en-us/azure/templates/microsoft.sql/servers?tabs=json

我用这个基本模板测试过,部署成功。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "resources": [
        {
            "type": "Microsoft.Sql/servers",
            "apiVersion": "2020-11-01-preview",
            "name": "<insertResourceGroupName>",
            "location": "<insertLocation>",
            "properties": {
                "administrators": {
                    "login": "<insertLogin>",
                    "sid": "<insertSID>",
                    "tenantId": "[subscription().tenantId]",
                    "principalType": "<Group/User/Application>",
                    "azureADOnlyAuthentication": true
                }
            }
        }
    ]
}