Web Uygulamalarında Güvenlik Önlemleri

Geçenlerde bir hizmet almak için girdiğim kurumun web uygulamasında dolaşırken şüphelendiğim ve gözüme çarpan detaylardan dolayı biraz kurcalamam ile bulduğum güvenlik açıklarından grurla değil, malesef böyle şeylerin göz ardı edilmesinden kaynaklı şaşkınlıkla hayal kırıklıklarıyla ilgili konulardan bahsedeceğim. Kurumları ve açıkları deşifre etmemek adına bilgileri gizli tutarak işleyeceğiz.

Genelde uygulama geliştirilirken güvenlik göz ardı edilir, ileride üstünden geçilecek yapılacaklar listesinde kalır. Veya çok basit klasik önlemler alınır şimdilik yeterli idare eder diyip geçilir. En iyi ihtimal bariz belli yerlerde bir kaç test yapılır iyi sonuçlar alınır ama diğer tüm proje ve kapsam düşünülmez pas geçilir.

Bugün aslında baktığımızda hep en bilindik en basit gördüğümüz şeylerden dolayı beklemediğimiz durumlarda kalabiliyoruz. Buradan da zarar gelmez, buradaki kullanıcılar sadece şirket içerisin de yer alan kişiler, bu ayarlara gerek yok, sistemi ağırlaştırmanın ek maliyet getirmenin anlamı yok gibi kurulan cümleler ileride gerek baş ağrısı gerek maliyet türünden yüklü bir götürüsüyle karşılaşma riskini doğurur. Güvenlik göreceli ve kapsamlı bir konudur.

Canlı bir örnek olarak; daha yakın zamanda bir kuruma ait web uygulamasında güvenlik açıkları tespit ederek çalışmalar gerçekleştirdim. Biz sektörde yer alan kişiler işimizi severek ilgiyle yapmalıyız. İnternette gezdiğimiz kullandığımız bir uygulamayı sadece kullanıp geçmemeli, arkasında çalışan sistemi düşünmeli, tasarımı incelemeli, kullandığı teknolojileri yakalayabilmeli, eleştiri ve incelemeler yapmalıyız.

“Yazılımı geliştirici olarak nasıl kendi uygulamamızı geliştirirken son kullanıcı gözünden bakıyorsak, var olan bir uygulamayı incelerken de yazılımcı gözüyle bakmalıyız.” Tahsin Yüksel 🙂

Yine bir uygulamada içime sinmeyen tasarımlar içinde dolaşırken bazı sıkıntılı durumlar fark ettim. Uygulamanın geçici olarak veya bir şekilde yetiştirilmek idare edilmek üzerine yapıldığını düşündüm. Sayfalarda dolaşırken basit hatalardan kaynaklanan error sayfalarına da rastladım. Biraz daha huysuzlandım ve ilgimi çekti kurcalamaya başladım.

Açıkların doğruluğu ve kanıtlaması adına testler denemeler gerçekleştirmem gerekti. Tabi bu test ve çalışmaları yaparken iyi niyetli bile olsanız verebileceğiniz zararı düşünerek bilinçli hareket edilmeli. Database havaya uçurmanın bilgilere zarar vermenin anlamı yok.Kaş derken göz çıkarmamak gerekir.

Uygulamada yetkili erişimlerini de elde ederek bir yetkili kişinin sistemde görebileceği bilgilere erişmiş olmuştum. Bu bilgiler arasında kullanıcı bilgilerinin olduğunu söyleyebilirim.

Bir kurumsunuz belki milyonlarca kullanıcınız var ve en önemli data olarak bilinen kullanıcı bilgilerinin sizin uygulamanız yüzünden açığa çıktığını düşünün.Buna Sony ‘in zamanında plastasion da yaşadığı durumu örnek verebilirim.

Yaptıkları bir başka hata için de veri tabanı hakkında bazı bilgiler edinmiştim. Daha fazla ilerlemeyerek yarıda bıraktım. Ertesi gün yine merakım sonucunda yeni çalışma ve araştırmalar yaparak aslında durumun çok daha dramatik olduğunu fark ettim. Artık bir çok kamuya bağlı kurum daha halk dilinde çoğumuzun bildiği şekilde hack – hacklendi. (Güvenlik açıkları bulundu)

Ve başka bir devlete bağlı önemli bir projenin de güvenlik açıklarından içeri girmiş olmuştum.

