Роли сервера Базы данных SQL Azure для управления разрешениями
Примечание
Фиксированные роли уровня сервера в этой статье доступны в общедоступной предварительной версии для Azure SQL Базы данных. Эти роли уровня сервера также входят в выпуск SQL Server 2022.
Область применения: База данных SQL Azure
В Базе данных SQL Azure сервер является логическим понятием, и разрешения невозможно предоставить на уровне сервера. Чтобы упростить управление разрешениями, База данных SQL Azure предоставляет набор предопределенных ролей на уровне сервера, которые помогут вам управлять разрешениями на логическом сервере. Роли — это субъекты безопасности, группирующие имена входа.
Примечание
Роли в этой статье похожи на группы в операционной системе Windows.
В этих специальных предопределенных ролях на уровне сервера используются префиксы ##MS_ и суффикс ##, чтобы их можно было отличить от других обычных созданных пользователями субъектов.
Как и в случае локального SQL Server, разрешения сервера организованы в иерархической структуре. Разрешения, которые имеют эти роли на уровне сервера, могут распространяться на разрешения для базы данных. Чтобы эффективно использовать разрешения на уровне базы данных, имя для входа должно быть членом роли уровня сервера ##MS_DatabaseConnector##, которая предоставляет разрешение CONNECT всем базам данных или содержит учетную запись пользователя в отдельных базах данных. Это также относится к виртуальной базе данных master
.
Например, роль ##MS_ServerStateReader## на уровне сервера имеет разрешение VIEW SERVER STATE (Просмотр состояния сервера). Если у имени входа, которое входит в эту роль, есть учетная запись пользователя в базе данных master
и WideWorldImporters
, у этого пользователя будет разрешение VIEW DATABASE STATE для этих двух баз данных.
Примечание
В пользовательских базах данных может быть отменено любое разрешение путем переопределения разрешения, предоставленного сервером через членство в роли. Однако в базе данных master разрешения нельзя предоставлять и отменять.
Azure SQL База данных в настоящее время предоставляет 7 предопределенных ролей сервера. Разрешения, предоставленные для предопределенных ролей сервера, нельзя изменить, и у этих ролей не может быть других предопределенных ролей в качестве участников. Вы можете добавлять имена входа на уровне сервера в качестве участников ролей на уровне сервера.
Важно!
Каждый член предопределенной роли сервера может добавлять другие имена входа к той же роли.
Дополнительные сведения об именах входа и пользователях Базы данных SQL Azure см. в статье Авторизация доступа к Базе данных SQL, Управляемому экземпляру SQL и Azure Synapse Analytics.
Предопределенных ролей на уровне сервера
В следующей таблице представлены предопределенные роли уровня сервера и их возможности.
Предопределенная роль уровня сервера | Описание |
---|---|
##MS_DatabaseConnector## | Члены предопределенной роли сервера ##MS_DatabaseConnector## могут подключаться к любой базе данных без необходимости подключаться к учетной записи пользователя в базе данных. Чтобы запретить разрешение CONNECT для определенной базы данных, пользователи могут создать соответствующую учетную запись пользователя для этого имени входа в базе данных, а затем ЗАПРЕТИТЬ разрешение CONNECT для пользователя базы данных. Это разрешение DENY переопределяет разрешение GRANT CONNECT, полученное от этой роли. |
##MS_DatabaseManager## | Члены предопределенной роли сервера ##MS_DatabaseManager## могут создавать и удалять базы данных. Член роли ##MS_DatabaseManager##, который создает базу данных, становится ее владельцем, что позволяет ему подключиться к этой базе данных в качестве пользователя dbo . Пользователь dbo имеет все разрешения в этой базе данных. Члены роли ##MS_DatabaseManager##необязательно имеют разрешения на доступ к базам данных, которые им не принадлежат. Рекомендуется использовать эту роль сервера для роли уровня базы данных dbmanager, которая существует в master . |
##MS_DefinitionReader## | Участники предопределенной роли сервера ##MS_DefinitionReader## могут просматривать все представления каталога, доступ к которым предоставляется разрешением VIEW ANY DEFINITION (Просмотр любого определения), соответственно VIEW DEFINITION (Просмотр определения) для любой базы данных, в которой у участника этой роли есть учетная запись пользователя. |
##MS_LoginManager## | Члены предопределенной роли сервера ##MS_DatabaseManager## могут создавать и удалять базы данных. Рекомендуется использовать эту роль сервера для роли уровня базы данных loginmanager, которая существует в master . |
##MS_SecurityDefinitionReader## | Участники предопределенной роли сервера ##MS_SecurityDefinitionReader## могут просматривать все представления каталога, доступ к которым предоставляется разрешением VIEW ANY SECURITY DEFINITION (Просмотр любого определения безопасности) и, соответственно, имеет разрешение VIEW SECURITY DEFINITION (Просмотр определения безопасности) для любой базы данных, в которой у участника этой роли есть учетная запись пользователя. Это небольшое подмножество того, к чему имеет доступ роль сервера ##MS_DefinitionReader##. |
##MS_ServerStateReader## | Участники предопределенной роли сервера ##MS_ServerStateReader## могут просматривать все динамические административные представления и функции, доступ к которым предоставляется разрешением VIEW SERVER STATE (Просмотр состояния сервера), соответственно VIEW DATABASE STATE (Просмотр состояния базы данных) для любой базы данных, в которой у участника этой роли есть учетная запись пользователя. |
##MS_ServerStateManager## | У участников предопределенной роли сервера ##MS_ServerStateManager## есть те же разрешения, что и у роли ##MS_ServerStateReader##. Кроме того, в ней есть разрешение ALTER SERVER STATE (Изменение состояния сервера), которое обеспечивает доступ к нескольким операциям управления, таким как DBCC FREEPROCCACHE , DBCC FREESYSTEMCACHE ('ALL') , DBCC SQLPERF() . |
Разрешения предопределенных ролей сервера
Каждая предопределенная роль уровня сервера имеет определенные разрешения, назначенные ему. В следующей таблице показаны разрешения, назначенные ролям на уровне сервера. В нем также отображаются разрешения уровня базы данных, которые наследуются до тех пор, пока пользователь может подключиться к отдельным базам данных.
Предопределенная роль уровня сервера | Разрешения уровня серверов | Разрешения на уровне базы данных (если существуют пользователь базы данных, совпадающий с именем входа) |
---|---|---|
##MS_DatabaseConnector## | CONNECT ANY DATABASE | CONNECT |
##MS_DatabaseManager## | CREATE ANY DATABASE ALTER ANY DATABASE |
ALTER |
##MS_DefinitionReader## | VIEW ANY DATABASE (Просмотр любой базы данных), VIEW ANY DEFINITION (Просмотр любого определения), VIEW ANY SECURITY DEFINITION (Просмотр любого определения безопасности) | VIEW DEFINITION (Просмотр определения), VIEW SECURITY DEFINITION (Просмотр определения безопасности) |
##MS_LoginManager## | CREATE LOGIN ALTER ANY LOGIN |
Н/Д |
##MS_SecurityDefinitionReader## | ПРОСМОТР ВСЕХ ОПРЕДЕЛЕНИЙ БЕЗОПАСНОСТИ | ПРОСМОТР ОПРЕДЕЛЕНИЯ БЕЗОПАСНОСТИ |
##MS_ServerStateReader## | VIEW SERVER STATE (Просмотр состояния сервера), VIEW SERVER PERFORMANCE STATE (Просмотр состояния производительности сервера), VIEW SERVER SECURITY STATE (Просмотр состояния безопасности сервера) | VIEW DATABASE STATE (Просмотр состояния базы данных), VIEW DATABASE PERFORMANCE STATE (Просмотр состояния производительности базы данных), VIEW DATABASE SECURITY STATE (Просмотр состояния безопасности базы данных) |
##MS_ServerStateManager## | ALTER SERVER STATE (Изменение состояния сервера), VIEW SERVER STATE (Просмотр состояния сервера), VIEW SERVER PERFORMANCE STATE (Просмотр состояния производительности сервера), VIEW SERVER SECURITY STATE (Просмотр состояния безопасности сервера) | VIEW DATABASE STATE (Просмотр состояния базы данных), VIEW DATABASE PERFORMANCE STATE (Просмотр состояния производительности базы данных), VIEW DATABASE SECURITY STATE (Просмотр состояния безопасности базы данных) |
Работа с ролями на уровне сервера
В следующей таблице описаны представления системы и функции, предназначенные для работы с ролями на уровне сервера в Базе данных SQL Azure.
Компонент | Тип | Описание |
---|---|---|
Функция IS_SRVROLEMEMBER (Transact-SQL) | Метаданные | Указывает, является ли имя входа SQL членом указанной роли уровня сервера. |
sys.server_role_members (Transact-SQL) | Метаданные | Возвращает одну строку для каждого члена каждой роли уровня сервера. |
sys.sql_logins (Transact-SQL) | Метаданные | Возвращает по одной строке для каждого имени входа SQL. |
ALTER SERVER ROLE (Transact-SQL) | Команда | Изменяет членство роли сервера. |
Примеры
Примеры в этом разделе показывают, как работать с ролями на уровне сервера в Базе данных SQL Azure.
A. Добавление имени входа SQL в роль на уровне сервера
В следующем примере имя входа SQL "Jiao" добавляется к роли сервера ##MS_ServerStateReader##. Эту инструкцию необходимо выполнить в виртуальной базе данных master
.
ALTER SERVER ROLE ##MS_ServerStateReader##
ADD MEMBER Jiao;
GO
Б. Перечисление всех субъектов (проверка подлинности SQL), которые являются членами роли на уровне сервера
Следующая инструкция возвращает всех участников любой предопределенной роли на уровне сервера с помощью представлений каталога sys.server_role_members
и sys.sql_logins
. Эту инструкцию необходимо выполнить в виртуальной базе данных master
.
SELECT
sql_logins.principal_id AS MemberPrincipalID
, sql_logins.name AS MemberPrincipalName
, roles.principal_id AS RolePrincipalID
, roles.name AS RolePrincipalName
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.sql_logins AS sql_logins
ON server_role_members.member_principal_id = sql_logins.principal_id
;
GO
В. Полный пример: добавление имени входа в роль на уровне сервера, получение метаданных для участия в роли и разрешений, а также запуск тестового запроса
Часть 1. Подготовка членства в роли и учетной записи пользователя
Запустите эту команду из виртуальной базы данных master
.
ALTER SERVER ROLE ##MS_ServerStateReader##
ADD MEMBER Jiao
-- check membership in metadata:
select IS_SRVROLEMEMBER('##MS_ServerStateReader##', 'Jiao')
--> 1 = Yes
SELECT
sql_logins.principal_id AS MemberPrincipalID
, sql_logins.name AS MemberPrincipalName
, roles.principal_id AS RolePrincipalID
, roles.name AS RolePrincipalName
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.sql_logins AS sql_logins
ON server_role_members.member_principal_id = sql_logins.principal_id
;
GO
Вот результирующий набор.
MemberPrincipalID MemberPrincipalName RolePrincipalID RolePrincipalName
------------- ------------- ------------------ -----------
6 Jiao 11 ##MS_ServerStateReader##
Запустите эту команду из пользовательской базы данных.
-- Creating a database-User for 'Jiao'
CREATE USER Jiao
FROM LOGIN Jiao
;
GO
Часть 2. Тестирование членства в роли
Войдите в систему с именем входа Jiao
и подключитесь к пользовательской базе данных, используемой в примере.
-- retrieve server-level permissions of currently logged on User
SELECT * FROM sys.fn_my_permissions(NULL, 'Server')
;
-- check server-role membership for `##MS_ServerStateReader##` of currently logged on User
SELECT USER_NAME(), IS_SRVROLEMEMBER('##MS_ServerStateReader##')
--> 1 = Yes
-- Does the currently logged in User have the `VIEW DATABASE STATE`-permission?
SELECT HAS_PERMS_BY_NAME(NULL, 'DATABASE', 'VIEW DATABASE STATE');
--> 1 = Yes
-- retrieve database-level permissions of currently logged on User
SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE')
GO
-- example query:
SELECT * FROM sys.dm_exec_query_stats
--> will return data since this user has the necessary permission
Г. Проверка ролей уровня сервера для имен входа AAD
Выполните эту команду в виртуальной базе данных master
, чтобы получить все имена входа AAD, которые являются членами ролей на уровне сервера в База данных SQL. Дополнительные сведения об именах входа на сервере AAD см. в статье Субъекты сервера Azure Active Directory.
SELECT
member.principal_id AS MemberPrincipalID
, member.name AS MemberPrincipalName
, roles.principal_id AS RolePrincipalID
, roles.name AS RolePrincipalName
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 member
ON server_role_members.member_principal_id = member.principal_id
LEFT OUTER JOIN sys.sql_logins AS sql_logins
ON server_role_members.member_principal_id = sql_logins.principal_id
WHERE member.principal_id NOT IN (-- prevent SQL Logins from interfering with resultset
SELECT principal_id FROM sys.sql_logins AS sql_logins
WHERE member.principal_id = sql_logins.principal_id)
;
Д. Проверка ролей в виртуальной базе данных master для конкретных имен входа
Выполните эту команду в виртуальной базе данных master
, чтобы проверить назначенные для роли bob
, или укажите другое значение для конкретного субъекта.
SELECT DR1.name AS DbRoleName, isnull (DR2.name, 'No members') AS DbUserName
FROM sys.database_role_members AS DbRMem RIGHT OUTER JOIN sys.database_principals AS DR1
ON DbRMem.role_principal_id = DR1.principal_id LEFT OUTER JOIN sys.database_principals AS DR2
ON DbRMem.member_principal_id = DR2.principal_id
WHERE DR1.type = 'R' and DR2.name like 'bob%'
Ограничения ролей на уровне сервера
Назначение ролей может занимать до 5 минут. Кроме того, для существующих сеансов изменения назначений ролей на уровне сервера не вступают в силу, пока подключение не будет закрыто и снова открыто. Это связано с распределенной архитектурой между базой данных
master
и другими базами данных на том же логическом сервере.- Частичное решение: чтобы сократить период ожидания и убедиться, что назначения ролей на уровне сервера в базе данных актуальны, администратор сервера или администратор Azure AD может выполнить
DBCC FLUSHAUTHCACHE
в пользовательских базах данных, к которым у имени входа есть доступ. Пользователи, выполнившие вход, все равно должны повторно подключиться после выполненияDBCC FLUSHAUTHCACHE
, чтобы изменения членства вступили в силу.
- Частичное решение: чтобы сократить период ожидания и убедиться, что назначения ролей на уровне сервера в базе данных актуальны, администратор сервера или администратор Azure AD может выполнить
IS_SRVROLEMEMBER()
не поддерживается в базе данныхmaster
.