Udostępnij za pośrednictwem


Role serwera usługi Azure SQL Database na potrzeby zarządzania uprawnieniami

Dotyczy: Azure SQL Database

W tym artykule opisano stałe role na poziomie serwera w usłudze Azure SQL Database.

Uwaga

Stałe role na poziomie serwera w tym artykule są w publicznej wersji zapoznawczej usługi Azure SQL Database. Te role na poziomie serwera są również częścią wydania programu SQL Server 2022.

Omówienie

W usłudze Azure SQL Database serwer jest koncepcją logiczną i nie można udzielić uprawnień na poziomie serwera. Aby uprościć zarządzanie uprawnieniami, usługa Azure SQL Database udostępnia zestaw stałych ról na poziomie serwera, które ułatwiają zarządzanie uprawnieniami na serwerze logicznym. Role to podmioty zabezpieczeń, które grupują identyfikatory logowania.

Uwaga

Koncepcja ról w tym artykule jest podobna do grup w systemie operacyjnym Windows.

Te specjalne stałe role na poziomie serwera używają prefiksu i sufiksu ##MS_ ## , aby odróżnić się od innych zwykłych podmiotów zabezpieczeń utworzonych przez użytkownika.

Podobnie jak w przypadku lokalnego programu SQL Server, uprawnienia serwera są zorganizowane hierarchicznie. Uprawnienia przechowywane przez te role na poziomie serwera mogą być propagowane do uprawnień bazy danych. Aby uprawnienia były skutecznie przydatne na poziomie bazy danych, identyfikator logowania musi być członkiem roli ##MS_DatabaseConnector##na poziomie serwera, która przyznaje CONNECT wszystkim bazom danych, lub mieć konto użytkownika w poszczególnych bazach danych. Dotyczy to również wirtualnej master bazy danych.

Na przykład rola ##MS_ServerStateReader## na poziomie serwera zawiera uprawnienie VIEW SERVER STATE. Jeśli identyfikator logowania, który jest członkiem tej roli, ma konto użytkownika w bazach danych master i WideWorldImporters, ten użytkownik ma uprawnienia VIEW DATABASE STATE w tych dwóch bazach danych.

Uwaga

Wszelkie uprawnienia mogą zostać odrzucone w bazach danych użytkowników, w efekcie, przesłaniając przyznawanie na całym serwerze za pośrednictwem członkostwa w rolach. Jednak w systemie master bazy danych nie można udzielić ani odmówić uprawnień.

Usługa Azure SQL Database obecnie udostępnia siedem stałych ról serwera. Nie można zmienić uprawnień przyznanych stałych ról serwera, a te role nie mogą mieć innych stałych ról jako członków. Identyfikatory logowania na poziomie serwera można dodawać jako elementy członkowskie do ról na poziomie serwera.

Ważne

Każdy członek stałej roli serwera może dodać inne identyfikatory logowania do tej samej roli.

Aby uzyskać więcej informacji na temat identyfikatorów logowania i użytkowników usługi Azure SQL Database, zobacz Autoryzowanie dostępu bazy danych do usługi SQL Database, wystąpienia zarządzanego SQL i usługi Azure Synapse Analytics.

Stałe role na poziomie serwera

W poniższej tabeli przedstawiono stałe role na poziomie serwera i ich możliwości.

Naprawiono rolę na poziomie serwera opis
##MS_DatabaseConnector## Członkowie stałej ##MS_DatabaseConnector## roli serwera mogą łączyć się z dowolną bazą danych bez konieczności nawiązywania połączenia z kontem użytkownika w bazie danych.

Aby odmówić CONNECT uprawnień do określonej bazy danych, użytkownicy mogą utworzyć zgodne konto użytkownika dla tego identyfikatora logowania w bazie danych, a następnie DENY CONNECT uprawnienia do użytkownika bazy danych. To DENY uprawnienie powoduje zastąpienie GRANT CONNECT uprawnienia pochodzącego z tej roli.
##MS_DatabaseManager## Członkowie stałej ##MS_DatabaseManager## roli serwera mogą tworzyć i usuwać bazy danych. Członek roli tworzącej ##MS_DatabaseManager## bazę danych staje się właścicielem tej bazy danych, co pozwala temu użytkownikowi na łączenie się z bazą dbo danych jako użytkownik. Użytkownik dbo ma wszystkie uprawnienia bazy danych w bazie danych. ##MS_DatabaseManager## Członkowie roli nie muszą mieć uprawnień dostępu do baz danych, których nie posiadają. Należy użyć tej roli serwera w roli na poziomie bazy danych dbmanager , która istnieje w programie master.
##MS_DefinitionReader## Członkowie stałej ##MS_DefinitionReader## roli serwera mogą odczytywać wszystkie widoki wykazu, które są objęte VIEW ANY DEFINITIONprogramem , odpowiednio VIEW DEFINITION w dowolnej bazie danych, w której członek tej roli ma konto użytkownika.
##MS_LoginManager## Członkowie stałej ##MS_LoginManager## roli serwera mogą tworzyć i usuwać identyfikatory logowania. Należy użyć tej roli serwera na poziomie bazy danych loginmanager , która istnieje w systemie master.
##MS_SecurityDefinitionReader## Członkowie stałej ##MS_SecurityDefinitionReader## roli serwera mogą odczytywać wszystkie widoki wykazu, które są objęte VIEW ANY SECURITY DEFINITIONusługą , i mają uprawnienia do dowolnej bazy danych, w której członek tej roli ma VIEW SECURITY DEFINITION konto użytkownika. Jest to niewielki podzbiór tego, do czego ##MS_DefinitionReader## ma dostęp rola serwera.
##MS_ServerStateManager## Członkowie stałej ##MS_ServerStateManager## roli serwera mają takie same uprawnienia jak ##MS_ServerStateReader## rola. Ponadto posiada ALTER SERVER STATE uprawnienie, które umożliwia dostęp do kilku operacji zarządzania, takich jak: DBCC FREEPROCCACHE, , DBCC FREESYSTEMCACHE ('ALL'); DBCC SQLPERF()
##MS_ServerStateReader## Członkowie stałej ##MS_ServerStateReader## roli serwera mogą odczytywać wszystkie dynamiczne widoki zarządzania (DMV) i funkcje objęte VIEW SERVER STATEprogramem , odpowiednio VIEW DATABASE STATE w dowolnej bazie danych, w której członek tej roli ma konto użytkownika.

Uprawnienia stałych ról serwera

Każda stała rola na poziomie serwera ma przypisane pewne uprawnienia. W poniższej tabeli przedstawiono uprawnienia przypisane do ról na poziomie serwera. Przedstawia również uprawnienia na poziomie bazy danych, które są dziedziczone, o ile użytkownik może łączyć się z poszczególnymi bazami danych.

Naprawiono rolę na poziomie serwera Uprawnienia na poziomie serwera Uprawnienia na poziomie bazy danych (jeśli użytkownik bazy danych pasujący do identyfikatora logowania istnieje)
##MS_DatabaseConnector## CONNECT ANY DATABASE CONNECT
##MS_DatabaseManager## CREATE ANY DATABASE, ALTER ANY DATABASE ALTER
##MS_DefinitionReader## VIEW ANY DATABASE, , VIEW ANY DEFINITIONVIEW ANY SECURITY DEFINITION VIEW DEFINITION, VIEW SECURITY DEFINITION
##MS_LoginManager## CREATE LOGIN, ALTER ANY LOGIN Nie dotyczy
##MS_SecurityDefinitionReader## VIEW ANY SECURITY DEFINITION VIEW SECURITY DEFINITION
##MS_ServerStateManager## ALTER SERVER STATE, , VIEW SERVER STATE, , VIEW SERVER PERFORMANCE STATEVIEW SERVER SECURITY STATE VIEW DATABASE STATE, , VIEW DATABASE PERFORMANCE STATEVIEW DATABASE SECURITY STATE
##MS_ServerStateReader## VIEW SERVER STATE, , VIEW SERVER PERFORMANCE STATEVIEW SERVER SECURITY STATE VIEW DATABASE STATE, , VIEW DATABASE PERFORMANCE STATEVIEW DATABASE SECURITY STATE

Uprawnienia

Tylko konto administratora serwera lub konto administratora firmy Microsoft Entra (które może być grupą Microsoft Entra) może dodawać lub usuwać inne identyfikatory logowania do ról serwera lub z nich. Jest to specyficzne dla usługi Azure SQL Database.

Uwaga

Microsoft Entra ID był wcześniej znany jako Azure Active Directory (Azure AD).

Praca z rolami na poziomie serwera

W poniższej tabeli opisano widoki systemowe i funkcje, których można użyć do pracy z rolami na poziomie serwera w usłudze Azure SQL Database.

