← Back to Posts

SAML (Security Assertion Markup Language) Nedir?

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).

alt text

Uygulama listesinde uygulamayı görmek

Oluşturduğumuz uygulamayı direk listede görebiliriz.

alt text

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.

alt text

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.

SAML destekli uygulamalarınızı MonoSign ile hızlı bir şekilde entegre edebilirsiniz