次の方法で共有


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

メタデータの可視性は、ユーザーが所有しているか、ユーザーに何らかのアクセス許可が付与されているセキュリティ保護可能なリソースに限定されます。 たとえば、次のクエリでは、テーブル myTableに対する SELECT や INSERT などのアクセス許可がユーザーに付与されている場合、行が返されます。

SELECT name, object_id  
FROM sys.tables  
WHERE name = '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, id   
FROM sysobjects   
WHERE name = 'myTable';  
END;  
GO  

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

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

次の例では、 sys.sysobjects 互換性ビューの代わりに sys.objects カタログ ビューを使用します。

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

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

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

メタデータの可視性の構成は、全体的なセキュリティ 計画で重要な役割を果たすことができます。 ただし、熟練した特定のユーザーが、何らかのメタデータの開示を強制できる場合があります。 メタデータのアクセス許可は、多層防御の 1 つとしてデプロイすることをお勧めします。

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

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

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

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

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

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

  • 次のカタログ ビューにある定義列:

    sys.all_sql_modules sys.sql_modules
    sys.server_sql_modules sys.check_constraints(システム制約のチェック)
    sys.default_constraints sys.computed_columns
    sys.numbered_procedures
  • syscomments 互換性ビューの ctext 列。

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

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

    INFORMATION_SCHEMA。CHECK_CONSTRAINTS。CHECK_CLAUSE INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA。ドメイン。DOMAIN_DEFAULT INFORMATION_SCHEMA。ROUTINE_COLUMNS。COLUMN_DEFAULT
    INFORMATION_SCHEMA。ルーチン。ROUTINE_DEFINITION INFORMATION_SCHEMA。表示モード。VIEW_DEFINITION
  • OBJECT_DEFINITION() 関数

  • sys.sql_logins のpassword_hash列に格納されている値。 CONTROL SERVER 権限を持たないユーザーには、この列に NULL 値が表示されます。

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

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

メタデータの可視性に関して考慮すべき一般的な原則を次に示します。

  • ロールの暗黙的なアクセス許可を修正しました

  • 権限の範囲

  • DENY の優先順位

  • サブコンポーネント メタデータの可視性

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

固定ロールによってアクセスできるメタデータは、対応する暗黙的なアクセス許可によって異なります。

アクセス許可のスコープ

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

DENY の優先順位

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

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

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

サブコンポーネント メタデータの可視性

インデックス、check 制約、トリガーなどのサブコンポーネントの可視性は、親に対するアクセス許可によって決まります。 これらのサブコンポーネントには、許可可能なアクセス許可がありません。 たとえば、ユーザーにテーブルに対するアクセス許可が付与されている場合、ユーザーはテーブル、列、インデックス、check 制約、トリガー、およびその他のサブコンポーネントのメタデータを表示できます。

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

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

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

次の表に、 パブリック ロールに表示されるカタログ ビューを示します。

sys.partition_functions sys.partition_range_values
sys.partition_schemes sys.data_spaces
sys.filegroups システム.宛先データ領域
sys.database_files sys.allocation_units
sys.partitions sys.messages
sys.schemas sys.configurations
sys.sql_dependencies sys.type_assembly_usages
sys.parameter_type_usages sys.column_type_usages

こちらもご覧ください

GRANT (Transact-SQL)
DENY (Transact-SQL)
REVOKE (Transact-SQL)
EXECUTE AS 句 (Transact-SQL)
カタログ ビュー (Transact-SQL)
互換性ビュー (Transact-SQL)