EN
EN

Web Uygulama Güvenliği


WEB Uygulama Güvenliği

Bankacılık ve e-ticaret gibi kullanıcıların hassas bilgilerini işleyen web uygulamalarının güvenlik testlerinin yapılması şirketlerin iç ve dış kaynaklarının korunması için önem arz etmektedir. Kurumların internet uygulamalarındaki zafiyetler ve açıklıklar saldırganların iç ağlara sızması için ortam sunmaktadır. Web sunucu uygulamalarının karmaşık bir yapıya sahip olması ve veri tabanı uygulamalarının kod enjeksiyon saldırılarına potansiyel olarak açık olmasının yanı sıra güvenlik göz önünde bulundurularak yazılmayan kodlar kurumu çeşitli saldırılara maruz bırakabilmektedir. Özellikle kullanıcıdan girdi alan ve arka planda kod çalıştırıp veri tabanıyla etkileşime geçen uygulamalar web ataklarını kolaylaştırmaktadır. Hem çok çeşitli konfigürasyonlara ve servislere sahip olmaları hem de kullanıcı izinlerinin çeşitliliği web uygulamalarının atak vektörünü zenginleştirmektedir. Web güvenlik zafiyetlerinin oluşmasında ağ katmanından çok uygulama katmanındaki ve HTTP protokolündeki bileşenler etkili olmaktadır.

Web uygulamalarının güvenlik hesaba katılarak dizayn edilmesi gereken kritik bileşenleri:

1- Kullanıcı Girdilerinin Kontrolü

Kötü niyetli bir kullanıcının normal bir veri yerine uygulamanın zafiyetlerini istismar edecek bir kod parçasını veya komutu enjekte ederek siteye beklenmedik bir girdi gönderebilmesi gibi riskler nedeniyle girdi alanları her zaman ayrıntılı bir güvenlik denetlemesini gerektirmektedir. Ayrıca HTML ve JavaScript dillerine ait form denetleme kuralları güvenlik açısından yeterli bir kontrol sağlamamaktadır. Bu riskler nedeniyle kullanıcıdan gelen veriler sunucu tarafında kullanılmaya başlanmadan önce beklenen türde bir data olduğunun belirlenmesi için geçerliliğinin denetlenmesi gerekmektedir. 

Girdi kontrolünde kullanılan beyaz liste ve kara liste(whitelisting-blacklisting) yöntemi kötücül istekleri filtreleme için çözüm sunmaktadır. Kullanıcıdan gelen form bilgilerinin denetlenmesi için geliştirilen ve bilinen kötücül girdileri red etmek üzere oluşturulan kara liste yönteminde gelebilecek olası zararlı isteklerin sayısının çok fazla olması, potansiyel kötücül isteklerden oluşan bu listenin devamlı güncellenmesi işlemini zorlaştırmaktadır. Ayrıca kara liste oluşturulurken tüm durumlar hesaba katılmalı ve olabildiğince kısıtlama uygulanmalıdır. 

Beyaz listeleme yöntemi ise kullanıcıdan alınan girdilerin bilinen ve kabul edilebilir bir veri tipine sınırlandırılması olarak tanımlanmaktadır. Beyaz listelemede girilen değer URL veya tarih(gg/aa/yyyy ) gibi belli formatlara kısıtlanabilir. Böylelikle bu formata uymayan girdilerin sistem tarafından kabul edilmemesi sağlanmaktadır. Beyaz liste oluşturmak için web uygulama geliştirme platformunun gömülü(built-in) fonksiyonlarını kullanmak alternatif bir yaklaşım olabilir.

Girdileri sanitize etme yönteminde ise beklenmedik girdileri reddetmek yerine kaldıran bir kara liste oluşturulur. Bu uygulamada girdi içerisine eklenen örneğin <script> (javascript kodunu çalıştırmak için kullanılan HTML etiketi(tag)) gibi kötüye kullanılabilecek etiketlerin veya kod parçacıklarının tespit edilip kaldırılması örnek verilebilir. Web uygulaması geliştirme platformlarında gömülü olarak gelen girdi denetleme(input validation) işlevi her bir form alanı için kural ve kısıtlama belirlemeye yardımcı olan alternatif bir modüldür.

Öneriler

- Uygulanabildiği durumlarda beyaz listeleme oluşturmak
- Beyaz liste oluşturulamadığı durumlarda kara liste oluşturmak
- Uygulanabildiği kadar kısıtlama uygulamak
- Olası saldırılar için alarm üretmek
- Girdiyi tekrar kullanıcıya yansıtmaktan kaçınmak
- Girdilerin arka planda çalışan kritik servislere ulaşmaması için veri kullanımının minimize etmek

2- HTML Çıktı Kodlama-Output Encoding

Web uygulamaları kullanıcıdan gelen verilerin yanı sıra veri tabanı veya diğer servislerden gelen dataları da işlemektedir. Bu dataların tek tırnak(‘) ve küçüktür(<) gibi karakterleri de içermesi filtreleme işleminin uygulanmasını zorlaştırmaktadır. Bu noktada Çıktı Kodlama(Output Encoding) yöntemi çözüm olarak uygulanabilir. Çıktı kodlama; sistem ve hata yakalama(debug) mekanizmaları ile ilgili kritik bilgileri sızdırabilecek hata mesajlarının kullanıcıya yansıtılmaması ve böylece bu verilerin saldırılar için kullanılmasını önlemek amacıyla gönderilecek datanın uygun bir son formata dönüştürülmesi işlemidir.

Öneriler

- Uygulama ve sistem bilgilerini yansıtabilecek tüm sonuç verileri için uygun bir kodlayıcı ile çıktı kodlama uygulamak
- Web uygulama geliştirme editörünün çıktı kodlama yeteneklerini kullanmak
- Veriyi işlenmemiş halde saklamak ve derleme(rendering) aşamasında kodlamak
- Kodlamayı uygulamayan güvensiz platformları ve JavaScript işlevlerini kullanmaktan kaçınmak

3- Veri Tabanı Güvenliği

Veri tabanlarının kolayca kurtarılamayan bir yapıya sahip olması ve kritik hassas bilgileri tutması gibi nedenlerden dolayı veri tabanlarının siber saldırılardan korunması büyük önem taşımaktadır.

Veri tabanı güvenliği için uygulanan yöntemlerin başında parametre bağlama(parameter binding) seçeneği gelmektedir. Parametre bağlama, çalıştırılacak veri tabanı sorgusu ile içeriğin yani verilerin kodlama(encoding) ve kaçış(escaping) işleminden geçirilerek birbirinden ayrıştırılmasını esas alan bir yöntemdir. SQL sorgusu eğer birleştirme(concetenation) veya formatlama yöntemlerini kullanıyorsa üretilen sonuç sorgusunun kullanıcıdan alınan girdi ile oluşturulmasından kaçınılmalıdır.

Öneriler

- Kullanıcının girdiği bilgileri kullanarak SQL sorgusu oluşturmaktan kaçınmak
- Parametrelerle oluşturulmuş sorguları ve kaydedilmiş prosesleri bağlamak(Binding)
- Bağlama(Binding) için daha güvenli olan gömülü(built-in) fonksiyonları kullanmak

4- Hareket Halindeki Veriyi Korumak

Bilgi güvenliğinin temel kavramlarından olan verinin gizliliği ve bütünlüğünün korunması ilkeleri ağ trafiğinde akan verilerin ele geçirilmesini önleyecek mekanizmaları da kapsamaktadır. İstemci ve sunucu arasındaki trafiği dinlemek, değiştirmek ve hassas bilgileri çalmak gibi riskleri önlemede yetersiz kalan HTTP protokolü ve tasarımında zafiyet barındıran Telnet gibi diğer bağlantı protokolleri HTTPS, SSL ve TLS gibi güçlü şifreleme algoritmalarını bileşimini destekleyen protokollerin dizayn edilmesi ihtiyacını doğurmuştur.

