Teknik Not
Database 2 dk okuma

.NET Core Uygulamaları İçin MSSQL'de Güvenli SQL Kullanıcısı Oluşturma (db_owner Vermeden)

Birçok projede gördüğüm en büyük hatalardan biri, uygulamanın veritabanına sa kullanıcısı veya db_owner yetkisine sahip bir kullanıcı ile bağlanması. Bu yaklaşım hem güvenlik açısından risklidir hem de en az yetki (Least...

Birçok projede gördüğüm en büyük hatalardan biri, uygulamanın veritabanına sa kullanıcısı veya db_owner yetkisine sahip bir kullanıcı ile bağlanması. Bu yaklaşım hem güvenlik açısından risklidir hem de en az yetki (Least Privilege) prensibine aykırıdır.

Benim tercih ettiğim yöntem ise uygulama için ayrı bir SQL kullanıcısı oluşturmak ve sadece ihtiyaç duyduğu yetkileri vermektir.

Bu yazıda bunu nasıl yaptığımı adım adım paylaşacağım.

1. SQL Login Oluşturma

Öncelikle SQL Server üzerinde yeni bir login oluşturuyoruz.

USE master;
GO

CREATE LOGIN app_user
WITH PASSWORD = 'GucluBirSifre123!';
GO

2. Veritabanına Kullanıcı Tanımlama

Oluşturduğumuz login'i ilgili veritabanına kullanıcı olarak ekliyoruz.

USE SeninDatabase;
GO

CREATE USER app_user FOR LOGIN app_user;
GO

3. Gerekli Yetkileri Verme

Uygulamanın sadece veri okuyup yazabilmesi için aşağıdaki iki rol yeterlidir.

ALTER ROLE db_datareader ADD MEMBER app_user;
ALTER ROLE db_datawriter ADD MEMBER app_user;
GO

Bu roller sayesinde kullanıcı;

  • ✅ SELECT
  • ✅ INSERT
  • ✅ UPDATE
  • ✅ DELETE

işlemlerini yapabilir.

Ancak aşağıdaki işlemleri yapamaz:

  • ❌ CREATE TABLE
  • ❌ ALTER TABLE
  • ❌ DROP TABLE
  • ❌ CREATE DATABASE
  • ❌ ALTER DATABASE
  • ❌ DROP DATABASE
  • ❌ CREATE LOGIN
  • ❌ SQL Server yönetim işlemleri

Yani uygulama veriler üzerinde çalışabilir ancak veritabanının yapısını değiştiremez.

4. Stored Procedure Kullanıyorsanız

Eğer uygulamanız Stored Procedure çalıştırıyorsa aşağıdaki yetkiyi de vermeniz gerekir.

GRANT EXECUTE TO app_user;

5. Kullanıcının Rollerini Kontrol Etme

Yetkilerin doğru tanımlandığını aşağıdaki sorgu ile kontrol edebilirsiniz.

SELECT
    dp.name,
    dr.name AS RoleName
FROM sys.database_role_members drm
JOIN sys.database_principals dr
    ON drm.role_principal_id = dr.principal_id
JOIN sys.database_principals dp
    ON drm.member_principal_id = dp.principal_id
WHERE dp.name = 'app_user';

Çıktı aşağıdaki gibi olmalıdır.

db_datareader
db_datawriter

6. .NET Core appsettings.json

Son olarak uygulamanızı bu kullanıcı ile bağlayabilirsiniz.

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=31.xxx.xxx.xxx;Database=SeninDatabase;User Id=app_user;Password=GucluBirSifre123!;TrustServerCertificate=True;"
  }
}

Sonuç

Ben hiçbir projemde uygulamayı sa veya db_owner yetkisi ile çalıştırmıyorum. Bunun yerine sadece ihtiyaç duyduğu yetkileri veriyorum. Böylece olası bir güvenlik açığında saldırgan veritabanındaki verilere erişse bile tablo oluşturamaz, silemez veya veritabanının yapısını değiştiremez.

Özellikle .NET Core, ASP.NET Core, Web API, Worker Service ve Microservice projelerinde bu yaklaşımı kullanmanızı tavsiye ederim. Hem güvenlik standartlarına uygun olur hem de "en az yetki" prensibini uygulamış olursunuz. Bu küçük değişiklik, üretim ortamında karşılaşabileceğiniz birçok güvenlik riskini önemli ölçüde azaltacaktır.