ASP.Net Core Projelerinde Güvenlik — IP Kontrol İşlemleri 1

Merhabalar 🙂

Bu yazımda WhiteList/Blacklist IP Control konusu ile ilgili toplamış olduğum bilgileri sizlerle paylaşacağım. Faydalı olması dileğiyle 🙂

  • Web projelerimize bu yazımda bahsedeceğim gibi bir IP kontrol mekanizması kurduğunuzda, uygulamanın güvenlik seviyesi otomatik olarak artmış olur. Çünkü artık Uygulamaya istek yapıldığında IP den gelen istek eğer bizim belirlediğimiz WhiteList içerisinde yer alan bir IP ise istek gönderimine izin verilecek, aksi halde izin verilmeyecktir.
  • Bu işlem uygulama seviyesinde veya Controller/Method seviyesinde gerçekleştirilebilir.
  • Uygulama seviyesinde gerçekleştirebilmek için Middleware katman eklememiz gerekir.
  • Controller/Method seviyesinde ise Service Filter kullanmak gerekir.
  • IP kontrol sadece uygulama seviyesinde değil; IIS,Load Balancer, Nginx seviyesinde de inşa edilebilir. Uygulamalarınız Window Server içerisinde ise, Inbound Firewall kuralı da eklenebilir. Ancak bunun şöyle bir dezavantajı vardır ;bu işlem ile tüm uygulamalarınız etkilenecektir.
  • Web uygulamanızın 200 sayfası var sadece 4 sayfada IP kontrol yapmak istiyorsanız metot seviyesinde de IP kontrolü yapılabilmektedir.
  • Bu kontrolleri oluşturmanız için öncelikle IPList adında bir class oluşturmanız gerekir. Bu class string dizi halinde bir WhitList property almalıdır.
  • Uygulama seviyesinde kontrolü yapacak IPSafeMiddleWare class oluşturmanız gerekir.
  • Sonrasında engellenmeyecek WhiteList listesi projenin appsettings.json içerisinde tanımlanması gerekir.
  • WhiteList anahtarı içerisinde localhost IP adresi tanımlanır.
  • Günümüzde IPV4 kullanılmaktadır. Günümüzle beraber IPV6 ‘ya geçiş yapılmaktadır. Windows vista ve üzeri bir sistem kullanıyorsanız local tarafına istek yapıldığında isteklerimiz ::1 üzerinden gelmektedir. Yani yukarıda ilk tanımladığımız adres IPV4 diğeri ise IPV6 tanımıdır.
  • Dependency Injection olarak appsettings.json içerisindeki WhiteList’i kullanabilmem için IPList adında bir sınıf oluşturmuştuk. Bu class üzerinden bu değerlere ulaşılacaktır.
  • appsettings.json ile IpList classının bağlanması Startup.cs’ de gerçekleşir. Bu işlem aşağıdaki gibidir.
  • IPSafeMiddleWare’ da öncelikle RequestDelagate oluşturmak gerekir. Ek olarak appsettings.json’daki IpList’i alabilmek için de aşağıdaki tanımlamalar yapılır.
  • Dependency Injection olarak bu iki tanımlanan alanı doldurmak gerekir. Bu işlem için IOptions’dan yararlanılır. Ve alanlar aşağıdaki gibi Constructor’dan yararlanılarak doldurulur.
  • IPSafeMiddleWare’de işlemlerin yapılabilmesi için Middleware olabilmesi için RequestDelegate tanımlamıştık. Her istekle beraber çalışması gereken Invoke isminde bir metot da olmalıdır.
  • Invoke ismi rastgele bir isim değildir. Middleware kodlanıyorsa, her gelen istekle Invoke bir kere çalışır.
  • Invoke metotu HTTPContext parametresi alacaktır.
  • Öncelikle bize gelen isteğin IP adresi reqIpAddress değişkeninde tutulmuştur.
  • Sonrasında hangi IP adreslerine izin verdiğimizin listesi isWhiteList değişkeninde tutulmuştur. Ancak Any() kullanılarak geri dönüşün true ya da false olması sağlanmıştır.
  • İstek yapıldığında gelen IP adresi ile oluşturduğumuz WhiteList içerisinde tanımlanan IP adresi eş mi değil mi kontrolü yapılır.
  • Eğer WhiteList içerisinde yoksa o zaman 403 Forbidden hatası verilir.
  • WhiteList içerisinde ise , Await’le beraber gelen istek next metodu ile devam edecektir. Next metodu eğer bir sıkıntı yoksa, context verilip bir sonraki Middleware’ye iletimi gerçekleştirir.
  • İşlemlerin tamamlanabilmesi için Startup.cs içerisinde bu Middleware’nin eklenmesi gerekir. Bunun için UseMiddleware kullanılır. UseMiddleware bir class istiyor ve bu kısma da yazılmış olan IPSafeMiddleWare classı verilir.
  • Debug yapıldığında istek gönderilen Localhost WhiteList içerisinde tanımlı olduğu için sıkıntısız bir şekilde yukarıdaki koddan geçilir.

Bir sonraki yazımda görüşmek üzere 🙂

https://github.com/KardelRuveyda/ASPNetSecurity kodları Github ‘da oluşturduğum Repository’den inceleyebilisiniz.

Kaynakça