Öneriler

- HTTPS protokolünü her türlü iletişim için kullanmak
- Normal web tarayıcılarına güvenmek zorunda kalındığı bir durumda sertifika makamlarından sertifika alınarak hizmet vermek
- Gizli anahtarın korunması
- Güvenli bir HTTPS konfigürasyonu için bir yapılandırma aracı kullanmak
- Cookie’ler için secure flag ayarlamak
- Hassas bilgileri URL’de sızdırmamak
- HTTPS’i ayarladıktan sonra sunucu yapılandırmasını denetlemek ve her kaç ayda bir denetimi tekrarlamak
- Sitelere kendisiyle iletişime geçen tarayıcıların yalnızca HTTPS üzerinden haberleşmesini şart koşan HSTS(HTTP Strict Transport Security) protokolünü kullanmak

5- Parola güvenliği

Geleneksel yöntemlerden biri olan periyodik şifre değiştirme kuralında saldırganın parolasını elde ettiği hesabın sürenin sonunda kilitlenmesi hedeflenmektedir, ancak kullanıcılar genellikle yeni parolada sadece birkaç karakteri değiştirdiğinden eski parolayı elinde bulunduran saldırganın yeni parolayı da kırması zor olmayacaktır. Periyodik şifre değişimi yani kullanıcının birkaç ayda bir parolasını yenilemesi şifre güvenliğini güçlendirmekten daha çok kötüleştirdiği uzun süreden beri tartışılmaktadır, aynı zamanda NIST’in geçen haziran ayında yayınladığı raporda[1] periyodik şifre değişimi kuralının kaldırılması önerilmektedir.

Harflerin, numaraların ve özel karakterlerin kombinasyonu ile karmaşık parola oluşturulmasını şart koşmak artık bir güvenlik tedbiri olarak görülmemektedir. Buna gerekçe olarak kullanıcıların tahmin edilmesi zor parolalar üretebilmesini engellediği belirtilmektedir.

Yeni oluşturulan parolaların zorunlu olarak geçerliliğinin denetlenmesi yeni bir yöntem olarak sunulmaktadır. Oluşturulan yeni parolanın çok sık kullanılan, kolay tahmin edilebilen veya çalınmış parolalardan oluşan bir listeye göre denetlenmesi şifre geçerliliğinin değerlendirilmesi adına şart koşulmaktadır,  böylelikle kullanıcıların “12345678” veya “parola” gibi kolay tahmin edilebilen şifreleri seçmesinin önlenmesi sağlanabilir.

Öneriler

- Tüm parolaları özet alma(hashing) ve salt işleminden geçirmek
- Güvenli olarak tanımlanan bir algoritmayı kullanmak
- Parola saklama mekanizmasını yapılandırılabilir kılmak
- Harici sistem ve servisler için parola saklamaktan kaçınmak
- Parola uzunluğunu küçük boyutta seçmemek

6- Güvenli Kimlik Doğrulama

Kimlik doğrulama sistemleri finans ve devlet kurumları gibi hassas ve kritik verilerin işlendiği sistemlere girişte kullanıcının kimliğini denetleyen kritik altyapılar oldukları için güvenlik mekanizmalarının uygulanmış olması büyük önem taşımaktadır.

Sisteme girişleri kontrolde çok faktörlü kimlik doğrulaması ve iki faktörlü kimlik doğrulaması gibi teknolojiler ek güvenlik katmanı olarak önem taşımaktadır.  İki faktörlü kimlik doğrulamada kullanıcıyı doğrulama işlemi iki aşamalı bir süreç olarak tasarlanmıştır. İki faktörlü doğrulamada kullanıcının hem bildiği bir şey yani parolasını hem de sahip olduğu bir şey yani şifrematiği veya cep telefonunu kullanarak sisteme giriş yapması istenmektedir.  Kullanıcı parolayı girdikten sonra ikinci doğrulama aşamasında ya şifrematik tarafından üretilen tek kullanımlık şifreyi girmesi ya da akıllı telefon kullanıldığı takdirde kimlik doğrulaması yapan sistem tarafından gönderilen tek kullanımlık doğrulama kodunu girmesi beklenir. Çok faktörlü kimlik doğrulamada ise parola ve donanımsal şifrematiklere ek olarak parmak izi ve iris tarama gibi biyometrik veriler de kullanılmaktadır.

