次の方法で共有


メタデータの可視性の構成

適用対象:SQL ServerAzure SQL データベースAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

メタデータの表示は、ユーザーが所有するセキュリティ保護可能なリソース、またはそのユーザーが権限を許可されているセキュリティ保護可能なリソースに制限されています。

たとえば、次のクエリでは、ユーザーがテーブル myTableに対するSELECTINSERTなどのアクセス許可を付与すると、行が返されます。

SELECT name, object_id
FROM sys.tables
WHERE name = N'myTable';
GO

ただし、ユーザーが myTableに対するアクセス許可を持っていない場合、クエリは空の結果セットを返します。

メタデータの可視性構成のスコープと影響

メタデータの可視性の構成は、次のセキュリティ保護可能なリソースにのみ適用されます。

  • カタログ ビュー
  • メタデータ公開組み込み関数
  • 互換性ビュー
  • データベース エンジン sp_help ストアド プロシージャ
  • 情報スキーマ ビュー
  • 拡張プロパティ

メタデータの可視性の構成は、次のセキュリティ保護可能なリソースには適用されません。

  • ログ配布システム テーブル
  • データベース メンテナンス プラン システム テーブル
  • レプリケーション システム テーブル
  • SQL Server エージェントのシステム テーブル
  • バックアップ システム テーブル
  • レプリケーションと SQL Server エージェント sp_help ストアド プロシージャ

メタデータへのアクセスを制限すると、次のような影響があります。

  • システム ビューへのクエリを実行しても、行のサブセットまたは空の結果セットしか返されないことがあります。
  • OBJECTPROPERTYEX などのメタデータ出力の組み込み関数は、 NULLを返す場合があります。
  • データベース エンジン sp_help ストアド プロシージャを実行しても、行または NULL のサブセットしか返されないことがあります。
  • その結果、 パブリック メタデータ アクセスを想定するアプリケーションは中断されます。

ストアド プロシージャやトリガーなどの SQL モジュールは、呼び出し元のセキュリティ コンテキストで実行されるので、メタデータへのアクセスが制限されます。 たとえば次のコードでは、ストアド プロシージャから、呼び出し元に権限のないテーブル myTable のメタデータへのアクセスが試行されると、空の結果セットが返されます。 以前のリリースの SQL Server では行が返されます。

CREATE PROCEDURE assumes_caller_can_access_metadata
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END;
GO

呼び出し元がメタデータを表示できるようにするには、呼び出し元に VIEW DEFINITION アクセス許可を付与するか、SQL Server 2022 (16.x) 以降のバージョンで、オブジェクト レベル、データベース レベル、またはサーバー レベルの適切なスコープで VIEW SECURITY DEFINITION または VIEW PERFORMANCE DEFINITION を付与できます。 したがって、前の例では、呼び出し元にmyTableに対するVIEW DEFINITIONアクセス許可がある場合、ストアド プロシージャは行を返します。 詳細については、「 GRANT 」および「 GRANT Database Permissions」を参照してください。

また、ストアド プロシージャを所有者の資格情報で実行するように変更することもできます。 プロシージャの所有者とテーブルの所有者が同じ場合は、所有権の継承が適用されます。したがって、プロシージャの所有者のセキュリティ コンテキストにより、 myTableのメタデータにアクセスできます。 このシナリオで次のコードを実行すると、メタデータの行が呼び出し元に返されます。

Note

次の例で使用するのは、 sys.sysobjects 互換性ビューではなく sys.objects カタログ ビューです。

CREATE PROCEDURE does_not_assume_caller_can_access_metadata
WITH EXECUTE AS OWNER
AS
BEGIN
    SELECT name, object_id
    FROM sys.objects
    WHERE name = N'myTable';
END
GO

Note

EXECUTE ASを使用して、呼び出し元のセキュリティ コンテキストに一時的に切り替えることができます。 詳細については、 EXECUTE AS を参照してください。

メタデータ可視性構成の利点と制限

