次の方法で共有


アクセス許可の管理のための Azure SQL Database サーバー ロール

適用対象:Azure SQL Database

この記事では、Azure SQL Database の固定サーバー レベル ロールについて説明します。

この記事の固定サーバー レベルのロールは、Azure SQL Database でパブリック プレビュー段階にあります。 これらのサーバーレベルのロールも、SQL Server 2022 のリリースの一部です。

概要

Azure SQL Database では、サーバーは論理的な概念であり、許可をサーバー レベルで付与することはできません。 アクセス許可の管理を簡素化するために、Azure SQL Database では、論理的なサーバー上のアクセス許可の管理に使用でいる、一連の固定サーバーレベルのロールが提供されています。 ロールとは、ログインをグループ化するセキュリティ プリンシパルです。

本記事における "ロール" というコンセプトは、Windows オペレーティング システムの "グループ" に似ています。

通常のユーザーが作成した他のプリンシパルと区別するため、これらの特別な固定サーバーレベルのロールには、プレフィックス ##MS_ とサフィックス ## が使用されています。

オンプレミスの SQL Server と同様に、サーバーのアクセス許可は階層的に編成されています。 これらのサーバーレベルのロールによって保持されるアクセス許可は、データベースのアクセス許可に反映されることがあります。 アクセス許可がデータベース レベルで効果的に役立つには、ログインがサーバーレベルのロール ##MS_DatabaseConnector## のメンバーである必要があります。このロールでは、すべてのデータベースに CONNECT を付与するか、個々のデータベースにユーザー アカウントを持っている必要があります。 これは、仮想 master データベースにも当てはまります。

たとえば、サーバー レベルのロール ##MS_ServerStateReader## はアクセス許可 VIEW SERVER STATE を持っています。 このロールのメンバーであるログイン ユーザーが、データベース masterWideWorldImporters でユーザー アカウントを持っている場合、このユーザーはそれら 2 つのデータベースに対して VIEW DATABASE STATE というアクセス許可を持つことになります。

ユーザー データベース内では、どのようなアクセス許可でも拒否することができ、その場合は、ロール メンバーシップによってサーバー全体の許可を上書きすることができます。 ただし、システム データベース masterでは、アクセス許可を付与または拒否することはできません。

Azure SQL Database では、現在、7 つの固定サーバー ロールが提供されています。 固定サーバー ロールに付与されるアクセス許可は変更できません。また、これらのロールに他の固定ロールをメンバーとして含めることはできません。 サーバーレベルのログインを、サーバーレベルのロールのメンバーとして追加することができます。

重要

固定サーバー ロールの各メンバーは、そのロールに他のログインを追加することができます。

Azure SQL Database のログインとユーザーについては、「SQL Database、SQL Managed Instance、Azure Synapse Analytics へのデータベース アクセスを承認する」を参照してください。

固定サーバー レベル ロール

次の表に、固定サーバー レベル ロールとその機能を示します。

固定サーバー レベル ロール 説明
##MS_DatabaseConnector## ##MS_DatabaseConnector## 固定サーバー ロールのメンバーは、データベース内のユーザーアカウントの接続先を必要とせずに、任意のデータベースに接続できます。

特定のデータベースに対する CONNECT アクセス許可を拒否するには、ユーザーはこのログインに対応するユーザー アカウントをデータベースに作成し、このデータベースユーザーに対する CONNECT アクセス許可を拒否 (DENY) します。 この DENY アクセス許可は、このロールからの GRANT CONNECT アクセス許可よりも優先されます。
##MS_DatabaseManager## ##MS_DatabaseManager## 固定サーバー ロールのメンバーは、データベースを作成および削除できます。 データベースを作成する ##MS_DatabaseManager## ロールのメンバーは、そのデータベースの所有者になります。これにより、ユーザーは dbo ユーザーとしてそのデータベースに接続できるようになります。 dbo ユーザーには、データベースでのすべてのデータベース権限があります。 ##MS_DatabaseManager## ロールのメンバーには、所有していないデータベースへのアクセス権が必ずしもあるとは限りません。 このサーバー ロールは、master に存在する dbmanager データベース レベルのロールに対して使用してください。
##MS_DefinitionReader## ##MS_DefinitionReader## 固定サーバー ロールのメンバーは、VIEW ANY DEFINITION が対象としているすべてのカタログ ビューを読み取ることができます (個別の場合は、このロールのメンバーがユーザー アカウントを持つ任意のデータベース上の VIEW DEFINITION)。
##MS_LoginManager## ##MS_LoginManager## 固定サーバー ロールのメンバーは、ログインを作成および削除できます。 このサーバー ロールは、master に存在する loginmanager データベース レベルのロールに対して使用してください。
##MS_SecurityDefinitionReader## ##MS_SecurityDefinitionReader## 固定サーバー ロールのメンバーは、VIEW ANY SECURITY DEFINITION が対象としているすべてのカタログ ビューを読み取ることができ、それぞれがこのロールのメンバーがユーザー アカウントを持つ任意のデータベースでの VIEW SECURITY DEFINITION アクセス許可を保持します。 これは、##MS_DefinitionReader## サーバー ロールがアクセスできる小さなサブセットです。
##MS_ServerStateManager## ##MS_ServerStateManager## 固定サーバー ロールのメンバーは、##MS_ServerStateReader## ロールと同じアクセス許可を持っています。 また、DBCC FREEPROCCACHEDBCC FREESYSTEMCACHE ('ALL')DBCC SQLPERF() などの複数の管理操作へのアクセス許可を付与する ALTER SERVER STATE も保持します。
##MS_ServerStateReader## ##MS_ServerStateReader## 固定サーバー ロールのメンバーは、すべてのデータベース上の VIEW SERVER STATE が対象としているすべての動的管理ビュー (DMV) および関数を読み取ることができます (個別の場合は、このロールのメンバーがユーザー アカウントを持つ任意のデータベース上の VIEW DATABASE STATE)。

