İzin yönetimi için sunucu rollerini Azure SQL Veritabanı

Şunlar için geçerlidir: Azure SQL Veritabanı

Bu makalede, Azure SQL Veritabanı'daki sabit sunucu düzeyinde roller açıklanmaktadır.

Not

Bu makaledeki sabit sunucu düzeyindeki roller Azure SQL Veritabanı için genel önizleme aşamasındadır. Bu sunucu düzeyindeki roller, SQL Server 2022 sürümünün de bir parçasıdır.

Genel bakış

Azure SQL Veritabanı'de sunucu mantıksal bir kavramdır ve izinler sunucu düzeyinde verilemiyor. İzin yönetimini basitleştirmek için Azure SQL Veritabanı, mantıksal sunucu üzerindeki izinleri yönetmenize yardımcı olacak bir dizi sabit sunucu düzeyinde rol sağlar. Roller, oturum açma bilgilerini gruplayan güvenlik sorumlularıdır.

Not

Bu makaledeki roller kavramı, Windows işletim sistemindeki gruplara benzer.

Bu özel sabit sunucu düzeyindeki roller, kullanıcı tarafından oluşturulan diğer normal sorumlulardan ayırt etmek için ön eki ##MS_ ve son eki ## kullanır.

Şirket içi SQL Server gibi sunucu izinleri de hiyerarşik olarak düzenlenir. Bu sunucu düzeyindeki roller tarafından tutulan izinler veritabanı izinlerine yayılabilir. İzinlerin veritabanı düzeyinde etkili bir şekilde yararlı olması için, oturum açma bilgilerinin tüm veritabanlarına veren CONNECT sunucu düzeyinde rolüne ##MS_DatabaseConnector##üye olması veya tek tek veritabanlarında bir kullanıcı hesabına sahip olması gerekir. Bu, sanal master veritabanı için de geçerlidir.

Örneğin, sunucu düzeyindeki rol ##MS_ServerStateReader## iznine VIEW SERVER STATEsahiptir. Bu rolün üyesi olan bir oturum açma işleminin ve veritabanlarında master bir kullanıcı hesabı varsa, bu kullanıcının bu iki veritabanında izni VIEW DATABASE STATE vardır.WideWorldImporters

Not

Kullanıcı veritabanlarında, rol üyeliği aracılığıyla sunucu genelindeki izni geçersiz kılarak tüm izinler reddedilebilir. Ancak, sistem veritabanı yöneticisinde izinler verilemiyor veya reddedilemiyor.

Azure SQL Veritabanı şu anda yedi sabit sunucu rolü sağlar. Sabit sunucu rollerine verilen izinler değiştirilemez ve bu rollerin üye olarak başka sabit rolleri olamaz. Sunucu düzeyinde oturum açma bilgilerini sunucu düzeyindeki rollere üye olarak ekleyebilirsiniz.

Önemli

Sabit bir sunucu rolünün her üyesi aynı role başka oturum açma bilgileri ekleyebilir.

Azure SQL Veritabanı oturum açma bilgileri ve kullanıcılar hakkında daha fazla bilgi için bkz. SQL Veritabanı, SQL Yönetilen Örneği ve Azure Synapse Analytics'e veritabanı erişimini yetkilendirme.

Sunucu düzeyinde roller düzeltildi

Aşağıdaki tabloda sabit sunucu düzeyindeki roller ve bunların özellikleri gösterilmektedir.

Sunucu düzeyinde rol düzeltildi Açıklama
##MS_DatabaseConnector## Sabit sunucu rolünün ##MS_DatabaseConnector## üyeleri, veritabanındaki bir Kullanıcı hesabının bağlanmasına gerek kalmadan herhangi bir veritabanına bağlanabilir.