メタデータ表示の構成は、セキュリティ計画全体にとって重要な役割を果たします。 ただし、上級ユーザーや事前に指定されたユーザーが一部のメタデータを強制的に公開できる場合もあります。 メタデータの権限の配置は、数ある堅牢な防御策の 1 つとして行うことをお勧めします。

理論的には、クエリの述語評価の順序を操作することで、エラー メッセージ内のメタデータの出力を強制することができます。 このような 試用およびエラー攻撃の 可能性は、SQL Server に固有ではありません。 これは、関係代数で許可される連想変換と可換変換によって暗示されます。 このリスクは、エラー メッセージで返される情報を制限することで緩和できます。 この方法でメタデータの表示を制限するには、トレース フラグ 3625 を使用してサーバーを起動します。 このトレース フラグは、エラー メッセージで表示される情報の量を制限します。 そのため、この方法を使用することで、メタデータの公開が強制されることを防ぐことができます。 トレードオフは、エラー メッセージが簡潔で、デバッグ目的で使用するのが難しい場合があるということです。 詳細については、「 データベース エンジン サービスのスタートアップ オプション 」および 「トレース フラグ」を参照してください。

次のメタデータは、強制開示の対象ではありません。

  • provider_stringsys.servers 列に格納された値。 ALTER ANY LINKED SERVER権限を持たないユーザーには、この列にNULL値が表示されます。

  • ストアド プロシージャやトリガーなどのユーザー定義オブジェクトのソース定義。 ソース コードは、次のいずれかの条件に該当する場合にのみ表示されます。

    • ユーザーには、オブジェクトに対する VIEW DEFINITION 権限があります。

    • ユーザーはオブジェクトに対するアクセス許可 VIEW DEFINITION 拒否されておらず、オブジェクトに対する CONTROLALTER、または TAKE OWNERSHIP アクセス許可を持っています。 他のすべてのユーザーに NULLが表示されます。

  • 次のカタログ ビューの定義列。

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • ctext 互換表示の syscomments 列。

  • sp_helptext プロシージャの出力。

  • 情報スキーマ ビューの次の列。

    • INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE
    • INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT
    • INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION
    • INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
    • INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
    • INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
  • OBJECT_DEFINITION() 機能

  • password_hashsys.sql_logins 列に格納された値。 CONTROL SERVERを持たないユーザー、または SQL Server 2022 (16.x) 以降のバージョンでは、VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITIONアクセス許可には、この列にNULL値が表示されます。

組み込みのシステム プロシージャと関数の SQL 定義は、 sys.system_sql_modules カタログ ビュー、 sp_helptext ストアド プロシージャ、および OBJECT_DEFINITION() 関数を通じてパブリックに表示されます。

Note

システム ストアド プロシージャ sp_helptext は、Azure Synapse Analytics ではサポートされていません。 代わりに、sys.sql_modules オブジェクト カタログ ビューを使用します。

メタデータの可視性の一般的な原則

次に、メタデータの表示に関して考慮する必要がある一般原則を示します。

  • 固定ロールの暗黙の権限
  • 権限のスコープ
  • の優先順位 DENY
  • サブコンポーネントのメタデータの表示

固定ロールと暗黙的なアクセス許可

固定ロールでアクセスできるメタデータは、それらのメタデータに対応する暗黙の権限によって決まります。

権限のスコープ

あるスコープで権限が許可されていると、そのスコープのメタデータと、そのスコープに含まれるすべてのスコープのメタデータを表示できることになります。 たとえば、スキーマ SELECT 権限は、権限付与対象ユーザーがそのスキーマに含まれるすべてのセキュリティ保護可能なリソースに対して SELECT 権限を持っていることを意味します。 そのため、スキーマに対して SELECT 権限を付与することで、ユーザーはスキーマのメタデータ、およびスキーマ内のすべてのテーブル、ビュー、関数、プロシージャ、キュー、シノニム、型、および XML スキーマ コレクションを表示できます。 スコープの詳細については、「権限の階層 (データベース エンジン)」を参照してください。

Note