固定サーバー ロールのアクセス許可

固定サーバー レベルのロールごとに、特定の権限が割り当てられます。 次の表は、サーバーレベルのロールに割り当てられているアクセス許可を示しています。 また、ユーザーが個々のデータベースに接続できれば、継承されるデータベースレベルのアクセス許可も表示されます。

固定サーバー レベル ロール サーバーレベルのアクセス許可 データベースレベルの権限 (ログインに一致するデータベース ユーザーが存在する場合)
##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## 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

アクセス許可

サーバー ロールに他のログインを追加したり、サーバー ロールから他のログインを削除したりできるのは、サーバー管理者アカウントまたは Microsoft Entra 管理者アカウント (Microsoft Entra グループの場合もある) のみです。 これは Azure SQL Database に固有です。

Microsoft Entra ID は、旧称、Azure Active Directory (Azure AD) の製品です。

サーバーレベルのロールの操作

次の表では、Azure SQL Database でサーバー レベルのロールを操作するためのシステム、ビュー、および関数について説明します。

機能 タイプ 説明
IS_SRVROLEMEMBER メタデータ SQL ログインが、指定されたサーバー レベルのロールのメンバーであるかどうかを示します。
sys.server_role_members メタデータ 各サーバー レベルのロールのメンバーごとに 1 行のデータを返します。
sys.sql_logins メタデータ SQL ログインごとに 1 行のデータを返します。
ALTER SERVER ROLE コマンド サーバー ロールのメンバーシップを変更します。

このセクションの例では、Azure SQL Database のサーバーレベルのロールを使用する方法が示されています。

A. SQL ログインをサーバーレベルのロールに追加

次の例では、SQL ログイン Jiao をサーバーレベルのロール ##MS_ServerStateReader## に追加します。 このステートメントは、仮想 master データベースで実行する必要があります。

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

B: サーバーレベルのロールのメンバーであるプリンシパル (SQL 認証) の一覧の表示

次のステートメントでは、カタログ ビュー sys.server_role_memberssys.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

C: 完全な例: サーバーレベルのロールへログインを追加し、ロール メンバーシップとアクセス許可のメタデータを取得し、テスト クエリを実行

パート 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##

ユーザー データベースからこのコマンドを実行します。

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

D: Microsoft Entra ログインのサーバー レベルのロールの確認

仮想 master データベースで次のコマンドを実行して、SQL Database のサーバー レベルのロールの一部であるすべての Microsoft Entra ログインが表示されます。 Microsoft Entra サーバーのログインの詳細については、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. 特定のログインのための仮想 master データベース ロールの確認

仮想 master データベースで次のコマンドを実行し、bob が持っているロールを確認するか、または、その値を自分のプリンシパルに合わせて値を変更します。

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

サーバーレベルのロールの制限事項

  • ロールの割り当てが有効になるまでに、最大で 5 分かかる場合があります。 また、既存のセッションの場合、サーバー ロールの割り当てを変更しても、接続を閉じて再度開くまでは有効になりません。 これは、"master" データベースと、同じ論理サーバー上の他のデータベースとの間の分散アーキテクチャが原因です。

    • 部分的な回避策: 待機期間を短縮し、データベース内のサーバー ロールの割り当てが最新であることを確認するには、サーバー管理者または Microsoft Entra 管理者のアクセス許可を使用し、ログインがアクセスできるユーザー データベースで DBCC FLUSHAUTHCACHE を実行します。 現在ログオンしているユーザーは、メンバーシップの変更を有効にするために、DBCC FLUSHAUTHCACHE の実行後に再接続する必要があります。
  • IS_SRVROLEMEMBER() は、master データベースではサポートされていません。