TRUSTWORTHY データベース プロパティ
適用対象: SQL Server Azure 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に設定した場合、sysadmin
のTRUSTWORTHY
ロールを持つユーザーを昇格させる方法があります。 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