Azure Key Vault

Giriş

Uygulama geliştirken çeşitli bileşenlerle haberleşmek için örneğin Database credantial bilgilerine, API anahtarlarlarına ya da erişim bilgilerine ihtiyaç duyarız. Birçok projede bu hassas bilgiler hard coded olarak kodun içerisinde ya da config dosyalarında tutulurlar.

Kaynak kodlarımızı repo’ya gönderdiğimiz anda commit’lerle beraber gizli bilgilerde beraberinde gönderilmiş olur. Repo’ya erişim kısıtlamaları ile belirli bir seviyede güvenlik elde edilmiş olsada güvenliği ihlal edebilecek birçok senaryo oluşabilir. Sunucunun ya da kaynak kodların bir şekilde ele geçirilmesi, ekipten birilerinin ayrılması, istenmeyen kişilerin bilgilere erişmesi gibi durumlarda güvenlik ihlalleri oluşabilir.

Daha güvenli uygulamalar geliştirmek istiyorsak hassas bilgileri uygulamada açık bir şekilde tutmamamız gerekmektedir.

Peki hassas bilgilerimizi nerede tutacağız ve nasıl erişeceğiz?

Bunun için birçok yöntem mevcut. Bugün Microsoft’un bize sunduğu Azure Key Vault servisi ile hassas bilgilerimizi nasıl daha güvenli bir hale getirebileceğimizi inceleyeceğiz.

Azure Key Vault hassas bilgilerin depolandığı ve erişilebildiği bir sunucuda güvenli hale getirilmiş gerçek depolardır. Bu bilgiler belirli algoritmalarda şifreleyebilir ve rol bazlı yekilendirme ile kullanıcılara farklı tipte yetkiler verebiliriz.

Kullanıcılara sadece okuma yetkisi vererek, yöneten kişilere yazma ve silme yetkisi verebiliriz. Bu sayede key ve secret’lar için yöneten kişiler ile kullanan kişileri yetki bazlı ayırmış olur. Bunun yanında Azure Key Vault bize secret ve key’ler için kullanım raporları verebilir.

Azure Key Vault’un gerçek gücü, Azure‘un diğer hizmetleri ile sorunsuz entegrasyon sağlamasıdır. Hiç kod yazmadan diğer Azure servisleri ile Azure Key Vault’u kullabiliriz.

Source: https://techcommunity.microsoft.com/

Azure Key Vault Nedir?

Azure Key Vault, şifreleme anahtarlarını ve gizli dizileri tek bir merkezi güvenli kasada depolamamıza ve yönetmemize olanak tanıyan bir hizmettir.

Azure Key Vault Azure Active Directory ile entegre çalışan bir Azure PaaS hizmetidir.

Azure CLI, RestAPI ve Powershell kullanarak Key Vault’u yönetebilmemize olanak tanır.

Tüm hassas veriler fiziksel donanım güvenlik modüllerinde (HSM) — FIPS 140–2 Seviye 2 sertifikalı — verilerin sanal makineler tarafından veya doğrudan HSM’de şifreleneceği veri merkezinde depolanır.

Merkezi anahtar kasası, bu anahtar deposunun izinlerini yöneten ve sırların güvenliğini sağlamaktan sorumlu olan Key Vault sahibi tarafından güvenli bir şekilde yönetilebilir.

Azure Key Vault benzersiz bir sürüm oluşturma motoruna sahiptir. Tüm Secret ve Key’leri arşivlemenize ve daha sonra bir sürüm kimliği kullanarak geri almanıza olanak tanır.

Microsoft Azure Key Vault hizmeti, aşağıdaki güvenlik konularına odaklanır;

  • Secret(Gizli Bilgi): Güvenli bir şekilde depolama ve yetkilendirme ile kimlik doğrulama bilgileri, API anahtarları, paralolar, token ve diğer hassas bilgilerin tutulması için kullanılır.
  • Key(Anahtar): Verilerin şifrelenmesi için şifreleme anahtarlarını yönetmek için kullanılabilir.
  • Certificate(Sertifika): Azure tümleşik hizmetleriyle kullanım için sorunsuz bir şekilde SSL / TLS sertifikaları sağlamanıza, yönetmenize ve dağıtmanıza olanak tanır.
source:codeproject.com

Azure Key korumasına göre iki katmandan oluşmaktadır.

  • Standart Tier: Şifreleme anahtarlarını, sırları, sertifikaları ve depolama hesabı anahtarlarını depolamak ve yönetmek için Yazılım kasalarını kullanır. Bu, FIPS 140–2 seviye 2 (kasalar) ile uyumludur.
    Yazılımla korunan anahtarlar, sırlar ve sertifikalar, endüstri standardı algoritmalar ve anahtar uzunlukları kullanılarak Azure tarafından korunur.
  • Premium Tier: HSM destekli şifreleme anahtarlarını depolamak ve yönetmek için Yönetilen HSM (Hardware Security Module) Havuzu kullanır. Bu, FIPS 140–2 seviye 3 (yönetilen HSM havuzları) ile uyumludur.

