Properti database TRUSTWORTHY

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Properti TRUSTWORTHY database digunakan untuk menunjukkan apakah instans SQL Server mempercayai database dan konten di dalamnya. Secara default, pengaturan ini NONAKTIF, tetapi dapat diatur ke AKTIF dengan menggunakan ALTER DATABASE pernyataan . Misalnya: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.

Catatan

Untuk mengatur opsi ini, Anda harus menjadi anggota peran server tetap sysadmin .

Kami menyarankan agar Anda membiarkan TRUSTWORTHY properti database diatur ke NONAKTIF untuk mengurangi ancaman tertentu yang bisa ada sebagai akibat melampirkan database yang berisi salah satu objek berikut:

  • Rakitan berbahaya dengan pengaturan izin EXTERNAL_ACCESS atau TIDAK AMAN. Untuk informasi selengkapnya, lihat Keamanan Integrasi CLR.

  • Modul berbahaya yang didefinisikan untuk dijalankan sebagai pengguna dengan hak istimewa tinggi. Untuk informasi selengkapnya, lihat EXECUTE AS Clause (Transact-SQL).

Kedua situasi memerlukan tingkat hak istimewa tertentu dan dilindungi oleh mekanisme yang sesuai ketika digunakan dalam konteks database yang sudah dilampirkan ke instans SQL Server. Namun, jika database diambil secara offline, jika Anda memiliki akses ke file database, Anda berpotensi melampirkannya ke instans SQL Server pilihan Anda dan menambahkan konten berbahaya ke database. Ketika database dilepas dan dilampirkan di SQL Server, izin tertentu diatur pada data dan file log yang membatasi akses ke file database.

Karena database yang dilampirkan ke instans SQL Server tidak dapat segera dipercaya, database tidak diizinkan untuk mengakses sumber daya di luar cakupan database hingga database ditandai secara eksplisit dapat dipercaya. Oleh karena itu, jika Anda mencadangkan atau melepaskan database yang memiliki TRUSTWORTHY opsi AKTIF dan Anda melampirkan atau memulihkan database ke instans SQL Server yang sama atau lainnya, TRUSTWORTHY properti diatur ke NONAKTIF saat melampirkan atau memulihkan selesai. Selain itu, modul yang dirancang untuk mengakses sumber daya di luar database, dan rakitan dengan pengaturan izin EXTERNAL_ACCESS dan TIDAK AMAN, memiliki persyaratan tambahan untuk berjalan dengan sukses.

Catatan

Secara default, TRUSTWORTHY pengaturan diatur ke AKTIF untuk msdb database. Jika Anda mengubah pengaturan ini dari nilai defaultnya, itu mungkin mengakibatkan perilaku tak terduga oleh komponen SQL Server yang menggunakan msdb database.

TRUSTWORTHY Jika pengaturan diatur ke AKTIF, dan jika pemilik database adalah anggota grup yang memiliki kredensial administratif, seperti grup sysadmin, pemilik database kemudian dapat membuat dan menjalankan rakitan yang tidak aman yang dapat membahayakan instans SQL Server.

Informasi selengkapnya

Di lingkungan Penyedia Layanan Internet (ISP) (misalnya, dalam layanan hosting web), setiap pelanggan diizinkan untuk mengelola database mereka sendiri dan dibatasi untuk mengakses database sistem dan database pengguna lainnya. Misalnya, database dua perusahaan yang bersaing dapat dihosting oleh ISP yang sama dan ada dalam instans SQL Server yang sama. Kode berbahaya dapat ditambahkan ke database pengguna ketika database dilampirkan ke instans aslinya, dan kode akan diaktifkan pada instans ISP saat database disebarkan. Situasi ini membuat pengendalian akses lintas database sangat penting.

Jika entitas umum yang sama memiliki dan mengelola setiap database, masih bukan praktik yang baik untuk membangun hubungan kepercayaan dengan database kecuali fitur khusus aplikasi, seperti komunikasi Service Broker lintas database, diperlukan. Hubungan kepercayaan antara database dapat dibuat dengan mengaktifkan rantai kepemilikan lintas database atau dengan menandai database sebagai tepercaya oleh instans menggunakan TRUSTWORTHY properti . Kolom is_trustworthy_onsys.databases tampilan katalog menunjukkan apakah database memiliki kumpulan propertinya TRUSTWORTHY .

Praktik terbaik untuk kepemilikan dan kepercayaan database meliputi yang berikut ini:

  • Memiliki pemilik yang berbeda untuk database. Tidak semua database harus dimiliki oleh administrator sistem.
  • Batasi jumlah pemilik untuk setiap database.
  • Menganugerah kepercayaan secara selektif.
  • Biarkan pengaturan rantai kepemilikan cross db diatur ke NONAKTIF kecuali beberapa database disebarkan pada satu unit.
  • Migrasikan penggunaan ke kepercayaan selektif alih-alih menggunakan TRUSTWORTHY properti .

Sampel kode berikut dapat digunakan untuk mendapatkan daftar database yang propertinya diatur TRUSTWORTHY ke AKTIF dan pemilik databasenya termasuk dalam peran server 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

Anda bisa menjalankan kueri berikut untuk menentukan TRUSTWORTHY properti msdb database:

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

Jika kueri ini memperlihatkan bahwa TRUSTWORTHY properti diatur ke NONAKTIF, Anda bisa menjalankan kueri berikut untuk mengatur properti ke TRUSTWORTHY AKTIF.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Peringatan

Ada cara untuk meningkatkan pengguna dengan db_owner peran untuk menjadi sysadmin saat mengatur TRUSTWORTHY ke AKTIF. Berhati-hatilah saat menggunakan TRUSTWORTHY properti . Kode SQL berikut dapat digunakan untuk mendapatkan daftar pengguna database dalam database yang diberikan peran tersebut 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

Langkah berikutnya