- Kullanıcının bildiği bir şey, örneğin şifre – (something you know)
- Kullanıcının sahip olduğu bir şey, örneğin şifrematik– (something you have)
- Varlığa ait şeyler, örneğin parmak izi veya iris – (something you are)

Parola yönetimi yazılımları ise kullanıcının karmaşık parola oluşturma kuralları veya sık parola değiştirme gibi zorunluluklarla uğraşmasına ihtiyaç bırakmamaktadır.

Single-Sign-On, kullanıcıların bir kurumun web sitesinde bulunan her bir uygulama için ayrı ayrı kullanıcı adı/parola ikilisi tanımlama zorunluluğunu ortadan kaldırır; bunun yerine birçok uygulamaya sadece bir kullanıcı adı/parola ikilisi ile erişebilmeyi sağlar.

Single-Sign-On, hem lokal hem de bulut bilişim tabanlı servislerde uygulanabilmektedir; aynı zamanda kullanıcının statüsü göz önünde bulundurularak erişim hakkına sahip olduğu kaynak ve uygulamaların dışında diğer bilgilere ulaşamayacağı şekilde bir erişim kontrolü sağlanmaktadır. Bu sistemde güvenlik ve kullanışlılık gibi ikisinin aynı anda işletilmesi zor olan servisler bir arada uygulanabilmektedir. Hem kullanıcının birden fazla kimlik bilgisi tutmasına gerek kalmamakta hem de sistemin güvenliği arttırılmış olmaktadır. Bu süreç işletilirken kullanıcı hangi uygulamadan giriş yapmak isterse istesin sistem kimlik doğrulama için kullanıcıyı merkezi kimlik doğrulama sunucusuna yönlendirmektedir. Böylelikle kullanıcının kimliği tanımlanmakta ve eğer doğrulandığı takdirde bu veriye ihtiyaç duyan diğer tüm alt sistemlerle paylaşılmaktadır.

Öneriler

- Bireysel oluşturulacak sistemlere kıyasla daha güvenli görülen standart kimlik doğrulama sistemlerini kullanmak
- İhtiyaçlara cevap verebilecek kimlik doğrulama yöntemlerini desteklemek
- Saldırganların bir hesabı ele geçirmek için istismar edebilecekleri zafiyetleri tespit edip düzeltmek
- Hesapların tanımlanıp ele geçirilmesini önleyebilecek metotları uygulamak
- Varsayılan veya sabit kodlu(hard-coded) kimlik bilgilerini hiçbir şekilde kullanmamak

7- Kullanıcı Oturumlarını Yönetmek

HTTP’nin kullanıcı verilerini istekleri ile bağlantılandırma özelliğine sahip olmaması Durum Bilgisiz(Stateless) bir protokol olmasından kaynaklanmaktadır. Bu nedenle kullanıcıları ve isteklerini takip etmek ve aradaki bağı korumak amacıyla geliştirilen oturum yönetimi sistemi hem kimliği doğrulanmış hem de anonim kullanıcıları takip için uygulanmaktadır. Oturum yönetimi hem insan kullanıcıları hem de servislere uygulanabilmektedir. 

Oturum yönetimi, kimliği doğrulanmış kullanıcıların giriş bilgilerini yönetmek gibi işlemleri gerçekleştirdiği için çoğunlukla siber saldırıların hedefi haline gelmektedir. Sisteme giriş için kimlik doğrulama aşamasından geçmiş ve kendisi için oturum açılmış bir hesaba ait oturum bilgisini çalan bir saldırgan kimlik doğrulama sistemini atlatabilmektedir. Bu nedenle oturum yönetimi sistemlerinin güvenliği büyük önem taşımaktadır.

