.NET Core 3.0 ile Katmanlı Mimari


Merhabalar,

Bu uzun makalemde .NET Core 3.0 ile NextERP adlı bir mobil+web uygulamasının altyapısını hep birlikte hazırlayacağız. Öncelikle bilgisayarınıza aşağıdaki yazılımları yükleyiniz:

  1. Visual Studio 2019 version 16.3 Preview 1
  2. .NET Core 3.0 Preview 7+
  3. MongoDb
  4. NodeJS LTS
  5. Angular CLI 8+
  6. Ionic 4+

Projemize öncelikle backendi hazırlayarak başlıyoruz. Backendi katmanlı mimari ile hazırlayacağız. Bunun için mimarisel paternlerden Onion Architecture’ı (Soğan Mimarisini) kullanacağız. Ancak Service katmanını CQRS ile hazırlayarak Web API’yi generic yapacağız, bunun getirdiği avantajları kodları görünce zaten anlayacaksınız diye tahmin ediyorum.

Katmanlarımız

  1. NextERP.Model (entity’ler ve enum’lar burada bulunur)
  2. NextERP.Data (DbContext’imiz, model builder, generic repository ve unitofwork sınıflarımız burada bulunur)
  3. NextERP.Service (command’lar, query’ler ve command handler’lar burada bulunur)
  4. NextERP.Api (web apimiz burada bulunur; mobil uygulama ve web uygulaması bu katmanla iletişim kurar.)
  5. NextERP.Mobile (ionic mobil uygulamamız burada bulunur)
  6. NextERP.Web (angular web uygulamamız burada bulunur)
  7. NextERP.Tests (unit testlerimiz burada bulunur, Selenium Web Driver’ı da bu katmanda kullanabiliriz.)

Autofac ve AutoMapper

Tüm katmanlarda dependecy injection için IoC container’ı kullanacağız. Backend’de Autofac IoC container’ını kullanacağız. Ayrıca entity’lerimizle command ve query’lerimiz arasında otomatik veri ataması için AutoMapper’ı kullanacağız.

Üyelik Sistemi

Üyelik Sistemi için Microsoft ASP.NET Core Identity’yi kullanacağız. Böylece developerlarımız dahi müşterilerimizin şifrelerini bilemeyecek (yine de veri sorumlusunun dikkatli olması lazım 😉 ) .NET Core’daki Identity, IdentityServer4 paketleri ile SSO özelliği içeriyor ve Angular/Ionic uygulamaları JWT ile kolaylıkla güvenli hale getirilebiliyor.

No-SQL Veritabanı

Bu projede CosmosDB ve Firebase gibi sadece yurtdışı bulutlarında bulunan ve bundan dolayı KVKK’ya (GDPR) aykırılık oluşturan veritabanları yerine kendi sunucumuza yükleyebileceğimiz No-SQL veritabanlarından MongoDB kullanacağız.

Mail ve SMS Server

Üyelik sistemimizin göndereceği e-postalar ve sms’ler için KVKK gereği yurtiçi çözümler tercih edilmelidir. Bu nedenle SendGrid, Gmail, Office 365 gibi çözümlerden KVKK cezaları almamak için uzak durmak ve yurtiçi çözümleri tercih etmek gerekiyor.

Barındırma

Projemizin hostingi (barındırılması) için de KVKK gereği yurtiçi sunucuları tercih etmemiz gerekiyor. Kurumunuz bünyesinden yayın yapmak için duyduğum kadarıyla ruhsat gerektiğinden ülkemizdeki profesyonel hosting firmaları ile çalışmanız, yurtiçi bulutlardan sanal sunucu kiralamanızı tavsiye ederim. Sunucularınızın önünde IPS özellikli firewall olduğundan emin olunuz. Kritik önemde bir proje yapıyorsanız DDOS saldırılarını önleyen çözümler de kullanınız. Hosting firmanızla bilgisayarınız arasında iletişim için VPN kullanınız, VPN kullanmadan uzak masaüstü erişimi açmayınız.

SSL sertifikası

Kullanıcıların kişisel verilerini korumak için API katmanımızın forward secrecy güvenliği yapılmış SSL sertifikasını kullanarak HTTPS üzerinden yayın yapması ve Web katmanındaki Angular projemizin de HTTPS üzerinden yayın yapması kritik önemdedir. Bu arada TLS 1.3 kullananlara 0-RTT özelliğinin Web API’lerde replay saldırısına yol açabildiğini hatırlatmak istiyorum. Bu nedenle TLS 1.3 kullanacaksanız 0-RTT’yi kapalı tutmanızda fayda var.

CDN (Content Delivery Network) Kullanmıyoruz

CDN’lerin güvenlik zayıflığı oluşturduğunu hatırlatalım. Uygulamamızın yurtdışına bağımlılığını azaltmak için CDN kullanmak yerine kütüphaneleri projemize dahil edip o şekilde kullanmayı tercih edeceğiz.

