ASP.Net Core Projelerinde Güvenlik — Secret Protection

Herkese Merhabalar,

Önceki yazımda ASP.Net Core projelerinde IP kontrol işlemleri ile ilgili topladığım bilgileri sizlerle paylaşmıştım. Bu yazımda ise projemizdeki hassas verileri nasıl koruyabileceğimiz ile ilgili topladığım bilgileri sizlerle paylaşacağım. Faydalı olması dileğiyle . 🙂

Haydi Başlayalım 🙂

Bir proje geliştiriğimizi düşenelim, projeyi .NET Core ile geliştirdiğimizi varsayalım. Sizce bu proje için hassas bilgilerimiz neler olabilir ?

  • Token
  • Connection String
  • Facebook/Google/Microsoft Client ID / ClientSecret vb.

dediğinizi duyar gibiyim 🙂 . Pekalaa, o zaman şimdi de şunu düşünün, projenizi Local ortamdan Prod ortama taşımak istiyorsunuz. Sizce bu özel bilgilerin canlıya deploy edilmesi sıkıntı teşkil eder mi ? Canlı derken sadece bir uygulamanın test veya stage ortamlarından canlıya alma işlemi gibi düşünmeyin. En basitinden küçük bir proje geliştiriyorsunuz. Ve projede bazı veri tabanı bilgilerimiz Connection String olarak tutuluyor. Ve biz de bu bilgilerimizin bulunduğu projeyi, Github’ da paylaşıyoruz. Acaba bizim için sorun teşkil eder mi?

  • Öncelikle projemizde tuttuğumuz bazı özel, hassas bilgiler .NET Core projelerinde appsettings.json içerisinde tutulur. .NET Core bazlı değil de ASP.NET MVC projesi olarak düşünseydik de bu bilgiler Web.Config dosyasında tutulacaktı.
  • Oluşturduğumuz bu Connection String, appsettings.json ile beraber Github’a gönderilebilir veya canlı ortama alınabilir. Ee peki beraberinde ne olur ? Username ve Password bilgilerimiz rahatlıkla buradan tespit edilebilir.
  • İşte tam bu noktada; “Hassas verilerin deploy edilmemesi gerekir.” sözü aklımızdan çıkmamalıdır.
  • Bunun için Microsoft .NET Core tarafından geliştirilen Secret Manager Tool kullanır. Microsoft’un sağladığı bu özellik sayesinde appsettings.json içindeki değerler güvenli olarak tutulabilir.
  • Veri tabanına bağlama işlemi gerçekleştireceksek, appsettings.json içerisine Connection String eklememiz gerekir
  • Yanlışlıkla uygulama yayınlanırsa veya Github’a atılırsa Connection String de appsettings.json ile beraber canlı ortama gönderilmiş olur. Ve tam bu noktada bu alanda bir güvenlik açığı oluşur. Çünkü kötü niyetli kullanıcılar Connection String verilerini rahatlıkla alabilir. Github’ da da aynı şekilde eğer repository private değilse bu bilgileri almak hiç de zor değildir.

Secret Manager Tool aslında şunu söylüyor, eğer senin hassas bilgilerin varsa bunları appsettings.json da tutma!

  • Hassas bilgilerimizi Appsettings.json alanında tutmak yerine, secret.json dosyalarında tutabilmek için Solution projemize sağ tık yaparak “Manage User Secrets” alanından secret.json dosyasını açabiliriz.
  • Açtığımız bu alana da Connection String’i gönül rahatlığı ile yazabiliriz 🙂 Bu json dosyasını hiçbir şekilde başkaları görmeyecektir.
  • Secret.json uygulama root’u içerisinde tutulan bir değer değildir. Bu değerler dosyanın tutulduğu ağacın dışında bir yer de tutulmaktadır. Uygulama development ortamında çalıştığı takdirde secret.json ile appsettings.json -birleşerek proje ayağa kalkar. Ve başarılı bir şekilde development ortamında okuma işlemi gerçekleşir.
  • appsettings.json içerisindeki değerler Startup.cs içerisindeki ConfigureServices üzerinden okunur.
  • Secret.json da ConnectionStrings ve Passwords alanını aşağıdaki gibi tutabilirim.
  • Ancak bunu Secret.json içerisinde nasıl tanımladıysam Startup.cs içerisindeki ConfigureServices alanında aşağıdaki gibi bunu karşılamam gerekir.
  • Debug işlemi gerçekleştirirken; conString olarak tanımladığımız alana QuickWatch ile baktığımızda, secret.json içerisindeki Password alanının geldiğini göreceksiniz 🙂

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

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

Kaynakça