Funkcja Type Opis
IS_SRVROLEMEMBER Metadane Wskazuje, czy identyfikator logowania SQL jest członkiem określonej roli na poziomie serwera.
sys.server_role_members Metadane Zwraca jeden wiersz dla każdego elementu członkowskiego każdej roli na poziomie serwera.
sys.sql_logins Metadane Zwraca jeden wiersz dla każdego identyfikatora logowania SQL.
ALTER SERVER ROLE Polecenie Zmienia członkostwo roli serwera.

Przykłady

W przykładach w tej sekcji pokazano, jak pracować z rolami na poziomie serwera w usłudze Azure SQL Database.

Odp. Dodawanie identyfikatora logowania SQL do roli na poziomie serwera

Poniższy przykład dodaje identyfikator logowania Jiao SQL do roli ##MS_ServerStateReader##na poziomie serwera . Ta instrukcja musi być uruchamiana w wirtualnej master bazie danych.

ALTER SERVER ROLE ##MS_ServerStateReader##
    ADD MEMBER Jiao;
GO

B. Wyświetlanie listy wszystkich podmiotów zabezpieczeń (uwierzytelnianie SQL), które są członkami roli na poziomie serwera

Poniższa instrukcja zwraca wszystkie elementy członkowskie dowolnej stałej roli na poziomie serwera przy użyciu sys.server_role_members widoków katalogu i sys.sql_logins . Ta instrukcja musi być uruchamiana w wirtualnej master bazie danych.

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

C. Kompletny przykład: Dodawanie identyfikatora logowania do roli na poziomie serwera, pobieranie metadanych dla członkostwa w rolach i uprawnień oraz uruchamianie zapytania testowego

Część 1. Przygotowywanie członkostwa w roli i konta użytkownika

Uruchom to polecenie z wirtualnej master bazy danych.

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

Oto zestaw wyników.

MemberPrincipalID MemberPrincipalName RolePrincipalID RolePrincipalName
------------- ------------- ------------------ -----------
6         Jiao      11            ##MS_ServerStateReader##

Uruchom to polecenie z bazy danych użytkownika.

-- Create a database-User for 'Jiao'
CREATE USER Jiao
FROM LOGIN Jiao;
GO

Część 2. Testowanie członkostwa w roli

Zaloguj się jako identyfikator logowania Jiao i połącz się z bazą danych użytkownika użytą w przykładzie.

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

D. Sprawdzanie ról na poziomie serwera dla logowań firmy Microsoft

Uruchom to polecenie w wirtualnej master bazie danych, aby wyświetlić wszystkie identyfikatory logowania firmy Microsoft, które są częścią ról na poziomie serwera w usłudze SQL Database. Aby uzyskać więcej informacji na temat identyfikatorów logowania do serwera Entra firmy Microsoft, zobacz Microsoft Entra server principals (Podmioty zabezpieczeń serwera Microsoft Entra).

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 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
);

E. Sprawdzanie ról wirtualnej master bazy danych pod kątem określonych identyfikatorów logowania

Uruchom to polecenie w wirtualnej master bazie danych, aby sprawdzić, czy role bob ma, lub zmień wartość tak, aby była zgodna z podmiotem zabezpieczeń.

SELECT DR1.name AS DbRoleName,
    ISNULL(DR2.name, 'No members') AS DbUserName
FROM sys.database_role_members AS DbRMem
RIGHT JOIN sys.database_principals AS DR1
    ON DbRMem.role_principal_id = DR1.principal_id
LEFT JOIN sys.database_principals AS DR2
    ON DbRMem.member_principal_id = DR2.principal_id
WHERE DR1.type = 'R'
    AND DR2.name LIKE 'bob%';

Ograniczenia ról na poziomie serwera

  • Czas podejmowania przypisań ról może potrwać do 5 minut. Ponadto w przypadku istniejących sesji zmiany przypisań ról serwera nie zostaną zastosowane, dopóki połączenie nie zostanie zamknięte i ponownie otwarte. Jest to spowodowane architekturą rozproszoną między bazą master danych a innymi bazami danych na tym samym serwerze logicznym.

    • Obejście częściowe: aby zmniejszyć czas oczekiwania i upewnić się, że przypisania ról serwera są aktualne w bazie danych, administrator serwera lub administrator firmy Microsoft Entra może działać DBCC FLUSHAUTHCACHE w bazach danych użytkowników, na których ma dostęp. Bieżący zalogowanych użytkowników nadal musi ponownie nawiązać połączenie po uruchomieniu DBCC FLUSHAUTHCACHE , aby zmiany członkostwa zaczęły obowiązywać na nich.
  • IS_SRVROLEMEMBER() nie jest obsługiwana master w bazie danych.