| Editor Login | Register | ||
| > Bilgisayar > Web Programlama > ASP.NET |
|
|
| Web Uygulamalarında Tehdit Modelleme ve Güvenlik |
Tehdit Modelleme .NET ve ASP.NET tarafından sağlanan güvenlik çatısı güçlü olsa da bazı temel prensipleri akılda tutmak ve bu özellikleri doğru bir şekilde ve doğru zamanda kullanmak gereklidir. Bunun için güvenlik öğelerini, uygulama geliştirmenin ilk aşamasından itibaren kullanmak gereklidir. Bu yüzden Tehdit modelleme, günümüz yazılım mimarisinde önemli bir yer teşkil etmektedir. Tehdit modelleme (Threat modelling) muhtemel tehditler, bu tehditleri önem sırasına koyma ve sonra bu tehditleri temel alan hafifletme tekniklerine (mitigation techniques) karar verme üzerine uygulamamızın öğelerini analiz etmenin yapısal bir yoludur. Tehdit modelleme başka bir yönden de önem arz etmektedir. Bildiğimiz gibi bütün potansiyel tehditler, authentication ve authorization gibi güvenlik teknolojileri ile hafifletilemiyor. Bir başka deyişle bazı tehditler teknik yollarla çözüme kavuşturulamıyor. Mesela bir bankanın online şubesi, web sitesi üzerindeki trafiği güvenlik altına almak için SSL kullanıyor (Secure Socket Layer). Fakat kullanıcı, sayfanın bankanın gerçek sayfası olduğunu, bir hacker"ın sahte sitesi olmadığını nasıl anlayacak? Bunun tek bir yolu var: SSL kanalını kurmak için kullanılan sertifikaya bakmak. Ancak her kullanıcının bunun farkında olması düşük bir ihtimaldir; dolayısıyla kullanıcıları bilgilendirmeliyiz. Bu senaryodakine benzer hafifletme teknikleri, birer güvenlik teknolojisi değillerdir. Bu, bütün kayıtlı (registered) kullanıcıların sertifikaya nasıl bakmaları gerektiğini bildiklerinden emin olmayı gerektirir (Tabi ki onları bunun için zorlayamayız; fakat bilgileri doğru şekilde dizayn edersek bir çoğuna bunu yaptırabiliriz). Tehdit modelleme, sadece teknik konuları değil bu gibi durumları belirlemeye yardım eden bir analiz metodudur. Güvenli kod yazmanın temel prensipleri SQL ifadeleri yazarken asla string birleştirme kullanılmamalıdır... Sql"den iğne yemek istemiyorsanız (sql injection) her zaman parametrelendirilmiş sorgular kullanılmalısınız. Aynı zamanda sql cümlelerin olduğu yerlerde try-catch bloğu sonucu kullanıcıya verilecek hata mesajında kendi özel mesajımızı kullanmak daha güvenlidir; çünkü Exception ya da Exception türevi sınıfların Message özelliği ile kullanıcıya veritabanımız hakkında bilgi gösterilebilir. Kullanıcıdan alınan bilgiler, doğrulanmadan ve encode edilmeden; yani doğrudan web sayfasında gösterilmemelidir... Kullanıcı bazı HTML parçaları girebilir (mesela bir script). Bu yüzden her zaman HttpUtility.HtmlEncode() kullanarak < ve > gibi karakterlerden kaçmakda fayda vardır. Alternatif olarak bu geçerlilik kontrolünü yapacak bir web kontrolü kullanılabilir. Sayfanın gizli alanlarında (hidden field) önemli, değerli, iş bilgisi taşıyan ya da akışı etkileyecek veri saklamamak gerekir. (Gizli alanlar tarayıcıdaki kaynak sayfaya bakılarak kolayca görülebilir, değiştirilebilir, kaydedilebilirler. Ardından da tarayıcı eklentileri (browser plug-in) ile mail gönderir gibi sunucuya gönderilebilirler) View-state içerisinde önemli, kritik veri saklanmamalıdır (Çünkü view-state, bir gizli alandır. Kolayca decode edilebilir. Bu arada eğer sayfada @Page etiketinde EnableViewStateMac = true yapılırsa view-state şifrelenir). Cookie"ler korunmalıdır... Forms authentication kullanılırken cookie"ler olabildiğince geç oluşturulup ihtiyaç kalmadığında silinmesi için timeout süresine sahip olmalıdır. SSL kullanılmalıdır... Eğer web sitemiz, genel olarak hassas veriler içeriyorsa bütün siteyi SSL kullanarak koruma altına almak gerekir. Ayrıca direk SSL tarafından korunamayan resim ve diğer dosyaları da korumayı unutmamak lazım. Authentication : Öncelikle kullanıcıların kimliklerini doğrulamak gereklidir. Authentication şu soruyu sorar: Uygulamayı kullanan kim? Authorization : Uygulamamızla çalışanın kim olduğunu öğrendikten sonra o kullanıcının hangi operasyonları gerçekleştirebileceğini ve hangi kaynaklara erişebileceğine karar vermek gereklidir. Yani authorization şu soruyu sorar; Senin geçiş iznin ne? Tutarlılık : Tarayıcı ve sunucu arasında gidip gelen verinin illegal aktörler tarafından değiştirilmediğinden emin olmak gerekir. Bu tarz tehditleri hafifletmenin bir yolu dijital imza kullanmaktır. Mesela windows işletim sistemi, login olan her kullanici için 96-bit bir numara kullanır, buna SID (Security identifier) denir. Bütün authentication çeşitleri, sunucuya talepte bulunan kişinin kim olduğunu bilmemizi sağlar ki bundan kişiselleştirme için faydalanılabilir. Çünkü kimlik (identity) bilgisini web sayfasında kişiye özel karşılama mesajı göstermek için veya sayfanın görünüşünü değiştirmek için kullanabiliriz. Yine de kullanıcının uygulama içerisinde yapacaklarını kısıtlamak için authentication yeterli değildir. Bunun için authorization gereklidir. 1. Ağ üzerindeki verinin iletişimini korumak için: Mesela internet ortamında bir e-ticaret sitesinden alış-veriş yaparken bu ortamda bulunabilecek bir dinleyicinin (eavesdropper) kredi kartı no"mu okuyamadığından emin olmak isteyebilirim. Endüstriyel standartların yaklaşımına göre bunun çözümü SSL (Secure socket layer)"dir. SSL aynı zamanda tutarlılığı sağlamak adına dijital imza da sağlamaktadır. SSL, ASP.NET tarafından sağlanmaz, bu IIS"e entegre edilebilecek bir özellikir. 2. Veritabanı ya da bir dosyadaki kalıcı bilgileri korumak için: Mesela gelecekte kulanmak üzere kullanıcının kredi kartı no"sunu veritabanına kaydetmek istiyoruz. Bunu açık metin (plain text) olarak kaydedebilmemize rağmen, çok da iyi bir fikir değildir. Bunun yerine veritabanına kaydetmeden önce .NET framework tarafından bize sağlanan tipler yardımıyla veri şifrelenebilir. Şu ana kadar anlatılanları bir araya getirirsek : Kullanıcı bir siteye girdiğinde isimsiz bir kullanıcıdır (anonymous user). Yani uygulamamız gelenin kim olduğunu bilmez ve bu onu ilgilendirmez. Onu doğrulamadığımız (authenticate etmediğimiz) sürece de öyle kalacaktır. Varsayılan olarak isimsiz kullanıcılar bütün ASP.NET web sayfalarına erişebilirler. Fakat isimsiz erişimi olmayan bir siteye girildiği zaman şu aşamalar gerçekleşir: 1) Talep web sunucusuna gönderilir. Bu aşamada kullanıcının kimliği (identity) bilinmediği için ona login olması söylenir. (Bunun için özel bir web sayfası hazırlanabilir) Login sürecindeki ayrıntılar, authentication türüne bağlı olarak değişir. 2) Kullanıcı güvenlik bilgilerini verir ve ardından eğer form authentication kullanılıyorsa uygulamamız tarafından, windows authentication kullanılıyorsa IIS tarafından kontrol edilir. 3) Eğer bilgiler doğruysa kullanıcı talep ettiği sayfaya yönlendirilir. Verilen bilgiler doğru değilse kullanıcı yeniden log-in sayfasına yada Erişim reddedildi mesajı içeren bir web sayfasına yönlendirilir. Kullanıcı sadece belli kullanıcılara ya da belli role sahip kullanıcılara açık bir web sayfası talep ederse yukarıda anlatılan aynı süreçten geçer fakat bu sefer fazladan bir adım vardır. Kullanıcı eğer bilgilerini doğru girmişse, talep ettiği sayfaya giriş hakkı olup olmadığı da kontrol edilir. Bu da sürecin authorization kısmıdır. Eğer kullanıcının talep ettiği kaynağa hakkı yoksa Erişim reddedildi mesajı içeren bir web sayfasına yönlendirilir. |
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |