Suat Karakuşoğlu yazdı.
¶İçerik
Figure 1: SSL Pinleme
Merhabalar, bu yazımızda güvenliğe dokunan bir konudan bahsedeceğiz. Verinin güvenliği akış halinde, işlenirken veya saklanırken farklı yöntemler ile sağlanmakta.
SSL Pinning verinin iki parti arasında iletim esnasındaki güvenliğini korumak için ortaya çıkmıştır. SSL Pinning
dediğimizde iki kavram var birisi SSL
diğeri ise Pinning
işlemi. O nedenle ilk önce SSL hakkında ufak bir bilgi ile başlayalım.
¶SSL’in Kısa tarihçesi
Güvenli Geçiş Katmanları diye türkçeleştirebileceğimiz bir tabir olan SSL websitelerinin doğması ile beraber 1990’ların ortasında bağlanılan sitelerin güvenliğini teyit etmek için kullandığı bir güvenlik yöntemidir.
Burada istemci (client)
ssl
sayesinde sunucu (server)
ile arasında olan iletişimi geçerli bir sertifikaya güvenerek yapmaktadır.
Sertifika otoritelerinin (CA Authorities) verdiği sertifikalar ile (chain of certificate) üzerinden bu sağlanmaktadır. Ancak herhangi kötü niyetli birileride geçerli sertifikalara sahip olabilir; o nedenle bu riski düşürebilmek adına ilgili sertifikalar her iki partide (istemci/sunucu) önceden bulunarak, bağlantının gerçekten doğru istemci ve doğru sunucu ile olduğunu garantiler.
¶MİTM (Man in the Middle) Atağı
SSL’in eksik kaldığı noktada kötü niyetli birinin de sertifika sahibi olduğunda istemci ve sunucu arasında zaafiyet meydana gelebilir. İletişim’in ortasına kendisini yerleştirip ortamı dinleyerek bilgi elde etmeye çalışan atak türüdür.
¶Pinning (Pinlemek) nedir?
Pinlemenin ne olduğunu öğrenmeden önce neyi pinleyeceğimizden biraz bahsedelim. Pinlenecek olan dosyaya Sertifika (Certificate) diyoruz.
Asimetrik şifrelemedeki Public/Private anahtar çiftleri, sertifika için önemli kavramlar.
Public Key
sunucuya gönderilecek olan bilgiyi başkaları okumasın diye şifrelemede kullanılıyor.
Bu public key
sertifikanın içinde bulunuyor ve istemci tarafında kullanılıyor.
Private anahtar ise gönderilen veriyi sunucuda çözümleyebilmek için kullanılıyor.
Zaten https
üzerinden bu bilgiler güvenli şekilde iletiliyorken neden pinlemeye ihtiyaç duyuluyor sorusunun cevaplayalım.
Normalde sertifikalar “Certificate of Chain” denilen bir zincir üzerinden iletişimi güvenli hale getiriyor. O nedenle tüm zincir root
sertifikaya kadar onaylandıktan sonra iki parti arasında iletişim başlayabiliyor. Ama, uygulama sunucunun verdiği sertifikaya güvenirken bu sertifikanın kendi sunucusu mu yoksa bir başkasının sunucusu mu olduğuna dair bilgiye sahip değildir.
Pinleme yaptığınız vakit ise direkt olarak bu iletişim garantisini istemci/sunucu arasında karşılıklı güvenli hale getirebiliyorsunuz; herhangi bir başka otoriteye gerek duymuyorsunuz.
Önceden istemciye gömülen sunucunun public
anahtarı olursa, istemci sunucuyla iletişim kurmadan önce kendisinde olan anahtar ile sunucudaki anahtarı karşılaştırıp, eşleş*meme*si durumunda direkt iletişimi kesiyor.
Özellikle güvenliğin daha temelde olduğu uygulamalarda bankacılık ve finansal enstrüman olarak görev yapan uygulamalarda bu güvenlik önlemi tercih edilmektedir. Mobil uygulamalarda da yoğunluklu olarak kullanılan bir güvenlik tedbiridir.
¶Mobil Uygulama Entegrasyonları
- İlk adım olarak sunucunun
public
anahtarini veya SSL sertifikasını çıkarmanız gerekiyor. - Bu anahtara sahip sertifikayı veya public anahtarı istemci uygulamaya pinlemek/gömmek gerekiyor. İstemci tarafındaki network katmanında
sunucuya
isteklerinde bu anahtarların eşleşme kontrolünü yapacak kontrolü eklemek gerekiyor. - Dikkat edilmesi gereken en önemli noktalardan bir tanesi sertifikanın süresi bittiğinde yenileme ihtiyacını takip edebilmek.
- Certificate Pinning
- Tüm sertifikanın
client
’a gömüldüğü ve sorguya cevap verenserver
’in sertifikası ile karşılaştırıldığı pinleme yöntemi. Bu durumdaclient
’ların eski kalanlarınınforce update
ile zorunlu güncellemeye gitmesi gerekiyor. - Public Key Pinning
Sertifika’da yer alan
public key
’in veyapublic key hash
’inin istemciye konulması ve karşılaştırma için kullanılması durumunu ifade eder. Normalde sertifikaların belli periyotlarda yenilenmesi gerekmektedir. Bu yenileme herhangi bir private key sızıntısı durumlarının önüne geçmeyi amaçlar.Public anahtarı pinlediğimiz takdirde istersek eski
public/private
anahtar çifti ile yeni sertifika oluşturabiliriz. Public Key pinleme ise bu durumda sunucu tarafında sertifika değişimlerinde yeni sertifika eski public/private key pair ile üretildiği durumda force update gerekmeden devam edilebilir. Ancak böyle devam etmesi sertifikanın yenilenme amacına aykırı olmaktadır.
Özet olarak, SSL Pinning
dediğimiz olay istemci ile sunucu arasındaki iletişimi önceden belirlenen anahtar çifti ile dışarıya sızmasını engelleyen yöntemdir.
Sistem güvenliği konusunda araştırmalar yapan bağımsız kuruluş OWASP, MITM türü ataklar için önlem olarak bu yöntemi tavsiye etmektedir.
iOS tarafında NSURLSession
veya Alamofire
bağımlılıkları üzerinde bu pratikler rahatlıkla uygulanabiliyor.
Android tarafında ise OKHttpClient ve Retrofit gibi popüler kütüphanelerde bu pratiklerin nasıl yapıldığına dair birçok örnek bulabilirsiniz.