Руководство. Создание и использование имен входа сервера Microsoft Entra

Применимо: База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics (только выделенные пулы SQL)

В этой статье описывается создание и использование имен входа, поддерживаемых идентификатором Microsoft Entra (ранее Azure Active Directory) в виртуальной master базе данных SQL Azure.

В этом руководстве описано следующее:

  • Создание имени входа Microsoft Entra в виртуальной master базе данных с новым расширением синтаксиса для База данных SQL Azure
  • Создание пользователя, сопоставленного с именем входа Microsoft Entra в виртуальной master базе данных
  • Предоставление ролей сервера пользователю Microsoft Entra
  • Отключение имени входа Microsoft Entra

Примечание.

Субъекты сервера Microsoft Entra (имена входа) в настоящее время находятся в общедоступной предварительной версии для База данных SQL Azure. Управляемый экземпляр SQL Azure уже может использовать имена входа Microsoft Entra.

Необходимые компоненты

Создание имени входа Microsoft Entra

  1. Создайте База данных SQL Azure имя входа для учетной записи Microsoft Entra. В нашем примере мы будем использовать bob@contoso.com это имя в домене Microsoft Entra contoso. Имя входа также можно создать из группы Microsoft Entra или субъекта-службы (приложения). Например, это группа Microsoft Entra, mygroup состоящая из учетных записей Microsoft Entra, которые являются членом этой группы. Дополнительные сведения см. в статье CREATE LOGIN (Transact-SQL).

    Примечание.

    Первое имя входа Microsoft Entra должно быть создано администратором Microsoft Entra. Администратор Microsoft Entra может быть пользователем или группой Microsoft Entra. Имя входа SQL не может создавать имена входа Microsoft Entra.

  2. С помощью SQL Server Management Studio (SSMS) войдите в База данных SQL с помощью учетной записи администратора Microsoft Entra, настроенной для сервера.

  3. Выполните приведенный ниже запрос:

    Use master
    CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER
    GO
    
  4. Проверьте созданное имя для входа в sys.server_principals. Выполните следующий запрос:

    SELECT name, type_desc, type, is_disabled
    FROM sys.server_principals
    WHERE type_desc like 'external%'
    

    Выходные данные должны выглядеть так:

    Name                            type_desc       type   is_disabled
    bob@contoso.com                 EXTERNAL_LOGIN  E      0
    
  5. Имя входа bob@contoso.com было создано в виртуальной master базе данных.

Создание пользователя из имени входа Microsoft Entra

  1. Теперь, когда мы создали имя входа Microsoft Entra, мы можем создать пользователя Microsoft Entra уровня базы данных, сопоставленного с именем входа Microsoft Entra в виртуальной master базе данных. Мы будем продолжать использовать наш пример, чтобы создать пользователя в виртуальной master базе данных, bob@contoso.com так как мы хотим продемонстрировать добавление пользователя в специальные роли. Только администратор Microsoft Entra или администратор SQL Server могут создавать пользователей в виртуальной master базе данных.

  2. Мы используем виртуальную master базу данных, но вы можете переключиться на базу данных, если вы хотите создать пользователей в других базах данных. Выполните следующий запрос.

    Use master
    CREATE USER [bob@contoso.com] FROM LOGIN [bob@contoso.com]
    

    Совет

    Хотя не требуется использовать псевдонимы пользователей Microsoft Entra (например, bob@contoso.com), рекомендуется использовать тот же псевдоним для пользователей Microsoft Entra и имен входа Microsoft Entra.

  3. Проверьте созданного пользователя в sys.database_principals. Выполните следующий запрос:

    SELECT name, type_desc, type
    FROM sys.database_principals
    WHERE type_desc like 'external%'
    

    Выходные данные должны выглядеть так:

    Name                            type_desc       type
    bob@contoso.com                 EXTERNAL_USER   E
    

Примечание.

Существующий синтаксис для создания пользователя Microsoft Entra без имени входа Microsoft Entra по-прежнему поддерживается. При выполнении следующего синтаксиса создается база данных, к которому подключен пользователь в определенной базе данных. Важно отметить, что этот пользователь не связан с каким-либо именем входа, даже если имя входа с тем же именем существует в виртуальной master базе данных.

Например, CREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDER.

Вы можете создать имя входа Microsoft Entra с помощью субъекта-службы с отображаемого имени, отличного от имени. Дополнительные сведения см. в статье microsoft Entra logins and users with nonunique display name

Предоставление ролей на уровне сервера именам входа Microsoft Entra

Можно добавить имена входа в фиксированные роли уровня сервера, например роль ##MS_DefinitionReader#, ##MS_ServerStateReader## или ##MS_ServerStateManager### .

Примечание.

Упомянутые здесь роли уровня сервера не поддерживаются для групп Microsoft Entra.

ALTER SERVER ROLE ##MS_DefinitionReader## ADD MEMBER [AzureAD_object];
ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER [AzureAD_object];
ALTER SERVER ROLE ##MS_ServerStateManager## ADD MEMBER [AzureAD_object];

Разрешения вступают в силу только после повторного подключения пользователя. Также очистите кэш DBCC:

DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS

Чтобы проверить, какие имена входа Microsoft Entra являются частью ролей уровня сервера, выполните следующий запрос:

SELECT roles.principal_id AS RolePID,roles.name AS RolePName,
       server_role_members.member_principal_id AS MemberPID, members.name AS MemberPName
       FROM sys.server_role_members AS server_role_members
       INNER JOIN sys.server_principals AS roles
       ON server_role_members.role_principal_id = roles.principal_id
       INNER JOIN sys.server_principals AS members
       ON server_role_members.member_principal_id = members.principal_id;

Предоставление специальных ролей пользователям Microsoft Entra

Специальные роли для База данных SQL можно назначать пользователям в виртуальной master базе данных.

Чтобы предоставить пользователю одну из специальных ролей базы данных, пользователь должен существовать в виртуальной master базе данных.

Чтобы назначить пользователю роль, можно выполнить следующий запрос:

ALTER ROLE [dbmanager] ADD MEMBER [AzureAD_object]

Чтобы удалить пользователя из роли, выполните следующий запрос:

ALTER ROLE [dbmanager] DROP MEMBER [AzureAD_object]

AzureAD_object может быть пользователем Microsoft Entra, группой или субъектом-службой в идентификаторе Microsoft Entra.

В этом примере мы создали пользователя bob@contoso.com. Давайте назначим пользователю роли dbmanager и loginmanager.

  1. Выполните приведенный ниже запрос:

    ALTER ROLE [dbmanager] ADD MEMBER [bob@contoso.com]
    ALTER ROLE [loginmanager] ADD MEMBER [bob@contoso.com]
    
  2. Проверьте назначение роли базы данных, выполнив следующий запрос:

    SELECT DP1.name AS DatabaseRoleName,
      isnull (DP2.name, 'No members') AS DatabaseUserName
    FROM sys.database_role_members AS DRM
    RIGHT OUTER JOIN sys.database_principals AS DP1
      ON DRM.role_principal_id = DP1.principal_id
    LEFT OUTER JOIN sys.database_principals AS DP2
      ON DRM.member_principal_id = DP2.principal_id
    WHERE DP1.type = 'R'and DP2.name like 'bob%'
    

    Выходные данные должны выглядеть так:

    DatabaseRoleName       DatabaseUserName
    dbmanager              bob@contoso.com
    loginmanager           bob@contoso.com
    

Необязательное отключение имени для входа

Синтаксис DDL ALTER LOGIN (Transact-SQL) можно использовать для включения или отключения имени входа Microsoft Entra в База данных SQL Azure.

ALTER LOGIN [bob@contoso.com] DISABLE

Чтобы изменения DISABLE или ENABLE были применены мгновенно, необходимо очистить кэш аутентификации и кэш TokenAndPermUserStore с помощью следующих команд T-SQL:

DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS

Убедитесь, что имя для входа было отключено, выполнив следующий запрос:

SELECT name, type_desc, type
FROM sys.server_principals
WHERE is_disabled = 1

Вариант использования — разрешить доступ только для чтения к георепликам, но запретить подключение на сервере-источнике.