HSM hakkında daha detaylı bilgi için wikipedia linkini inceleyebilirsiniz.

Azure Key Vault Neden Kullanılmalı?

- Uygulama içerisinde hassas bilgilerin merkezileştirilmesi

Azure Key Vault’ta uygulama içerisinde hassas bilgilerin depolanmasını merkezileştirmek, dağıtımlarını denetlemenize olanak tanır. Key Vault kullanırken, uygulama geliştiricilerin artık uygulamalarında gizli bilgileri kodun bir parçası olmaktan çıkarıp bir kasada (Vault) tutarak daha güvenli yapılar inşa edebilmelerini sağlar.

Örneğin, bir uygulamanın bir veritabanına bağlanması gerekebilir. Bağlantı cümlesini uygulamanın kodunda saklamak yerine, Key Vault’ta güvenli bir şekilde saklayabilirsiniz. Bu sayede kaynak kodlar ele geçerilse bile veritabanı bağlantınız güvenli halde kalacaktır.

Uygulamalar ihtiyaç duydukları bilgilere URI’leri kullanarak güvenli bir şekilde erişebilir. Bu URI’ler, uygulamaların gizli bilgilerin belirli sürümlerini almasına izin verir.

- Secret ve Key’lerin güvenli bir şekilde saklanması

Secret ve Key’lere erişim sağlanabilmesi için kimlik doğrulama ve yetkilendirme gerekmektedir. Bu Azure Active Directory aracılığıyla yapılır. Yetkilendirme, Azure rol tabanlı erişim denetimi (Azure RBAC) veya Anahtar Kasası(Key Vault) erişim ilkesi aracılığıyla yapılabilir. Kişi ya da uygulamanın Key Vault’a erişebilmesi için uygun kimlik doğrulama ve yetkilendirmeye sahip olması gerekmektedir.

- Erişim ve kullanımı takip etme

Key ve Secret’leri güvenli bir şekilde depolayıp belirli yetkilerle kullanıcı ve uygulamaların erişimine açtık. Hassas ve kritik bilgilere kimlerin eriştiğini görmek ve bunları takip etmek isteyebiliriz. Azure Key Vault bize günlük olarak etkinlikleri takip edebileceğimiz bir altyapı sunar.

Günlükleri takip edebilmek için;

  • Bir depolama hesabına (Azure Storage) gönderebiliriz.
  • Stream olarak EventHub’a aktarabiliriz
  • Log’ları Azure Monitor Log’lara gönderebiliriz.

- Diğer Azure servisleri ile kolay entegre edilmesi.

Azure Key Vault diğer Azure servisleri ile farklı senaryolar için kullanılabilir.

  • Azure Disk Şifrelemesi.
  • SQL Server ve Azure SQL veritabanında her zaman şifrelenmiş ve Saydam veri şifrelemesi işlevi.
  • Azure App Service ile entegre kullanılabilir.

Şimdi Azure Portal’da Key vault oluşturarak örnek bir Azure Functions projesinde tanımladığımız bir secret bilgisine nasıl ulaşacağımızı adım adım inceleyelim.

Portal üzerinden Azure Key Vault oluşturulması

  1. Portal üzerinde Azure Key Vault araması yaparak create diyoruz.
    Basics ekranında West Europe Region’ınını seçerek Standard Pricing Tier’ı seçiyoruz.

2. Access Policy ekranında Access tiplerini, Permission model’i ve kullanıcı için Key, Secret ve Sertifika yaratırken hangi yetkileri kullanabileceğini tanımlıyoruz.

3. Networking ekranı burada Key Vault’a hangi method ile bağlanacağımızı tanımlıyoruz. Örneğimizde Public endpoint olarak devam ediyoruz.

Bir sonraki adımda Create diyerek servisimizi oluşturuyoruz.

Oluşan resource’a gittiğimizde Overview sekmesinde key vault’umuz için URI adresinin oluştuğunu göreceksiniz.

Sol menude işaretli alanlardan Keys, Secrets ve sertifikalar ile policy tanımlamalarını yapabilirsiniz.

Azure Function projesinde Key Vault Kullanımı

Şimdi örnek bir Azure Functions projesinde Azure Key Vault’da tanımladığımız secret’ları nasıl ulaşabileceğimizi görelim.

source: www.middleway.eu