Çok zorlanmadan sorun yaşamadan bunları görmüş oldum. Çok fazla ileri gitmek ve kurcalamakta açıkcası istemedim ve yapmadım, zamanımda yoktu. İnanıyorum ki derine gidilse veya uğraşılsa çok şeyler açığa çıkarılabilir başka şeyler öğrenilebilirdi. Herkesin niyeti bizim gibi iyi olmayabilir bu yüzden elinizden geldiğince tüm tedbirleri almaya özen göstermeliyiz.

Vakitten dolayı yazıyı da uzun tutmamak adına uyarı ve bilgi verici bir yazı olsun diyip toparlayacağım, güvenlikle ilgili ayrı yazılarımıza yer vereceğiz zaten. Şimdi aşağıda belli başlı konulardan bahsedelim:

Güvenli Uygulama Geliştirme

Uygulamanın ne derece güvenli olması gerektiği ne bilgiler içerdiği ne için nasıl kullanılacağı incelenmeli gerekli önlemler alınmalıdır.

Güvenlik önlemi olarak sadece firewall, ips gibi çok uzaklarda değil en başta yazılımda düşünmeli uygulamalıyız.

Her şey uygulamayı hızlıca yetiştirip hayata geçirelim olmamalı. Yazılımcı ve ilgili kişilerin üzerinden zaman baskısı atılmalıdır.

Her programlama dili için güvenlik açıkları söz konusu olmaktadır. Php güvensizdir .Net daha güvenli uygulama geliştirilir gibi felsefelerden vazgeçilmeli, programlama dili uygulamayı güvensiz yapmaz dili nasıl ne kadar kullandığınız durumu değiştirir.

Programlamada kullanılan dil, kütüphaneler, 3.parti araçlar, veri tabanları gibi uygulamayı meydana getiren tüm bileşenler her zaman takip edilmeli. Güncellemeler, güvenlik açıkları yeni geliştirmeler yakından izlenmeli. Unutmamak gerekir ki başta güvenlik açıkları olmak üzere bir çok konuda eksiklik giderildiği için güncellemeler çıkmaktadır.

Çok güzel tüm güvenlik önlemlerini düşünerek uygulama geliştirdiniz testler yaptınız her şey çok iyi ve güvendiniz uygulamanıza. Ama kullandığınız bir editörde veya 3.parti bir araçta açıklanan tespit edilen bir açık sizin o çok güvendiğiniz güvenli uygulamanızın bayrağını indirebilir.

Kullanıcılarınız ne kadar veli nimetiniz ise o kadar da sizin için güvenlik tehditiniz bunu unutmayın. Bu en önemli anahtardır. Gelen kullanıcılardan bu iyi bu kötü kullanıcı diye ayırt etme şansınız yok malesef ki. Biz hepsine ya bu gözü dönmüş tehdit bir kullanıcı ise diye yaklaşarak diğer iyi niyetli kullanıcılarımıza daha iyi bir hizmet sunmuş oluruz.Çünkü yapılan saldırı sizin kadar diğer iyi kullanıcılarınızı da etkileyebilir.

Kullanıcıdan veri girişi aldığınız ve sunduğunuz formlar, url, cookie gibi tüm alanlar aslında sizin kalenizin kapılarını temsil etmektedir. Yani uygulamanızın dışarı açıldığı kapılar. Siz eğer buralara nöbetçiler yerleştirmez önlem almaz iseniz giren çıkan belli olmayacak gelecek tehlikelere açıksınız demektir. Bizde verileri almadan önce mutlaka filtreleme kontrol işlemlerinden geçirmeliyiz.

Her gün yeni bir açık ortaya çıkabilir tıpki yeni bir ürün yöntem güzellik çıktığı gibi.Bunun için kendimizi geliştirmeli takip etmeliyiz. Kurumlar ise mümkün olduğunca çalışanlarını bilinçlendirmeli öğrenmeye eğitmeye teşvik etmelidir

Uygulamayı sık sık test etmeli ama acımasızca test etmeliyiz. Bir iki basit ufak numaralar ile kendimizi kandırmamalıyız. Bazen önlem aldığımız bir durum başka bir yol ile aşılabilinir. Birim testler yapılmalı değişik seneryolar denenmeli.

