SAML (Security Assertion Markup Language) Nedir?
Published on 22 Mar 2021
· Around 20 minutes to read
SAML, kimlik sağlayıcının (IdP - Identity Provider), doğrulanmış kullanıcı bilgilerini servis sağlayıcıya ileten açık bir iletişim standartıdır. Tekil kullanıcı doğrulama işlemleri için (SSO - Single Sign-On) vazgeçilmez iletişim yapılarının başında gelir.
İletişim dili ve yapısı olarak XML'i kullanır. Bütün veriyi veya verinin bir kısmını şifreleyerek, IdP ve SP arasında ortak bir sertifika ile iletişimi ve veri bütünlüğünü garanti altına alır.
Bu iletişim standardını detaylı bir şekilde açıklamadan önce konsept olarak kullanmış olduğu terimlerden biraz bahsedelim.
Identity Provider (IdP) - Kimlik Sağlayıcı
SAML'da her zaman bir IdP ve bir de SP vardır. IdP bu roldeki kimliği doğrular, hazırladığı veriyi imzalayarak ve SP'ye iletir. Bu imzalama işlemini bir sertifika ile gerçekleştirir. Bu sertifikanın herkes tarafından okunabilir halini (Public Key) öncesinde SP ile paylaşır.
Burada bir imzalama işleminden bahsediyoruz fakat bu opsiyoneldir. IdP ve SP aralarında anlaşıp bu iletişimin imzalı bir şekilde olmamasını isteyebilir. Tabii ki bu kesinlikle önerdiğimiz bir yöntem değil. İmzalı olmayan bir iletişim başkaları tarafından kopyalanıp yeniden oluşturulabilir.
IdP'nin oluşturduğu verinin içerisinde kullanıcıya ait olan, Kullanıcı Adı, Ad, Soyad, Email adresi gibi bilgiler olabilir. Fakat kesinlikle parola verisi gibi bilgiler bulunmaz.
IdP bu bilgiyi yine aralarında anlaştıkları bir adrese iletir. Bu adresin SAML'daki karşılığı Assertion Consumer URL olarak bilinir. IdP bilgiyi SP'ye ilettikten sonra IdP'nin görevi biter.
İlerleyen kısımlarda IdP Initiated ve SP Initiated kavramlarından da bahsedeceğiz.
Service Provider (SP) - Servis Sağlayıcı
SP ise IdP'nin gönderdiği kimlik verisinin öncelikle belirli gereksinimleri karşılayıp karşılamadığını kontrol eder. Sonrasında içerisinde bulunan kullanıcı bilgileri ile yapması gerektiği işleme karar verir ve kullanıcıyı duruma göre içeri alır.
Burada SP'nin yapmakla görevli olduğu şeylerden birisi, veriyi okumuş olsa da sertifika ile içeridiği verinin imzasını kontrol etmektir. Eğer veri sertifika imzasına uymuyorsa kesinlikle kullanıcıyı içeri almamalıdır.
SP ile IdP arasında karşılaşılan bir çok temel problem olabilir. Bu problemleri bertaraf etmenin ve izlemenin birincil yolu kullandığınız dile uygun kendini ispatlamış SAML kütüphanelerini kullanmak olabilir.
Gelen veri içerisinde SP'nin kullanıcıyı içeri alması için gereken bütün bilgi bulunur.
İletişim Sertifikası
İletişim sertifikası bir private (özel) bir de public (genel) bir sertifika ile çalışan bir yapıdır. Bu yapıda private key ile imzalanan bir veri public key ile doğrulanabilir.
Bu noktada iletişimi düşündüğümüzde gönderilen veri imzalanır derken private key ile oluşturulan ve public key ile doğrulanabilen bir imza verisinden bahsediyoruz. Public key'i SP'ye verdiğimiz senaryoda SP gönderilen bilginin doğrulamasını yaparak bu bilgiyi gerçekten IdP'mi göndermiş bunu anlayabiliyor.
IdP Initiated ve SP Initiated
IdP ve SP arasındaki iletişimi anlatırken dikkat ederseniz hep IdP'den SP'ye bilgi akışı olarak anlattık. Burada aslında iletişimi hangi tarafın başlattı çok önemli. Bu terimler ise birincil olarak bunu anlatıyor. IdP Initiated, IdP tarafından başlatılan iletişimi, SP Initiated ise SP tarafından başlatılan iletişimi ifade ediyor.
Burada iletişim IdP tarafından başlatıldığında tek taraflı bir iletişim oluyor. Çünkü hazırlnamış ve kullanıcıya iletilecek bilgi zaten IdP tarafından oluşturulduğu için SP'nin bana bu veriyi hazırla demesine gerek kalmıyor. Haliyle IdP hazır bilgiyi doğrudan SP'ye daha önce belirtmiş olduğumuz Assertion Consumer URL üzerinden gönderiyor. Bu gönderim tabii ki basit HTTP metodları üzerinden oluyor.
Bu iletişim SP üzerinden başlatıldığında ise öncelikle SP niyetini IdP'ye bildiriyor (Intent). Bu niyete göre de IdP SP'ye gereken cevabı dönüyor. Dikkat ederseniz IdP'de doğrudan iletişim varken, SP'de ise önce niyeti bildiren bir istek, sonrasında ise IdP'nin döndüğü cevap ikinci istek olarak var.
Single Sign-On
SAML'ı incelerken karşınıza çokça Single Sign-On (SSO) konusu çıkacaktır. Bunun sebebi, SAML çoğunlukla SSO işlemi için kullanılan oturum mekanizmalarından biridir. En büyük faydalarından biri kullanıcıyı tekrar tekrar oturum açma zahmetinden kurtararak ciddi bir zaman kazandırmaktır. SSO ile kullanıcı aynı zamanda hangi uygulamadan oturum açtığını (tekilleştirilmiş oturum ekranı) bilir. Güvenmesi gereken, kullanıcı adı ve parolasını girmesi gereken tek ekran vardır. Tekrar tekrar bu bilgileri farklı uygulamalara girerek oluşan güvenlik zaafiyetlerinin önüne geçmiş olursunuz.
Örneklerle bir SAML Entegrasyonu
Konuyu daha iyi irdelemek için bir örnek ile SAML entegrasyonunun nasıl yapılabileceğine bakalım.
Biz örneği MonoSign üzerinden gerçekleştireceğiz. Sizler de benzer ayarları kullanarak kullanmış olduğunuz IdP ile bu entegrasyonu gerçekleştirebilirsiniz.
SP için ise Workplace uygulamasını kullanacağız (Workplace iş yerleri Facebook tarafından hazırlanan ve SAML desteği olan bir platform). Siz de örnek olarak herhangi bir SP kullanabilirsiniz.
MonoSign - (IdP) Üzerinde bir uygulama oluşturmak
MonoSign bize uygulamalarımızı hızlıca oluşturabileceğimiz ekranlar sunuyor. Ben bu ekranlar üzerinden uygulamamı tanımlama işlemini gerçekleştireceğim. MonoSign'dan tanımladığım uygulamayı aynı zamanda uygulamalar ekranımdan da görüntüleyip, tek bir tıklama ile yeniden kullanıcı adı parola yazmadan erişebiliyorum (IdP Initiated - Single Sign-On).
Uygulama listesinde uygulamayı görmek
Oluşturduğumuz uygulamayı direk listede görebiliriz.
MonoSign - Identity Provider Ayarları
SAML ile yapabileceğiniz çok fazla ayar mevcuttur. Bu noktada minimal bir SAML çözümü kullanmak belki ilk başta işinizi görecektir fakat sonrasında sizi ciddi manada bloklayacaktır.
Aşağıda MonoSign'ın SAML için karşınıza çıkardığı ayarların bir kısmını görüntüleyebilirsiniz.
Kaynaklar
SAML ile alakalı özelliklerin tamamına aşağıdaki RFC'yi inceleyerek ulaşabilirsiniz.
SAML'ın RFC'sine https://tools.ietf.org/html/rfc7522 adresinden erişebilirsiniz.