TRUSTWORTHY veritabanı özelliği

Şunlar için geçerlidir:SQL ServerAzure SQL Yönetilen Örneği

Veritabanı özelliği, TRUSTWORTHY SQL Server örneğinin veritabanına ve içindeki içeriklere güvenip güvenmediğini gösterir. Varsayılan olarak bu ayar OFF, ancak ifadeyi ALTER DATABASE kullanarak buna ON ayarlayabilirsiniz.

Örneğin:

ALTER DATABASE AdventureWorks2025 SET TRUSTWORTHY ON;

Uyarı

Bu seçeneği ayarlamak için izninizin olması veya CONTROL SERVER sabit sunucu rolünün üyesi olmanız gerekir.

Bazı tehditleri azaltmak için, veritabanı özelliğini TRUSTWORTHY olarak OFFbırakın. Bu tehditler, aşağıdaki nesnelerden birini içeren bir veritabanı eklemenin sonucu olarak ortaya çıkabilir:

  • Kötü niyetli montajlar için EXTERNAL_ACCESS veya UNSAFE izin ayarında. Daha fazla bilgi için CLR entegrasyon güvenliğine bakınız.

  • Yüksek ayrıcalıklı kullanıcılar olarak çalışan kötü amaçlı modüller. Daha fazla bilgi için bkz.EXECUTE AS

Her iki durum da belirli bir ayrıcalık derecesi gerektirir ve zaten SQL Server örneğine bağlı olan bir veritabanı bağlamında kullanıldıklarında uygun mekanizmalarla korunur. Ancak, veritabanı çevrimdışına alınırsa, veritabanı dosyasına erişiminiz varsa, bunu tercih ettiğiniz bir SQL Server örneğine ekleyebilir ve veritabanına kötü amaçlı içerik ekleyebilirsiniz. VERITABANLARı SQL Server'da ayrılıp eklendiğinde, verilerde ve günlük dosyalarında veritabanı dosyalarına erişimi kısıtlayan belirli izinler ayarlanır.

SQL Server'ın bir örneğine bağlı bir veritabanı hemen güvenilemez olduğundan, veritabanı açıkça güvenilir olarak işaretlenene kadar veritabanının kapsamı dışındaki kaynaklara erişmesine izin verilmez. Bu nedenle, bu TRUSTWORTHY seçeneği ON olan bir veritabanını yedekleme veya ayırarak veritabanını aynı veya başka bir SQL Server örneğine eklerseniz veya geri yüklerseniz, TRUSTWORTHY özellik OFF ekleme veya geri yükleme tamamlandığında ayarlanır. Ayrıca, veritabanı dışındaki kaynaklara erişmek için tasarlanmış modüller ve ya EXTERNAL_ACCESS veya UNSAFE izin ayarına sahip montajlar başarılı çalışmaları için ekstra gereksinimlere sahiptir.

Uyarı

Varsayılan olarak, ayar TRUSTWORTHY veritabanı için ONmsdb ayarlanmıştır. Bu ayarı varsayılan değerinden değiştirirseniz, veritabanını kullanan SQL Server bileşenleri tarafından beklenmeyen davranışlara msdb neden olabilir.

Eğer ayarı TRUSTWORTHY , ONolarak ayarlarsanız ve veritabanının sahibi, yönetici kimlik bilgilerine sahip bir grup üyesiyse, örneğin sistem yöneticisi grubu, veritabanı sahibi SQL Server örneğini tehlikeye atabilecek güvensiz assemble'ler oluşturup çalıştırabilir.

Remarks

Web servis hizmeti sağlayıcısı (ISS) ortamında, örneğin web barındırma hizmetinde, her müşteri kendi veritabanını yönetir ve sistem veritabanlarına veya diğer kullanıcı veritabanlarına erişemez. Örneğin, bir ISS, aynı SQL Server örneğinde iki rakip şirketin veritabanlarını barındırabilir. Bir kullanıcı veritabanını orijinal örneğine eklerseniz, kullanıcı veritabanına tehlikeli kod ekleyebilirsiniz. Veritabanını ISS örneğine dağıttığınızda, kod aktif hale gelir. Bu senaryo, veritabanları arası erişimi kontrol etmeyi çok önemli kılar.

Aynı genel varlık her veritabanına sahip ve yönetiyorsa, uygulama özelliği, örneğin veritabanı çapraz Service Broker iletişimi gibi bir özellik gerektirmedikçe veritabanıyla güven ilişkisi kurmak iyi bir uygulama değildir. Veritabanları arasında bir güven ilişkisi kurarsınız; veritabanları arasında mülkiyet zincirlemesini etkinleştirerek veya bu özelliği kullanan örnek TRUSTWORTHY tarafından güvenilen olarak işaretlersiniz. Katalog görünümünün sys.databases sütunu, is_trustworthy_on bir veritabanının özellik TRUSTWORTHY atılı olup olmadığını gösterir.

Veritabanı sahipliği ve güveni için en iyi yöntemler şunlardır:

  • Veritabanları için ayrı sahiplere sahip olun. Tüm veritabanları sistem yöneticisine ait olmamalıdır.

  • Her veritabanı için sahip sayısını sınırlayın.

  • Güveni seçici bir şekilde verin.

  • Çapraz veritabanı sahiplik zincirleme ayarını birden fazla veritabanı tek bir birim olarak dağıtmadığınız sürece ayarlayınOFF.

  • Kullanımı TRUSTWORTHY özelliğini kullanmak yerine seçmeli güvene taşıyın.

Aşağıdaki Transact-SQL örnek, özelliği TRUSTWORTHY ayarlı ON olan ve veritabanı sahibinin sistem yöneticisi sabit sunucu rolüne ait veritabanlarının bir listesini getirir.

SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
       d.name AS DATABASENAME
FROM sys.server_principals AS r
     INNER JOIN sys.server_role_members AS m
         ON r.principal_id = m.role_principal_id
     INNER JOIN sys.server_principals AS p
         ON p.principal_id = m.member_principal_id
     INNER JOIN sys.databases AS 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

Aşağıdaki örnek, veritabanının msdb özelliğini belirlerTRUSTWORTHY.

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

Eğer bu sorgu özelliğin TRUSTWORTHY için msdbayarlandığını OFF gösteriyorsa, aşağıdaki sorguyu çalıştırarak onu varsayılan değeri olan 'ONye geri döndürebilirsiniz.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

Güvenlik uyarısı

Özellik TRUSTWORTHYONve veritabanı sahibi sysadmin sabit sunucu rolünün bir üyesiyse, db_owner sabit veritabanı rolünün bir üyesi izinlerini sysadmin'e yükseltebilir. Her iki koşul da gereklidir. Mülkte TRUSTWORTHY dikkatli olun.

Aşağıdaki Transact-SQL kodu, db_owner sabit veritabanı rolünü alan veritabanı kullanıcılarının bir listesini geri getirir.

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
     INNER JOIN sys.database_principals AS roles
         ON database_role_members.role_principal_id = roles.principal_id
     INNER 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