Kullanıcılar, belirli bir veritabanının iznini CONNECT reddetmek için veritabanında bu oturum açma için eşleşen bir kullanıcı hesabı ve ardından DENY CONNECT veritabanı-kullanıcı izni oluşturabilir. Bu DENY izin, bu rolden gelen izni geçersiz kıldırıyor GRANT CONNECT .
##MS_DatabaseManager## Sabit sunucu rolünün ##MS_DatabaseManager## üyeleri veritabanları oluşturabilir ve silebilir. Veritabanı oluşturan rolün ##MS_DatabaseManager## bir üyesi, bu veritabanının sahibi olur ve bu da kullanıcının bu veritabanına kullanıcı olarak bağlanmasına dbo olanak tanır. Kullanıcının dbo veritabanındaki tüm veritabanı izinleri vardır. Rolün ##MS_DatabaseManager## üyelerinin sahip olmadığı veritabanlarına erişme izni olması gerekmez. bu sunucu rolünü içinde mastervar olan dbmanager veritabanı düzeyi rolü üzerinde kullanmalısınız.
##MS_DefinitionReader## Sabit sunucu rolünün ##MS_DefinitionReader## üyeleri, bu rolün üyesinin VIEW ANY DEFINITIONkullanıcı hesabına sahip olduğu tüm veritabanlarında sırasıyla VIEW DEFINITION kapsamındaki tüm katalog görünümlerini okuyabilir.
##MS_LoginManager## Sabit sunucu rolünün ##MS_LoginManager## üyeleri oturum açma bilgileri oluşturabilir ve silebilir. bu sunucu rolünü içinde mevcut masterolan loginmanager veritabanı düzeyi rolü üzerinde kullanmalısınız.
##MS_SecurityDefinitionReader## Sabit sunucu rolünün ##MS_SecurityDefinitionReader## üyeleri, kapsamındaki VIEW ANY SECURITY DEFINITIONtüm katalog görünümlerini okuyabilir ve sırasıyla bu rolün üyesinin kullanıcı hesabına sahip VIEW SECURITY DEFINITION olduğu tüm veritabanlarında izni vardır. Bu, sunucu rolünün erişimi olan ##MS_DefinitionReader## şeyin küçük bir alt kümesidir.
##MS_ServerStateManager## Sabit sunucu rolünün ##MS_ServerStateManager## üyeleri rolle aynı izinlere ##MS_ServerStateReader## sahiptir. Ayrıca, şu gibi çeşitli yönetim işlemlerine erişim sağlayan iznini de barındırıyor ALTER SERVER STATE : DBCC FREEPROCCACHE, DBCC FREESYSTEMCACHE ('ALL'), DBCC SQLPERF();
##MS_ServerStateReader## Sabit sunucu rolünün üyeleri, bu rolün ##MS_ServerStateReader## üyesinin kullanıcı hesabına sahip olduğu tüm veritabanlarında sırasıyla VIEW DATABASE STATE kapsamındaki tüm dinamik yönetim görünümlerini (DMV) ve işlevleri VIEW SERVER STATEokuyabilir.

Sabit sunucu rollerinin izinleri

Her sabit sunucu düzeyinde rolün kendisine atanmış belirli izinleri vardır. Aşağıdaki tabloda sunucu düzeyindeki rollere atanan izinler gösterilmektedir. Ayrıca, kullanıcı tek tek veritabanlarına bağlanabildiği sürece devralınan veritabanı düzeyinde izinleri de gösterir.

Sunucu düzeyinde rol düzeltildi Sunucu düzeyinde izinler Veritabanı düzeyinde izinler (oturum açma bilgileriyle eşleşen bir veritabanı kullanıcısı varsa)
##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 Yok
##MS_SecurityDefinitionReader## VIEW ANY SECURITY DEFINITION VIEW SECURITY DEFINITION
##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
##MS_ServerStateReader## VIEW SERVER STATE, VIEW SERVER PERFORMANCE STATE, VIEW SERVER SECURITY STATE VIEW DATABASE STATE, VIEW DATABASE PERFORMANCE STATE, VIEW DATABASE SECURITY STATE

İzinler

Yalnızca sunucu yönetici hesabı veya Microsoft Entra yönetici hesabı (Microsoft Entra grubu olabilir) sunucu rollerine veya sunucu rollerinden diğer oturum açma bilgilerini ekleyebilir veya kaldırabilir. Bu, Azure SQL Veritabanı özgüdür.

Not

Microsoft Entra Id daha önce Azure Active Directory (Azure AD) olarak biliniyordu.

