TRUSTWORTHY データベース プロパティ

適用対象: SQL Server Azure SQL Managed Instance

TRUSTWORTHYデータベース プロパティは、SQL Server のインスタンスがデータベースとその中の内容を信頼するかどうかを示すために使用されます。 既定では、この設定は OFF ですが、 ステートメントを使用 ALTER DATABASE して ON に設定できます。 (例: ALTER DATABASE AdventureWorks2019 SET TRUSTWORTHY ON;)。

注意

このオプションを設定するには、 sysadmin 固定サーバー ロールのメンバーである必要があります。

次のいずれかのオブジェクトを含むデータベースを TRUSTWORTHY アタッチした結果として存在する可能性のある特定の脅威を軽減するには、データベース プロパティを OFF のままにしておくことをお勧めします。

  • EXTERNAL_ACCESS 権限または UNSAFE 権限が設定された、悪意のあるアセンブリ。 詳細については、「 CLR 統合のセキュリティ」を参照してください。

  • 高い特権を所持するユーザーとして実行するように定義された悪意のあるモジュール。 詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。

どちらの場合も、特定のレベルの特権が必要であり、SQL Serverのインスタンスに既にアタッチされているデータベースのコンテキストで使用される場合は、適切なメカニズムによって保護されます。 ただし、データベースがオフラインの場合、データベース ファイルにアクセスできる場合は、任意のSQL Serverのインスタンスにアタッチし、悪意のあるコンテンツをデータベースに追加することができます。 SQL Serverでデータベースをデタッチしてアタッチすると、データベース ファイルへのアクセスを制限するデータ ファイルとログ ファイルに対して特定のアクセス許可が設定されます。

SQL Serverのインスタンスにアタッチされているデータベースはすぐには信頼できないため、データベースが明示的に信頼できるとマークされるまで、データベースはデータベースのスコープを超えるリソースにアクセスできません。 そのため、オプション ON のデータベースTRUSTWORTHYをバックアップまたはデタッチし、データベースを同じインスタンスまたは別のSQL Server インスタンスにアタッチまたは復元する場合、TRUSTWORTHYアタッチまたは復元が完了すると、 プロパティは OFF に設定されます。 また、データベースの外部のリソースにアクセスするように設計されたモジュールと、EXTERNAL_ACCESSおよび UNSAFE アクセス許可設定を持つアセンブリには、正常に実行するための追加の要件があります。

Note

既定では、データベースの TRUSTWORTHY 設定は ON msdb に設定されています。 この設定を既定値から変更すると、データベースを使用するコンポーネントSQL Server予期しない動作が発生するmsdb可能性があります。

設定が TRUSTWORTHY ON に設定されていて、データベースの所有者が sysadmin グループなどの管理者資格情報を持つグループのメンバーである場合、データベース所有者は、SQL Serverのインスタンスを侵害する可能性がある安全でないアセンブリを作成して実行できます。

詳細情報

インターネット サービス プロバイダー (ISP) 環境 (Web ホスティング サービスなど) では、各顧客は独自のデータベースの管理を許可され、システム データベースやその他のユーザー データベースへのアクセスが制限されます。 たとえば、競合する 2 つの会社のデータベースは、同じ ISP によってホストされ、SQL Serverの同じインスタンスに存在する可能性があります。 データベースが元のインスタンスにアタッチされている場合、ユーザー データベースに危険なコードが追加される可能性があり、データベースのデプロイ時に ISP インスタンスでコードが有効になる可能性があります。 この状況により、データベース間アクセスの制御が重要になります。

同じ一般エンティティが各データベースを所有および管理する場合、データベース間の Service Broker 通信などのアプリケーション固有の機能が必要でない限り、データベースとの信頼関係を確立することはまだお勧めできません。 データベース間の信頼関係を確立するには、データベース間の所有権チェーンを有効にするか、 プロパティを使用して TRUSTWORTHY インスタンスによって信頼済みとしてデータベースをマークします。 カタログ ビューの列は is_trustworthy_onsys.databases データベースにプロパティが TRUSTWORTHY 設定されているかどうかを示します。

データベースの所有権と信頼のベスト プラクティスには、次のようなものがあります。

  • データベースに対して個別の所有者を持つ。 すべてのデータベースをシステム管理者が所有する必要はありません。
  • 各データベースの所有者の数を制限します。
  • 信頼を選択的に付与します。
  • 複数のデータベースが 1 つのユニットにデプロイされている場合を除き、 クロス DB 所有権チェーン 設定は OFF のままにします。
  • プロパティを使用する代わりに、使用量を選択的信頼に TRUSTWORTHY 移行します。

次のコード サンプルを使用して、 プロパティが ON に設定され、データベース所有者が TRUSTWORTHYsysadmin サーバー ロールに属しているデータベースの一覧を取得できます。

SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
    d.name AS DATABASENAME
FROM sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id
INNER JOIN sys.databases d ON suser_sname(d.owner_sid) = p.name
WHERE is_trustworthy_on = 1
    AND d.name NOT IN ('msdb')
    AND r.type = 'R'
    AND r.name = N'sysadmin';
GO

次のクエリを実行して、データベースの TRUSTWORTHY プロパティを msdb 確認できます。

SELECT name,
    trustworthy_setting = CASE is_trustworthy_on
        WHEN 1 THEN 'Trustworthy setting is ON for msdb'
        ELSE 'Trustworthy setting is OFF for msdb'
        END
FROM sys.databases
WHERE database_id = 4;
GO

このクエリで TRUSTWORTHY プロパティが OFF に設定されていることが示されている場合は、次のクエリを実行して プロパティを TRUSTWORTHY ON に設定できます。

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

次の手順