UNMASKアクセス許可はメタデータの可視性に影響しません。UNMASKのみを付与してもメタデータは公開されません。 UNMASK は、常に SELECT のアクセス許可を伴って何らかの効果を与える必要があります。 例: データベース スコープに UNMASK を付与し、個々のテーブルに SELECT を付与すると、ユーザーは選択できる個々のテーブルのメタデータのみを表示でき、他のテーブルは表示されません。

DENY の優先

DENY 通常は、他のアクセス許可よりも優先されます。 たとえば、データベース ユーザーにスキーマ EXECUTE アクセス許可が付与されていても、そのスキーマ内のストアド プロシージャに対するアクセス許可 EXECUTE 拒否されている場合、ユーザーはそのストアド プロシージャのメタデータを表示できません。

さらに、ユーザーがスキーマ EXECUTE アクセス許可を拒否されたが、そのスキーマのストアド プロシージャに対 EXECUTE アクセス許可が付与されている場合、ユーザーはそのストアド プロシージャのメタデータを表示できません。

別の例として、ストアド プロシージャに対する EXECUTE アクセス許可がユーザーに付与および拒否されている場合(さまざまなロール メンバーシップを通じて可能)、 DENY が優先され、ユーザーはストアド プロシージャのメタデータを表示できません。

サブコンポーネントのメタデータの表示

インデックス、check 制約、トリガーなどのサブコンポーネントの可視性は、親に対するアクセス許可によって決まります。 これらのサブコンポーネントには、許可可能なアクセス許可がありません。 たとえば、ユーザーがあるテーブルに対していくつかの権限を許可されていると、そのテーブル、列、インデックス、CHECK 制約、トリガー、およびその他のサブコンポーネントのメタデータを表示できます。 別の例として、特定のテーブルの個々の列に対してのみ SELECT を許可します。これにより、権限付与対象ユーザーは、すべての列を含むテーブル全体のメタデータを表示できます。 考え方の 1 つは、 VIEW DEFINITION アクセス許可がエンティティ レベル (この場合はテーブル) でのみ機能し、サブエンティティ リスト (列やセキュリティ式など) では使用できないことです。

次のコードはこの動作を示しています。

CREATE TABLE t1
(
    c1 INT,
    c2 VARCHAR
);
GO

CREATE USER testUser WITHOUT LOGIN;
GO

EXECUTE AS USER = 'testUser';

SELECT OBJECT_SCHEMA_NAME(object_id),
       OBJECT_NAME(object_id),
       name
FROM sys.columns;

SELECT * FROM sys.tables;
-- this returns no data, as the user has no permissions

REVERT;
GO

-- granting SELECT on only 1 column of the table:
GRANT SELECT ON t1 (c1) TO testUser;
GO

EXECUTE AS USER = 'testUser';

SELECT OBJECT_SCHEMA_NAME(object_id),
       OBJECT_NAME(object_id),
       name
FROM sys.columns;

SELECT * FROM sys.tables;
-- this returns metadata for all columns of the table and the table itself
;

REVERT;
GO

DROP TABLE t1;
DROP USER testUser;

すべてのデータベース ユーザーがアクセスできるメタデータ

一部のメタデータは、特定のデータベースのすべてのユーザーがアクセスできる必要があります。 たとえば、ファイル グループには付与可能なアクセス許可がありません。そのため、ファイル グループのメタデータを表示するアクセス許可をユーザーに付与することはできません。 ただし、テーブルを作成できるユーザーは、CREATE TABLE ステートメントのON <filegroup>句またはTEXTIMAGE_ON <filegroup>句を使用するために、ファイル グループメタデータにアクセスできる必要があります。

DB_ID()関数とDB_NAME()関数によって返されるメタデータは、すべてのユーザーに表示されます。

これは public ロールで表示できるカタログ ビューの一覧です。

  • sys.allocation_units
  • sys.column_type_usages
  • sys.configurations
  • sys.data_spaces
  • sys.database_files
  • sys.destination_data_spaces
  • sys.filegroups
  • sys.messages
  • sys.parameter_type_usages
  • sys.partition_functions
  • sys.partition_range_values
  • sys.partition_schemes
  • sys.partitions
  • sys.schemas
  • sys.sql_dependencies
  • sys.type_assembly_usages