Uygulamada ne olursa olsun log sistemi olmalı. Kimin ne zaman nerede nasıl ne yaptığını bilmiş olursunuz. Diyelim ki hacklendiniz en azından kimin nasıl ne işlemlerde hangi bilgileri kullanarak yaptığını öğrenmek istemez misiniz. Kullanıcının gerçek bilgilerini alacağınızı düşünmeyin sadece nerede hangi parametrelerle ne zaman veya ne zamandan buyana kırıldığınızı görmek için.Böylece önlem alırsınız iş işten geçtiyse de dersler çıkarırsınız. Gelişmiş sistemler ile anlık bu durumları haber verebilecek sistemler geliştirin veya kullansanız tabi daha bir güzel olur sanki:)

Hataları yönetin. Hatalardan kaçmayın eğer bir hata aldıysanız aldığınız söyleniyorsa peşine düşün derim hatadan kaçmak değil yüzleşmek gerekir.Bazen hata kovalamakta bir zevk:) Ekrana hataları kabak gibi basmayın bu sizin kötü niyetli kişilere verdiğiniz bahşiş olur. Hatalarda yer alan bilgiler çok kritik bilgiler içeriyor olabilir. Veri tabanı tablo bilgilerinden çalıştığınız dosya yollarına kadar.

Yetkilendirme oturum açma gibi alanlar çok daha yakından takip edilip incelenmeli.

Google özel aramalar ile hiç istemediğiniz bilgileriniz gün yüzüne çıkmış olabilir. Bunlar kontrol edilmeli gerekli yerlerde botlar engellenmelidir.

Dizinleri listeleme görüntüleme engellenmeli. Bu gözden kaçırılırsa istenmeyen sonuçlar olması içten bile değil.

Şifre politikanız olmalı ilkeler yöntemler belirlenmelidir.

Bazı veriler database de doğrudan saklanması yerine şifrelenerek saklanmalıdır. Bu ilgili tablo ele geçirilse de veya ilgili kayıt bilgileri ele geçirilse de işine yaramayacak demektir. En azından bir nebze böyle düşünebiliriz.

Açık olan portlar ve diğer erişim methodları dikkat edilmeli önlem alınmalı. Mümkün olduğunca varsayılan değerlerden uzak durulması gerekir. Çünkü tüm varsayılan bilgiler ilk seferde denenecek yoklanacak işlerdir. Varsayılan portlar, varsayılan ayarlar, varsayılan bilgiler, varsayılan erişim yolları vs.

Test dosyalarımızı ortalarda bırakmamalıyız. Evet basit geliyor ama bir çok kişinin göz ardı ettiği konuların başında gelir. phpinfo dosyanızın ortada bırakıldığını düşünün. İntihar sebebi. Bir test fonksiyonu veya dışarıdan parametre alan test methodları da olabilir. Veri tabanı tablolarını listelediğiniz, şema bilgilerini paylaşan fonksiyon yazdınız ve test için lazım olur diye bıraktınız diyelim. Bu uygulamanın intihar sebebi olabilir.

Freamworkler güncel güvenlik açıklarına göre tasarlanırlar ve bu zafiyetlerin bir çoğunu üstlenerek bize kolaylıklar sağlarlar.

Bazı Güvenlik Efsaneleri:

  • Formdaki gizli inputlar(“hidden”) görülemez değiştirilemez .
  • Javascript ile formdaki verileri kontrol ediyorum yanlış güvensiz bir şey olmaz.
  • Seçilebilir kutu ve seçenek (select, radio) elemanlarında belirtilen değerlerden başka değer yer almaz, değiştirilemez.
  • Başka uygulamalardan taklit formlar gönderilemez, benim formum değiştirilemez.
  • Yapılan işlemler sadece uygulama ile borwser arasında. Başkası araya giremez.

bunlar en çok bilinen şehir efsaneleri niteliğinde yanlış bilgilerdir.

 

İncelenmesi Gereken Önemli Güvenlik Açıkları

  • XSS: Siteler arası komut çalıştırma
  • CSRF: Form sahteciliği
  • Sql Injection: DB açıkları sql sorgularını değiştirme, müdahaleler
  • RFI, LFI: Dosya çalıştırma
  • Oturum Güvenliği

gibi önde gelenler.

Güvenlik Açığı Tespiti

Güvenlik açığı test etmenin bir çok yolu var. En başta zafiyet testi olarak bilinen “Penetrasyon” testleri yapılır.

