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

適用対象: SQL ServerAzure SQL Managed Instance

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

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

以下のオブジェクトを含むデータベースをアタッチすることで発生する可能性のある脅威を軽減するために、TRUSTWORTHYデータベースプロパティをOFFに設定しておくことをお勧めします:

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

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

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

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

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

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

詳細情報

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

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

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

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

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

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

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

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

警告

db_ownerをONに設定した場合、sysadminTRUSTWORTHYロールを持つユーザーを昇格させる方法があります。 TRUSTWORTHYプロパティを使用する場合は注意が必要です。 次の SQL コードを使用して、db_ownerロールが付与されているデータベース内のデータベース ユーザーの一覧を取得できます。

SELECT    roles.principal_id    AS RolePrincipalID
   ,    roles.name       AS RolePrincipalName
   ,    database_role_members.member_principal_id  AS MemberPrincipalID
   ,    members.name      AS MemberPrincipalName
FROM sys.database_role_members AS database_role_members  
JOIN sys.database_principals AS roles  
   ON database_role_members.role_principal_id = roles.principal_id  
JOIN sys.database_principals AS members  
   ON database_role_members.member_principal_id = members.principal_id where  roles.name='db_owner' and members.name <>'dbo'
GO

次のステップ