Yedekleme ve Kaynak Denetimi

Veritabanı yedeklemesinin otomatik yapılması için başından yurtiçinde güvenli bir storage’a yedekleme sistemi kurmanızı öneririm. Kaynak denetimi için biz şimdilik GitHub kullanacağız, fakat size kurumunuz bünyesinde TFS (Team Foundation Server) gibi yerel bir Git çözümü kullanmanızı öneririm; böylece kodlar her zaman elinizin altında olur. TFS’in çökme ihtimaline karşı çalışmalarınızı güvenli bir ortamda yedeklemeyi ihmal etmeyiniz.

Cache için Redis

Daha önce Redis kullanmadım ama bu projede Redis’i deneyimlemek için bir örnek kullanım eklemek istiyorum. Net Core’un içindeki In-Memory cache özelliğinden farklı olarak Redis bize cluster ortamlarında da paylaşımlı yüksek performans cache imkanı sağlıyor diye biliyorum. Bu nedenle piyasada yaygın olarak kullanılıyor, biz de kullanmayı deneyeceğiz.

KVKK ve Audit Logging

KVKK gereği Data katmanımıza Audit Logging ekleyeceğiz. Hataları loglamak için yine yurtdışı bulut çözümleri yerine KVKK nedeniyle kendi MongoDB veritabanımızı tercih edeceğiz. Audit loglarının raporlanabilmesini de sağlamamız gerekiyor. KVKK aslında sadece değişikliklerin değil kişisel verilere yapılan okuma işlemlerinin de loglanmasını gerektiriyor, hatta belki de bunu veritabanı seviyesinde yapmak bile gerekebilir ki böylece müşterilerimizin kişisel verilerine kimler tarafından, ne zaman, ne amaçla erişim sağlandığının raporunu verebilelim.

Çalışma Ortamı Güvenliği

Hacker’lara ve yapay zekalara karşı önlem almak amacıyla çalışma ortamınızı da güvenli hale getirmelisiniz. Şirketinizin IPS özellikli kaliteli bir firewall kullanması, Wi-Fi yerine kablolu networkü tercih etmek veya Wi-Fi’lerde mac adresi filtrelemesi yapmak, sunucularda, bilgisayarlarda ve telefonlarda ücretli ve kaliteli antivirüs yazılımları kullanmak, şifrelerin güvenliğine dikkat etmek, çalışmalarınızı şirket içinde (ve felâket planlaması gereği bir kopyasını da şirket dışında) güvenli bir storage’a düzenli olarak yedeklemek gibi alınabilecek çeşitli güvenlik önlemleri var, bunları ihmal etmeyiniz. Felâket planlaması gereği production’daki uygulamanızı ve veritabanınızı da yurtiçinde farklı bir şehirde güvenli bir lokasyona düzenli olarak yedeklenmesi oldukça önemlidir. Yedeklere erişimler de güvenli olmalı ve yedekleme güvenli bir ağ (VPN veya doğrudan bağlantı) üzerinden yapılmalıdır.

Makalemiz devam edecek…

Reklam

Blockchain, CosmosDb and GDPR Logging


Dear developers,

I want to discuss my idea about to use CosmosDb single collection (which costs begin from ~$25/month) as GDPR blockchain logging to do following goals:

  • Tracking access to data – who accessed what and when. If access to data goes through a unified interface (UI and/or API), you can track all access to data and thus manifest that only the authorized personnel have read the data. That means, though, that search results in your CRM-like system should not contain too much information, otherwise tracking would be more complicated, as the back office user sees data about multiple data subjects on one page
  • Tracking data modifications – one of the principles of GDPR is “integrity” – you have to keep the data correct, so any modification should be logged. That way, you can reconstruct an old state or prove the modifications happened for a reason. This, again, relies on having a centralized interface.
  • Logging GDPR-specific activities – e.g. when the data subject invokes their rights. Each request can be securely logged so that you can prove to authorities the exact sequence of events relating to particular data subject
  • Logging consent and the accompanying circumstances – date, time, IP address, etc. Then you can also log consent withdrawal, and the history of consent of the data subject will be visible in one place and you will be able to prove to regulators when you had and when you didn’t have consent for processing.

Just we need to integrate this blockchain logging to our n-Tiered .NET Core solution, probably in our generic repository or at database-level for example using triggers.

By doing this logging we can give reports to our customers about data usage. But this solution does not secure our customers’ data from hackers.

To protect personal data from hackers we must store our production database in least accessible server. Only the application and the senior developer(s) should access the production database, and of course all of them should use secure channels to access the production db and app such as VPN. All computers, phones and tablets must use antivirus programs. SSL must use forward secrecy, TLS 1.3 must prevent 0-RTT property to prevent replay attacks.

Consider to DDOS attack protection for your company and servers on the cloud for possible attacks.

Backups must be stored in secure storages.

Thanks to GDPR that it increases the quality of developer and development processes.

Happy coding 🙂