Öneriler

- Oturum bilgilerini gizli tutmak ve URL’de veya loglarda kullanmamak
- Kapsamlarını kısıtlamak suretiyle oturum cookie’lerini korumaya çalışmak
- Daha önceden bir oturum açılmış değilse yeni bir oturum açmak veya kullanıcının haklarının derecesi(privilege level) değiştiği anda  yeni bir oturum açmak
- Yazılımcının kendi oluşturduklaırnın dışındaki ID’lerle asla oturum açmamak
- Kullanıcıların log out olması veya mevcut oturumlarını sonlandırmaları için bir ayarlama yapmayı unutmamak

8- Yetkilendirme

Kimlik doğrulamadan( Authentication) farklı olarak yetkilendirme(Authorization) işlemi istemcinin hangi kaynaklara erişim hakkı olduğunu denetleyen ve belirlenen kısıtlamalara göre erişim kontrolü sağlayan bir yetkilendirme sistemidir. Erişim kontrolü ve yetkilendirme işlemi yapan OAuth sistemi ile kimlik doğrulama işlemi yapan CAS Authentication sistemi birbirinden farklı işlevleri yerine getirir, ancak yetkilendirme süreci kendi içinde ayrı bir kimlik doğrulama mekanizması barındırmaktadır. OAuth sisteminde yetkilendirme sürecinden önce veri kaynaklarının sahibi yetkilendirme(authorization) sunucusu tarafından kimlik doğrulama işlemine tabi tutulmaktadır, aynı şekilde istemci de kimlik doğrulama işleminden geçirilmektedir. Kimlik doğrulamayı yetkilendirme üzerine uygulamanın yararı domainler arası kimlik bağımsızlığını koruması ve son kullanıcı izninin alınmasını kolaylaştırmasıdır. Bir diğer kolaylık ise kullanıcının doğrulanmış kimlik bilgileri ile başka diğer korunmuş API’lere erişim izni de isteyebilmesidir. Bu hem geliştiricilerin hem de kullanıcıların süreci yönetmesini kolaylaştırmaktadır.

Öneriler

- Yetkilendirme işlemini sadece sunucu üzerinde kontrol etmek
- Beyaz listeleme, kara listelemeden daha güvenli ve hata oranı daha az olarak tanımlanmaktadır.
- Uygulamalar, dosyalar ve profiller gibi kaynaklar için yetkilendirme işlemi uygulamak
- Yetkilendirme alan adına(domain) özgüdür, ancak izin modeli belirlenirken göz önünde bulundurulması gereken bazı ortak modeller vardır, eğer zorlayıcı bir neden yoksa standart modül ve platformları kullanmak daha güvenlidir.
- Rol Tabanlı Erişim Kontrolü(Role Based Access Control-RBAC), kullanıcılara roller atanması ve bu rollere de izinler belirlenmesi yoluyla erişim kontrolünü sağlayan bir modeldir. Kullanıcıların aldığı aksiyonların ve erişim girişimlerinin denetimi bu izinler esas alınarak yapılmaya çalışılır.
- Rol tabanlı erişim kontrolünün yetersiz kalacağı kompleks sistemlerde Nitelik Tabanlı Erişim Kontrolü(Attribute based Access Control-ABAC) yöntemi kullanılabilir. Nitelik tabanlı erişim kontrolü, rol tabanlı erişim kontrolünün genellenmiş bir versiyonu olarak tanımlanmaktadır. Bu yöntem kullanıcının niteliğini, erişebildiği alanı ve kullanabileceği kaynakları kapsayan ve erişim denetimini yapan bir kontrol sistemidir.

Kaynakça:

[1] https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/

[2] https://martinfowler.com/articles/web-security-basics.html






İlgili İçerikler: