1990 - 2010 yılları arasında edindiğiniz bilgiler, 8 karakter uzunluğunda ve rastgele büyük harf, küçük harf, rakam ve sembol içeren bir parolanın standart bilgisayar sistemlerinde deneme-yanılma (brute-force) ataklarıyla kırılmasının uzun yıllar aldığını söylüyordu. Bu denklemi bozan ve mevcut bilgilerimizi gözden geçirmemizi gerektiren değişim şu ki, şimdilerde görece düşük maliyetle sahip olunabilecek veya kiralanabilecek bir son kullanıcı sistemiyle bu süreler 6 saat gibi sürelere inmiş durumda!
Bu yazımızda konunun şu anki vahim boyutunun detaylarına değinecek ve güvenli parola kullanımı için hem yazılım geliştiricilere hem de son kullanıcılara yönelik tavsiyelerde bulunacağız.
Biraz tarihçe..
Asıl konumuza gelmeden önce kriptolojinin (şifre bilimi) tarihçesine şöyle göz ucuyla bir bakalım.
İlk şifrelemenin izlerine binlerce yıl önce Mısır uygarlığında rastlanmıştır. Sonrasında Yunan ve Roma medeniyetlerinde kullanılmış olup askeri alandaki bilinen ilk kullanımının da Sparta'lılara ait olduğu düşünülmektedir.
Geliştirilen ilk yöntemlerin günümüzden bakınca bir miktar eğlenceli olduğunu söyleyebiliriz. Örneğin bunlardan birinde şifreli bir mesaj taşınması istendiğinde taşıyıcı kişinin saçları kesiliyor, mesaj kafasına yazılıp saçların uzaması bekleniyor ve sonra karşı tarafa gittiğinde de saçlar tekrar kesilmek suretiyle mesaja ulaşılıyormuş.
Tarihte biraz ilerlediğimizde önemli duraklardan biri olan Sezar Şifrelemesine ulaşırız. Daha yakınlara, 1900'lü yılların başına geldiğimizde ise karşımıza Gilbert Vernam'ın doğru kullanıldığında kırılması neredeyse imkansız olan meşhur tek kullanımlık şerit yöntemi çıkar. Birinci dünya savaşında şifrelemenin önemi ortaya çıkınca sonrasındaki ikinci dünya savaşı ile birlikte şifreleme ve geri çözme metodolojileri alanında da tam bir savaş verildiği söylenebilir. Enigma şifreleme makinesinin kodlarının çözülmesinin savaşın kaderinin belirlenmesinde büyük rol oynadığı bugün artık bir sır değil.
Özellikle ikinci dünya savaşı yıllarında şifreleme ve şifre çözme alanındaki yoğun çalışmalar aynı zamanda günümüzdeki bilgisayar bilimlerinin de temellerinin atılmasını sağlamıştır.
Parolalarımız sistemlerde nasıl saklanıyor?
Kullanıcı parolaları dosya veya veritabanlarında açık hali ile saklanmaz. Parolaların tutulduğu veritabanı bir şekilde ele geçirilse dahi, açık hallerine değil, her bir parolanın şifrelenmiş (encrypted) haline ulaşılmış olur.
Parola şifreleme işleminde genellikle simetrik algoritmalar kullanılmaz, dolayısıyla şifreden yola çıkarak parolanın açık haline ulaşmanız mümkün değildir.
Parolalar hash algoritmaları ile şifrelenir ve bir hash değeri üretilir. Eğer şifre veritabanı ele geçirilmişse buradan geriye doğru parolaya ulaşılamaz ama teorik olarak tüm parola kombinasyonları aynı hash algoritmasından geçirilerek elde edilen sonuçla karşılaştırma yapıldığında aynı değeri üretiyorsa, parolanın açık halinin ne olduğu bulunmuş olur.
Deneme - yanılma olarak özetlenebilecek bu saldırı biçimi genel olarak brute-force atak şeklinde adlandırılır.
2000'li yılların başında popüler hashing algoritmalarından MD5, NTLM, SHA1 vb. ele alındığında 8 karakterli parolalar için tüm kombinasyonların denenmesi yüzlerce yıl almaktaydı. Elbette 123456, admin, password, qwe123, isim ve doğum tarihi kombinasyonları gibi belirli bir çok kullanılanlar sözlüğü ve size özel bazı kombinasyonlardan oluşan bir parolanız varsa, akılcı yaklaşımlarla yüzlerce yıl beklenmesine gerek kalmaksızın bir kaç dakikada parolanız ortaya çıkacaktır. Ancak parolanızda bu şekilde tahmin edilebilir bir desen yoksa, deneme yanılma süreci çok uzun sürdüğünden parolanızın yeterince güvenilir olduğunu varsayabilirsiniz.
Sistem yöneticisi iseniz, sisteminizdeki hash'lenmiş halde tutulan parolaları periyodik olarak John The Ripper (man john) vb. bir uygulama ile yukarıda bahsettiğimiz öntanımlı senaryolara karşı kontrol etmeniz ve zayıf parola kullanımı tespit edilen kullanıcıları bilgilendirmeniz iyi bir pratik olacaktır.
Peki şimdi ne değişti?
Zaman içerisinde grafik işlemcilerin (GPU) paralel veri işleme yetenekleri oldukça gelişti. Bugün bazı Nvidia Tesla modellerinde CUDA mimarisinde 2880 çekirdekli bir GPU işlemci bulunmaktadır. Benzer şekilde ATI (AMD) GPU çekirdek sayıları ve paralel işleme yetenekleri de ciddi performans açılımları sunmaktadır.
GPU'lar genel amaçlı bir işlemci değildir, dolayısıyla bu kadar çok çekirdek ve paralel işleme gücü olmasına rağmen, CPU gibi hemen her problem için kullanılması anlamlı değildir.
Ancak parolalar için kullanılan hash algoritmalarının -özellikle bazıları- GPU veya FPGA üzerinde oldukça verimli bir şekilde gerçeklenebilmektedir. Geleneksel CPU'lar ile elde edilebilen saniyedeki hesaplanabilen hash adedi, yeni GPU platformlarında olağanüstü biçimde artış göstermektedir.
Aşağıda Linux tabanlı Virtual OpenCL platformu üzerinde 25 adet AMD Radeon GPU'dan oluşan bir cluster sistemi görmektesiniz.
Böyle bir sistem artık çok uygun rakamlara elde edilebilmektedir. Ayrıca dilerseniz Amazon gibi bir platformdan hazır GPU sunucu kümelerini kiralamanız da mümkündür.
Yukarıda görülen sistemin Windows 2003 ve sonrasında kullanılan NTLM, Unix/Linux sistemlerde kullanılan MD5 ve SHA1 hashing algoritmaları karşısında saniyede hesaplayabildiği hash değeri sayıları aşağıda verilmiştir:
Görüldüğü üzere böyle bir sistem ile saniyede 350 milyar defa NTLM hash üretimi yapılabilmektedir. Bu da 8 karakterli tüm kombinasyonların 6 saatten az bir süre içerisinde denenebileceğini ifade etmektedir. Ugh!
Bunlar yetmezmiş gibi Windows kullanıcıları için bir kötü haberimiz daha var. Vista öncesinde (2007) Windows sistemlerinde yoğun olarak LM hash yöntemi (Lan Manager Hash) kullanılmaktaydı. Hatta 2007 sonrasında da mevcut sistemlerde geriye doğru uyumluluk nedeniyle çoğunlukla kullanılmaya devam etmiştir (Microsoft kullanılmasını önermese de kaç Windows Ağ Yöneticisi koca bir sistemdeki bütün parolaların artık çalışmamaya başlamasını göze alıp bu geçişi yapabilmiştir ki?).
LM hash algoritması ile ilgili tasarım nedeniyle bu parolaların kırılması için GPU'ya bile ihtiyacınız yoktur. Eğer 50 GB'dan büyük kullanılabilir belleğiniz varsa, tüm olası kombinasyonları iyi bir veri modeli ile bellekte saklamak ve ortalama üstü bir CPU kullanmak suretiyle birkaç dakika içerisinde parolaya ulaşmak mümkündür! Microsoft'un konu ile ilgili açıklamalarına da buradan erişebilirsiniz.
Yazılım geliştiriciler ne yapmalı?
Aslında yapılacak şey basit, parolaları şifrelerken hash değeri hesaplanması daha uzun süren algoritmaları tercih etmeliyiz. Kullandığımız algoritmanın ise sadece CPU üzerindeki performansı hakkında değil, GPU ve FPGA dünyasına karşı ne kadar dayanıklı olduğuna dair de bilgi edinmeliyiz.
Eğer parola şifreleme süreçlerini de adresleyen bir yazılım framework'ü kullanıyorsanız, güvenlik açısından framework içerisinde doğru kararların verilmiş olup olmadığını kontrol etmeniz de yerinde olacaktır.
Örnek olarak Ruby on Rails platformunda kullanıcı işlemleriyle ilgili sık kullanılan kitaplıklardan biri olan Devise içerisinde öntanımlı hash algoritması olarak Bcrypt kullanılmaktadır. Aynı zamanda hash algoritması olarak başka bir yöntem kullanmanıza da olanak vermektedir.
Bcrypt algoritmasının kırılması, GPU ve FPGA'lar için de halen çok uzun zaman almakta olduğundan güvenilirdir. Bununla birlikte hash sürecinde kullanılan yöntemin doğrudan GPU ve FPGA'lar üzerinde gerçeklenmesini zorlaştırmayı temel amaç edinen Scrypt algoritmasını kullanmanız daha da iyi bir seçim olacaktır.
Özetle hash değeri hesaplaması ne kadar uzun zaman alıyorsa o kadar güvendesiniz demektir.
Parola kaç karakterden oluşmalı?
Fazladan kullandığınız her karakter, parolanızın kırılması için ihtiyaç duyulan deneme-yanılma sayısını geometrik biçimde artıracak ve parolanızı daha güvenli kılacaktır. Öte yandan sürekli bu parolaları girme zorunluluğu ve parolayı güvenli yapacağım derken başka bir yere not etme ihtiyacı üretmesi nedeniyle tamamen güvensiz hale gelmesi gibi bir duruma da yol açılabilir. Şimdi güvenlik için olması gereken minimum parola uzunluklarına bakalım.
Durumu 2 senaryo üzerinden örneklemeye çalışalım. NTLM hash için yukarıdaki 25 GPU'lu sistemin biraz daha iyisi ile parola kırma denemesi yapılacağını varsayalım. 8 karakterden az parolaları hiç konuşmaya bile gerek yok, onlar anında bulunacaktır. Burada 8 ve üzerine değineceğiz.
Tablodan hareketle büyük/küçük harf, rakam ve özel sembol kombinasyonunun tümünün kullanıldığı durum için minimum 12 karakter uzunluğunda parola kullanımının güvenli olduğu görünmektedir. Eğer özel sembol kullanmıyorsanız bu durumda güvenli parola uzunluğu olarak 13 karakter kullanmamız gerektiği ortaya çıkmaktadır. Bu sistemde NTLM hash yerine Bcrypt hash yöntemi kullanılmış olsaydı, 8 karakter de işimize yetecekti. Ancak web üzerinden onlarca sisteme girdiğiniz parolaların hangi hash yöntemiyle tutulduğunu (hatta şifreli tutulup tutulmadığını dahi) bilme imkanımız bulunmuyor.
Yazılım geliştiricilerin temel açmazı, kullanıcıları minimum 12 karakterlik parolalara ikna etmenin neredeyse imkansız olduğudur. Günümüzde bu uzunluktaki parola kullanım oranının ancak binde bir seviyelerinde olduğunu söyleyebiliriz. Dolayısıyla geliştirilen sistemin kullanım senaryosuna göre parola güvenliği için kullanıcıların da kabul edeceği bir orta yol bulunması gerekecektir.
Geliştiriciler için son bir notumuz da şudur ki, kullanıcıya parolasını girmesi için sunmuş olduğunuz formlar üzerinden gelen girdilerin sadece minimum uzunluğunu değil, maksimum uzunluğunu da kontrol etmeniz oldukça önemlidir. Özellikle güvenlik amacıyla Bcrypt gibi hesaplanması yavaş olan bir hash algoritmasının kullanımını devreye aldığınızda, kullanıcının girdiği parolanın maksimum uzunluğunu kontrol etmiyorsanız, özel hazırlanmış bazı isteklerle aynı anda 100.000 karakterlik onlarca parola denemesi yapılması suretiyle bir saldırı gerçekleştirilecek olursa, sisteminizin geri kalan kullanıcılara yanıt veremez hale gelmesi kuvvetle muhtemeldir.
Son kullanıcılara tavsiyeler
Peki kullanıcı olarak ne yapmalıyız diye soranlar için de şu tavsiyelerde bulunabiliriz:
- Parola uzunluğunuz minimum 12 karakter olmalıdır
- Parola içerisinde mutlaka büyük/küçük harf kombinasyonu, rakam ve sembol bulunmalıdır
- Tüm bu varyasyonlarla ürettiğiniz 12 karakterli parolayı hatırlamakta zorlanacak iseniz, daha kolay hatırladığınız bir parolanın başına, sonuna veya her iki tarafına belirli bir deseni ekleyerek de güvenliği karakter uzunluğu isterini yakalayabilirsiniz. Örneğin 8 karakterli parolanızın sonunda 4 adet de nokta karakteri ekleyebilirsiniz. Ya da başına 2 virgül sonuna 2 nokta ekleyerek de 12'ye tamamlayabilirsiniz. Burada tamamlama için kullandığınız desenin biraz kendinize özgü olmasında fayda vardır, herkes nokta ekleyecek olursa bu da genel bir desene dönüşür.
- Bir web sitesinde yeni kullanıcı kaydı oluşturmanız gerektiğinde, eğer ilgili site Facebook, Google vb. sistemler üzerinden giriş yapmanıza izin veriyorsa, yeni kullanıcı açmak yerine bu şekilde giriş yapmayı tercih edin. Bu modelde parolanızın şifrelenmiş hali dahi ilgili siteye verilmemiş olacaktır. Çoğunlukla bir çok sistemde aynı parolaları kullandığınızı düşünecek olursanız, ne kadar az sisteme parolanızı giriyor olursanız o kadar güvende olduğunuzu söyleyebiliriz.
Bitirirken..
Buraya kadar sabırla okumayı başarabildi iseniz artık ne yapmanız gerektiğini biliyorsunuz; şimdi gidip minimum 12 karakter uzunluğunda olacak yeni parolanızı bulma zamanı... (MD/YY)
* Bu yazı Murat Demirten'in blogunda yayınlandı.