Sunucu düzeyindeki rollerle çalışma

Aşağıdaki tabloda sistem görünümleri ve Azure SQL Veritabanı sunucu düzeyindeki rollerle çalışmak için kullanabileceğiniz işlevler açıklanmaktadır.

Özellik Type Açıklama
IS_SRVROLEMEMBER Meta veri SQL oturum açma bilgilerinin belirtilen sunucu düzeyindeki rolün üyesi olup olmadığını gösterir.
sys.server_role_members Meta veri Sunucu düzeyindeki her rolün her üyesi için bir satır döndürür.
sys.sql_logins Meta veri Her SQL oturumu için bir satır döndürür.
ALTER SERVER ROLE Command Sunucu rolünün üyeliğini değiştirir.

Örnekler

Bu bölümdeki örneklerde, Azure SQL Veritabanı'da sunucu düzeyindeki rollerle çalışma gösterilmektedir.

A. Sunucu düzeyinde bir role SQL oturum açma bilgisi ekleme

Aşağıdaki örnek SQL oturum açma bilgilerini Jiao sunucu düzeyinde rolüne ##MS_ServerStateReader##ekler. Bu deyimin sanal master veritabanında çalıştırılması gerekir.

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

B. Sunucu düzeyinde bir rolün üyesi olan tüm sorumluları (SQL kimlik doğrulaması) listeleme

Aşağıdaki deyim, ve sys.sql_logins katalog görünümlerini kullanarak herhangi bir sabit sunucu düzeyinde rolün tüm üyelerini sys.server_role_members döndürür. Bu deyimin sanal master veritabanında çalıştırılması gerekir.

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. Tam örnek: Sunucu düzeyinde bir role oturum açma bilgisi ekleme, rol üyeliği ve izinleri için meta verileri alma ve test sorgusu çalıştırma

Bölüm 1: Rol üyeliğini ve kullanıcı hesabını hazırlama

Bu komutu sanal master veritabanından çalıştırın.

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

Sonuç kümesi aşağıdadır.

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

Bu komutu bir kullanıcı veritabanından çalıştırın.

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

Bölüm 2: Rol üyeliğini test etme

Oturum açma olarak oturum açın Jiao ve örnekte kullanılan kullanıcı veritabanına bağlanın.

-- 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. Microsoft Entra oturum açma bilgileri için sunucu düzeyinde rolleri denetleme

SQL Veritabanı sunucu düzeyindeki rollerin parçası olan tüm Microsoft Entra oturum açma bilgilerini görmek için sanal master veritabanında bu komutu çalıştırın. Microsoft Entra sunucusu oturum açma bilgileri hakkında daha fazla bilgi için bkz . Microsoft Entra sunucu sorumluları.

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. Belirli oturum açma işlemleri için sanal master veritabanı rollerini denetleyin

Rollerin bob sahip olup olmadığını denetlemek için sanal master veritabanında bu komutu çalıştırın veya değeri sorumlunuzla eşleşecek şekilde değiştirin.

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%';

Sunucu düzeyinde rollerin sınırlamaları

  • Rol atamalarının etkili olması 5 dakika kadar sürebilir. Ayrıca mevcut oturumlarda, sunucu rolü atamalarında yapılan değişiklikler, bağlantı kapatılıp yeniden açılana kadar geçerli olmaz. Bunun nedeni veritabanı ile aynı mantıksal sunucudaki master diğer veritabanları arasındaki dağıtılmış mimaridir.

    • Kısmi geçici çözüm: Bekleme süresini kısaltmak ve sunucu rolü atamalarının veritabanında, sunucu yöneticisinde veya Microsoft Entra yöneticisinde geçerli olduğundan emin olmak için oturum açma bilgilerinin eriştiği kullanıcı veritabanlarında çalışabilir DBCC FLUSHAUTHCACHE . Geçerli oturum açmış kullanıcıların, üyelik değişikliklerinin bu kullanıcılar üzerinde etkili olması için çalıştırdıktan DBCC FLUSHAUTHCACHE sonra yeniden bağlanması gerekir.
  • IS_SRVROLEMEMBER() veritabanında desteklenmez master .