Manuel denemeler yapılabileceği gibi çeşitli araçlar ile de gerçekleştirilir. En iyi savunma saldırıdır diye bir söz var bilirsiniz. Bu yüzden hacker ların saldırı yöntemlerini öğrenmeniz bilmeniz demek gelebilecek saldırıları tahmin etmek savunma önlemleri alabilmek demektir.

Uygulamayı en iyi yazanlar bilir. Bu yüzden yazılım sürecinde daha birim testlerde oluşturarak denemeler yapmak sağlıklı bir yöntem olacaktır.Böylece test edebilirsiniz.

Piyasada ki açıkları ve güvenlik haberlerini takip ederek test etmek. Bu konuda başta OWASP olmak üzere web güvenliği toplulukları takip edilmelidir.

Ve bir çok yöntem daha.

 

Güvenlik Açığı Buldum Ne Yapmalıyım

Bulduğunuz güvenlik açıkları hakkında notlar alıp mümkünse döküman hazırlayın. Nasıl bulduğunuzu, nasıl test ettiğinizi, ne sorunlara yol açabileceği neler daha yapılabileceği gibi bilgilere yer verebilirsiniz.

Kendi Uygulamamızda Güvenlik Açığı

Kendinizin bulunduğu bir uygulamanız ise ekibinizle paylaşın sebeplerini sonuçlarını tartışın beyin fırtınası gerçekleştirin.Benzer açıkların uygulamanın başka yerlerinde var olup olmadığını, ne zamandan beri açıkla yaşadığınızı hangi önlemleri alabileceğinizi geçmişe yönelik şüpheler varsa önceki dataların incelemesini yapılır. Gerekli işlemler yapılarak sorun giderilir. Ve ekibe bu sorun anlatılıp sunum yapılarak paylaşılırsa çok faydalı olur.

Başka Bir Uygulamada Güvenlik Açığı

Eğer başka bir kuruma ait uygulama da açık bulduysak; iyi niyetimizi hiç bir zaman kaybetmeden üstümüze düşeni yapmalıyız. Testler yaparken zarar vermemeli, bilgilerden kötü niyetli yararlanmamalıyız. Döküman hazırladıktan sonra iletişim kuracağınız bilgiler edinilip kurum ile iletişime geçilir. Gönül ister ki kurumdan da aynı niyetle takdir edilir bir şekilde geri dönüş almak takdir edilmek. Gel gelelim ki günümüzde bu konuda değer verip beklenen cevapları almak büyük ihtimalle hayal olarak kalabilir. Sizin uyarılarınızı hiç dikkate almayan kurumlar bile olacaktır veya bir teşekkür etmeyi akıl bile edemeyenler olacaktır. Aslında yaptığınız bu uyarıyı dikkate almayarak başlarına gelebilecekleri görmezden gelmiş olabilirler. Google gibi şirketlerin bu konulara nasıl önem verip hangi politikaları izlediklerini kurumların incelemelerini yaklaşımlarını değiştirmelerini öneririm en azından isterim.

Sonuç:

Bulduğumuz ve öğrendiğimiz rastladığımız açıklardan ders almak en önemli konudur. Hata yapabiliriz bir çok soruna sebebiyet vermiş olabiliriz önemli olan ders çıkarmaktır. Aldığımız dersleri de paylaşmaktır. Bilinen bir tartışma da hiç bir zaman bir uygulama yüzde yüz güvenli olamaz tartışmasıdır. En iyi uygulamalar bile sorunlar yaşayabilir. Bu konu tartışıla dursun bize bunlara engel olmak elimizden geldiğince sağlamlaştırmak düşer. Baştan önlemler alarak bunları klavuz ederek, kendimizi de geliştirerek önlemler alarak daha sağlam daha sorunsuz yapılar geliştirmeliyiz.

Edindiğim tecrübe ve bilgilerden aklıma gelenleri aktardım, geldikçe de eklemelere devam ederim.

Bu konu başta da belirttiğimiz gibi çok kapsamlı konudur. Nelere sebebiyet verebileceği, hangi önlemlerin olduğu, hangi tehdit çeşitleri gibi bir çok konu başlığı çıkar uzar gider. Uygulama geliştirirken güvenlik önlemleri ve yöntemleri içeren açıklayıcı örneklerle makalelerde paylaşmış olacağız.