Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core – Hassas Verilerin Korunması(Secret Manager Tool)

Merhaba,

Web uygulamalarında development ortamında kullandığımız bazı verilerimizin canlıya deploy edilmesini istemeyebiliriz. Bu verilerimiz; veritabanı bilgilerini barındıran connection string bilgisi, bir kritik arz eden token değeri yahut Facebook veya Google gibi third party authentication işlemleri yapmamızı sağlayan client secret id değerleri olabilir. Bu veriler development ortamında kullanılırken, production ortamında kötü niyetli kişilerin uygulama dosyalarına erişim sağladıkları durumlarda elde edemeyecekleri vaziyette bir şekilde ezilmeleri gerekmektedir. İşte bunun için Secret Manager Tool geliştirilmiştir.

Secret Manager Tool Nedir?
Web uygulamalarında statik olan verileri tekrar tekrar yazmak yerine bir merkezde depolayarak kullanmayı tercih ederiz. Asp.NET Core uygulamalarında bu merkez genellikle ‘appsettings.json’ dosyası olmaktadır. Bu dosya içerisine yazılan değerler her ne olursa olsun uygulama publish edildiği taktirde çıktıdan erişilebilir vaziyette olacaktır. Dolayısıyla bizler statik verilerimizi ‘appsettings.json’ içerisinde tutabiliriz lakin kritik verilerimiz için burasının pekte ehemmiyetli bir yer olmadığı aşikardır.

Development sürecinde kritik verilerimizi Secret Manager Tool’un sağlamış olduğu ‘secrets.json’ dosyası sayesinde uygulamadan ayırabilir ve böylece ‘appsettings.json’a erişilse dahi kritik verilerimize erişilemeyeceğinden dolayı güvenli bir şekilde depolamayı sağlamış oluruz. Her ne kadar ‘secrets.json’ dosyasındaki veriler uygulama içerisinde tutulmasada, runtime’da uygulama ayağa kaldırıldığı anda ‘appsettings.json’ dosyası ile ‘secrets.json’ dosyası birleştirilerek ilgili veriler uygulama için erişilebilir olacaktır. Nihayetinde kritik verilerin kötü niyetli kişiler tarafından erişimine kesin bir engel koyulmuş olunacaktır.

Secret Manager Tool’a erişebilmek için uygulamaya sağ tıklayarak ‘Manage Usage Secrets’ sekmesine tıklayınız.
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)
Bu kombinasyon neticesinde karşınıza ‘secrets.json’ dosyası gelecektir. İşte bu dosya bizim için hassas verilerin barındırılacağı nitelikte olan mevzu bahis dosyadır…

{
  "ConnectionString": "Server=123.321.234.212;Database=ExampleDb;User Id=sa;Password=123321;"
}

Görüldüğü üzere ilgili dosyaya örnek olarak bir connection string bilgisi koyulmuştur. Uygulamayı publish edip ‘appsettings.json’ dosyasına göz atarsanız eğer bu verinin orada olmadığını göreceksiniz.
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)

Lakin uygulamayı development ortamında çalıştırdığınızda ‘secrets.json’ da ki veriye ulaşılabilecektir.
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)

Şimdi burada aklınıza muhtemel iki soru gelmiş olabilir.

  • 1. Soru : ‘secrets.json’a sadece development ortamından ulaşılabildiğinden bahsedildi. Peki production ortamından ulaşılmak istenseydi?
  • 2. Soru : ‘secrets.json’ uygulama içerisinde tutulmuyorsa o halde nerede tutuluyor?

Sorulara tersinden cevaplayarak başlayayım 🙂

2. Sorunun Cevabı : ‘secrets.json’ dosyasına yazılan değerler uygulamanın içerisinde tutulmamakta, uygulamanın geliştirildiği bilgisayarda ‘C:\Users\name\AppData\Roaming\Microsoft\UserSecrets‘ dizininde tutulmaktadır. İlgili dizine girildiği taktirde
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)
görünümünde bir klasör içeriğiyle karşılanabilirsiniz. Burada hangi klasörün ilgili projenizin secret keyini barındırdığını merak ediyorsanız projenizin .csproj dosyasına göz atmanız yeterli olacaktır.
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)
‘secrets.json’ dosyasına yapılan herhangi bir kayıt neticesinde buraya ‘UserSecretsId’ değeri atanmaktadır. Bu değer eşliğinde uygulamanıza ait secret keylerin hangi dizinde olduğunu rahatlıkla bulabilirsiniz.
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)
İşte bulduk 🙂 İlgili dizine gelip içerisindeki dosyayı not defteriyle açarsanız eğer secret key’e erişebilirsiniz…
Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)

1. Sorunun Cevabı : Production ortamında ‘secrets.json’a erişilememektedir. Lakin bu durum production’da ‘appsettings.json’ kullanılacak anlamına gelmemektedir. Bunun için environment değişkenler kullanılmalıdır. Misal olarak, Docker ile production ortamda uygulamayı ayağa kaldırıyorsanız eğer docker run --rm -p 1071:1453 --env ConnectionString="asdasdasdasd" --name cont1 secretexample:v1 komutuyla environment’ı belirleyebilirsiniz.

‘appsettings.json’ İle Birlikte ‘secrets.json’ Kullanımı
Bazen uygulamalarda hem ‘appsettings.json’ hem de ‘secrets.json’ dosyalarını aynı anda kullanmayı tercih edebiliriz. Örneğin; ‘appsettings.json’ dosyası connection string bilgisinin genel geçer yolunu, ‘secrets.json’ ise şifresini tutsun istiyorsanız aşağıdakine benzer bir kullanım sergileyebilirsiniz.

-- appsettings.json --
{
  "ConnectionString": "Server=123.321.234.212;Database=ExampleDb;User Id=sa;",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
-- secrets.json --
{
  "SQLPassword": "123321;"
}
            string connectionString = configuration["ConnectionString"];
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
            builder.Password = configuration["SQLPassword"];

            connectionString = builder.ConnectionString;

Asp.NET Core - Hassas Verilerin Korunması(Secret Manager Tool)

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

4 Cevaplar

  1. Bedirhan dedi ki:

    Güzel bilgi, emeğinize sağlık.

  2. Enes dedi ki:

    Makale için teşekkürler fakat merak ettiğim bir konu var. Uygulamayı docker üzerinden değil de publish edip hosta attığımıza varsayarsak connectionstring’i gizlemek için nasıl bir yol izlememiz gerekiyor?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir