Создание Azure SQL БД с ТОЛЬКО администратором AD - PullRequest
1 голос
/ 08 января 2020

Я в процессе преобразования моей 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')]"
  ]
},

Теперь, когда все заработало, я хочу избавиться от старых SQL подробностей администратора аутентификации сервера из шаблона ARM (и я хочу сохранить шаблон в контроле исходного кода, поэтому, очевидно, в нем не должно быть никаких учетных данных).

Итак, я попытался удалить эти administratorLogin и administratorLoginPassword записи из файла (после того, как они больше не нужны, я вместо этого есть администратор AD):

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

Однако после удаления я получаю следующую ошибку при запуске шаблона:

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

Теперь я немного запутался. Почему я не могу избавиться от них? Сейчас я использую Аутентификацию AD, которая более безопасна, чем SQL Аутентификация, но все же кажется, что мне приходится настраивать менее безопасный логин / пароль для входа в систему администратора? Как я могу отключить это?

Ответы [ 4 ]

0 голосов
/ 23 апреля 2020

Я также не смог найти решение, чтобы избавиться от sql учетных данных администратора. Есть параметр azureADOnlyAuthentication , добавленный к "apiVersion": "2019-06-01-preview" из шаблона Microsoft.Sql / Servers / administrator , но все время, когда я пытался указать какое-либо значение, развертывание БД не выполнялось с таймаутом.

Мне нравится решение , предложенное Вивьеном Шевалье - для создания логина и пароля для Sql Админ. Я немного изменил его на основе комментариев, а также использовал случайный пароль в качестве префикса. Идея состоит в том, чтобы пропустить параметры sql учетных данных администратора при использовании учетных данных администратора AD, чтобы сгенерировались 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
0 голосов
/ 08 января 2020

Согласно моему исследованию, когда мы создаем Azure SQL сервер с шаблоном ARM, у нас нет возможности не предоставлять administratorLogin и administratorLoginPassword. Для более подробной информации, пожалуйста, обратитесь к документу

enter image description here

0 голосов
/ 20 января 2020

Решение, которое я в конечном итоге выбрал:

Параметризация пароля в шаблоне, затем настройка файла параметров для его получения из хранилища ключей:

"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/

0 голосов
/ 08 января 2020

Для Azure SQL База данных, вы не можете избавиться от начальных SQL Администратор логин и пароль. Это всегда требуется, однако, точно так же, как вы настроили параметры «login», «sid» и «tenantid» для администратора AD, вы можете сделать то же самое для значений «administratorLogin» и «administratorLoginPassword» в шаблоне.

Структура администратора показана здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...