ASP.Net Core Projelerinde Güvenlik — Giriş

Merhabalar,

Uzun zamandır merak ettiğim .NET Core projelerinde güvenlik konusu ile ilgili çalışmalara bugün itibariyle başladım. Bu çalışmalar esnasında rehber olarak Udemy’den almış olduğum Fatih Çakıroğlu’nun Asp.Net Core Security(Güvenlik) eğitiminden faydalandım. Bu eğitimden çıkardığım notları da sizlerle paylaşmak istedim. Bu yazımda aslında konuya giriş yapmak ve kod tarafında yapılması gereken bazı işlemleri sizlerle paylaşacağım. Faydalı olması dileğiyle.

Haydi Başlayalım!

Hepimiz gün içerisinde saatlerce kod yazıyoruz ve bir çok hata ile karşılaşıyoruz. Bu hataları çözümleyip projemizi derlediğimizde rahat bir nefes alıyor, ve commitliyoruz 🙂 Peki projenin güvenlik aşamasında yapmamız gereken neler ? Veya güvenliği sağlayabilmek için ASP.Net Core Framework’un bize sundukları neler ?

  • NET Core Framework ile bir uygulama geliştirdiği zaman önemli alanları ,veri tabanındakı sütunların bilgilerini dış dünyaya açmak istemeyebiliriz.Örnek vermek gerekirse; TC kimlik sorgulaması gerçekleştirdiğimizde, bunun QueryString olarak dış dünyaya açılmasını engellemek gibi. Bu kısımda devreye Data Protection kavramı devreye girmektedir.
  • ASP.NET Core gömülü bir şekilde Data Protection özelliği sağlamaktadır. Bu sayede propertylerimizi şifreleyebiliirz.
  • ASP.NET Core güvenlik yapısında IDataProtector Interface bulunmaktadır.
  • IDataProtector ASP.NET Core MVC uygulamalarımızda Dependency Injection kullanarak Constructor’a eklenebilmektedir.
  • IDataProtector üzerinden Protect ve Unprotect ile şifreleme ve şifre çözülme işlemlerini yapılmaktadır. Protect şifrelenmeyi sağlarken, Unprotect şifre çözülmesini sağlar.
  • TC kimlik numarası gibi alanlarımız varsa ayrı bir katman yazmadan, Dependency Injection olarak projeye enjekte edebileceğimiz bu yapıyı kullanmamız işimizi kolaylaştırabilir. Eğer IDataProtector olmasaydı , o zaman güvenlik için kendi katmanımızı yazmamız gerekebilirdi. Hatta ekstra birçok katman yazmamız gerekirdi.

Haydi bir örnek ile konuyu anlayalım!

  • Deneme amaçlı kendi veri tabanımızda bir Product tablosu açalım.
  • Product tablomuzu oluşturduğumuz veri tabanını .NET Core Web Application projesi ile bağlama işlemini gerçekleştirelim.
  • Bunun için Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.SqlServer ve Microsoft.EntityFrameworkCore.Tools nuget packagelerini yüklemelisiniz. ( Yüklemiş olduğunuz .NET Core sürümü ile sürümü aynı olmalı, yoksa sıkıntı yaşayabilirsiniz. Çünkü ben biraz yaşadım 🙂 )
  • Daha sonrasında veri tabanınızın Connection String’i ile aşağıdaki sorguyu Package Manager Console’da çalıştırdığınızda Database First yapısınıza uygun ortamı oluşturmuş olursunuz.

Scaffold-DbContext “Connection String alanından kopyaladığınız kısım” Microsoft.EntityFrameworkCore.SqlServer -OutPutDir Models -Tables Product

  • Yukarıdaki minik sorgu,Database First işlemlerinizin Models klasörünün altına kaydedilmesini,sadece Product table’ını almasını sağlıyor. Ek olarak yüklemiş olduğunuz EntityFrameworkCore.SqlServer nuget package’sini kullanması gerektiğini belirtiyor.
  • Bizim yapmak istediğimiz işlemi şu şekilde hayal edebilirsiniz. Elinizde bir ürün listesi var ve siz bu ürünlerin detaylarına ulaşabiliyorsunuz. Ancak ürünüzün detayına https://localhost:44304/Products/Details/1bu link ile ulaşılmayı engellemek ve veri tabanındaki ID değeri olan 1 değerini şifrelemek istiyorsunuz.Tam bu kısımda amacınız, güvenlik zafiyeti önleyebilmektir.
Ürün Listesi
Ürün Detayı
  • Uygulamada Data Protection kullanılacağını servis olarak belirtmek gerekir. O nedenle projenize gelip AddDataProtection() metodunu eklmeniz gerekmektedir. Bu eklemeyi Startup.cs alanına eklemelisiniz.
  • Bunu eklemeyi gerçekleştirdikten sonra IDataProtector’u ekleyebilir hale geleceksiniz.
  • Şimdi Controller içerisinde aşağıdaki gibi Dependency Injection ile eklemesini gerçekleştirelim. Öncelikle, Private olarak nesnenizi oluşturabilirsiniz.
  • IDataProtector’u ; Constructor içerisinde Provider kullanarak parametre olarak almalısınız, sonrasında IDataProtector bu Provider’ı dolduracaktır.
  • IDataProtectionProvider üzerinden protector oluşacak. Ancak bu protector oluşturulurken bir isim gerekmektedir. Veriniz şifrelenirken Data Protector’da oluşturulan bu ismi Primary Key gibi düşünebilirsiniz. Yani verdiğiniz isim aslında Primary bir değer olarak diğer protectorlardan ayrılır. Böylece diğer protectorlardan izolasyon sağlanmış olunur. İsim olarak ProductsController verilebilir. Hangi Controller’da kullanılıyorsa onun ismi verilebilir.

NOT : Şifrelemeyi hangi isimle yaptıysanız onla çözmeniz gerekir. Farklı bir isimle çözemezsiniz.

Bir sonraki yazımda ; şifreleme işleminden bahsedeceğim . Diğer yazıda görüşmek üzere…

Kaynakça