Öncelikle Azure Key Vault’da secret bölümünde bir adet sqlconnectionstring oluşturalım. Bu ekranda dilerseniz aktivasyon tarihi ve bitiş tarihi tanımı yapabilirsiniz.

Value = “Password=demopass;Persist Security Info=True;User ID=azurekeyvaultdemo;Initial Catalog=demoKeyVault;Data Source=localhost”

Secret’ımızı oluşturduk şimdi Azure Function oluşturalım ve secret’ımızı kullanalım.

AzureKeyVaultdemoFunction isminde bir function oluşturalım.

Azure Function’dan Key Vault’a bağlanabilmek için öncelikle Managed Identity’i açmamız gerekiyor.

Managed Identity hakkında daha fazla bilgi için aşağıdaki link inceleyebilirsiniz.

Bu sayede Function App Azure Active Directory’e register etmiş oluyoruz.

Bu işlemi tamamladıktan sonra Function App’mize Azure Key Vault’da Access Policy tanımlayabiliriz. Access Policy tabından Add Access Policy diyoruz.

Burada Principal için Azure Function’ımızı seçiyoruz ve Key ve Secret için gerekli izinleri tanımlıyoruz. Key için Get ve Secret için Get ve List izinlerini tanımlayıp add diyelim.

Her bir secret için benzersiz bir tanımlayıcı(Identifier) oluşur. Oluşturmuş olduğumuz secret’ın (SqlConnectionString) Current Version’a giderek bu Secret identifier’ı kopyalayalım.

Bunu artık Azure Function App Settings’de kullanabiliriz. Key Vault’u kullanabilmek için aşağıdaki gibi tanımlama yapmamız gerekmektedir.

@Microsoft.KeyVault(SecretUri=SqlConnectionString secret identifier)

Function’ın Configuration sekmesinde New Application Settings diyerek secret’imizin tanımını yapıyoruz. Azure Function uygulamımızdan bu bilgiye ulaşmaya çalışacağız.

Şimdi Function App içerisine bir adet function oluşturalım. Portal üzerinden Functions > Add diyerek yeni bir HttpTrigger1 adına function oluşturuyorum.

Daha sonra Functions > HttpTrigger1 > Code + Test sayfasına gidelim. Function içerisinde secret olarak eklediğimiz ve Application Settings’de tanımladığımız SqlConnectionStringSecret değerini okuyalım.

var sqlconnection = Environment.GetEnvironmentVariable(“SqlConnectionStringSecret”, EnvironmentVariableTarget.Process);

Üstteki Test/Run butonuna tıklayarak yan panelde açılan ekranda Run diyelim.

HttpTrigger Fonsiyonumuza istekte bulunduğumuzda beklediğimiz gibi key/Vault da tanımladığımız secret bilgisine ulaştık. Artık uygulama içerisinde ConnectionString bilgisine ulaşıp gerekli bağlantı işlemlerini yapabiliriz.

Sonuç

Azure Key Vault, Cloud ortamında hassas bilgileri depolamak için güvenli anahtar yönetimi sunan, güvenilir ve yönetimi kolay özellikler sağlar. Gizli bilgilerimizi, sertifikalarımızı ve anahtarlarımızı kolay bir şekilde oluşturup saklayabiliriz.

Uygulamalardaki güvenliği arttırmak için kaynak kodun içerisinde hassas bilgileri eklemeden güvenli bir kasada bu bilgileri tutabilirsiniz. Rol bazlı yetkilendirme ile uygulamalara ve kişilere gerekli izinler vererek hassas bilgiler üzerinde işlem yapmayı sağlayabiliriz. Ayrıca bu bilgilerin erişiminin kolay bir şekilde günlüklere kaydediliyor olması yetki aşımı ve kullanım raporları için işimizi kolaylaştırmaktadır.

Altyapı ile uğraşıyorsanız IaC (Infrastructure as a Code), CI/CD süreçlerinde ya da Azure servisleri kullanımı gibi farklı senaryolar için key vault ile çalışarak hassas bilgilerinizi daha güvenli bir hale getirebilirsiniz.

Uygun maliyetli ve yönetilebilirlik açısından her bir Resource Group ya da Uygulama için bir tane key vault üretilmelidir.

Bir sonraki makalede görüşmek üzere…

Sorularınız için lütfen yorum yapmaktan ve bana ulaşmaktan çekinmeyin.

Twitter: https://twitter.com/ufukaytas
Linkedin: https://www.linkedin.com/in/ufukaytass/
Github: https://github.com/ufukaytas/

--

--

Ufuk Aytaş
Devops Türkiye☁️ 🐧 🐳 ☸️

Software Architect & Developer @CorendonDutchAirlines, Husband, Dad, Fishing, Coffee addict :) #Serverless #Cloud, #Azure, #Dotnet