Güvenli kod yazımı

Cansiz

New member
Güvenli Sistemlere Duyulan İhtiyaç


Internetin büyümesiyle birlikte artık bilgisayarlar birbirleri ile daha sık haberleşmeye başladı. Eskiden her bilgisayar okyanustaki bir ada iken, şimdi nerdeyse bir ağ üzerinden bağ gerçekleştirmeyen bilgisayar kalmamıştır. Önceleri ki belkide programcılar için cennet günleriydi, yazılım içindeki bir hata sonucu belkide oluşacak en kötü şey, kaydedilmemiş verinin kaybıydı. Oysa ki şu andaki yazılım hataları sonucu sistemi tamamen bir üçüncü kişiye teslim edebilirsiniz.

Zaman ilerledikçe, bilgisayarlar, kol saatleri, PDA ler, embedded sistemler, televizyonlar, cep telefonları internet üzerinden ( veya özel başka ağlar üzerinden ) diğer araçlarla haberleşmeye başladı. İlk başta yazılımcılar, yepyeni bir pazar, olağanüstü fırsatlar, bir leb-I derya olarak düşündükleri ama biraz işin içine giripte birazda kötü tecrübe yaşandıkça aslında bubi tuzaklarıyla dolu bir sistem olduğunu anladılar.

www nin asıl anlamı world wide web ( dünyayı saran ağ ), burada ironi yaparak, wild wild web ( vahşi vahşi ağ ) denmiştir.



Önemli Not : Hiçbir zaman benim uygulamam, internet ortamında veya ağ ortamında çalışmayacak gibi tahminlerde bulunmayın. Bunun yerine kodunuzun, internetin tam ortasında hatta ateşduvarınında önünde olduğunu düşünün


Aslında güvenli kod yazımı için ilk adım, sistemi dizayn ederken, güvenlik unsurlarınıda düşünerek tasarlamaktır. Önceden güvenlik unsurları düşünülerek tasarlanmış sistemler, sistem bitirildikten sonra güvenlik unsurları katılan sistemlerden her zaman daha güvenli olmuştur. Güvenli tasarım ve güvenli kod her zaman kaliteli sistemlerdir. Kod yazarken kaliteden ödün vermeyin.



Internet üzerinden çalışan sistemler
Genelde güvenlik işiyle uğraşan sistemciler, bir bilgisayarı gizlice internete çıkartıp buna gelen saldırıları bekler ve inceler. Bu tip bilgisayarlara honeypot denir. Buradaki amaç hackerlerin ( lamer vs vs ) hangi yeni yöntemleri denediğini görmektir. Bu konuda ilginç bir örnek Microsoft firmasından şöyle verilmektedir.

Windows 2000 üretilip, piyasa sürülmeden once, henüz test çalışmaları yapılırken honeypot bir sistem kurulmuştur. Microsoft gizlice bir bilgisayara Windows 2000 yükleyip Cuma günü akşam sistemi IIS kurarak nete bağlamıştır, sistem Pazartesi günü çok yoğun atak altındaydı. Sistem kimseye haber verilmemişti !! Peki sistem nasıl keşfedilmişti ?

Devamlı olarak dünyanın birçok yerinden birçok insan, Microsoft firmasının sahip olduğu IP aralığındaki tüm bilgisayarlarda port tarama gerçekleştirir. Bu kişilerde bir tanesi veya muhtemelen çoğu sisteme eklenmiş yeni bilgisayarı hemen keşfettiler. Port taraması sonucunda da 80 nolu port bulununca bunun bir web server olduğu anlaşıldı. HTTP HEAD request kısmını okuyarakda bunun IIS 5 olduğunu ortaya çıkardı, fakat Microsoft firması henüz IIS 5 i piyasaya çıkartmamıştı :O) Daha sonar bu ipyi internet explorer ile ziyaret ettiğinde bunun Tıkla! ( artık adres çalışmıyor :O) ) olduğunu farketti.

Bu kişi daha sonra slashdot.org a bir mail atarak durumu bildirdi. Birkaç saat sonar binlerce atak başlamıştı bile.

Burada dikkat edilmesi gereken nokta, Microsoft firmasını yaptığı tek şey internet ağına bir bilgisayar çıkartmasıydı J . Aynı şey sizinde başınıza gelebilir.



Kabul etmeniz gereken bir nokta var, ataklar var ve hep olacaktır. Bazı kişiler çok fazla bilgi ve yeteneğe sahiptir, çoğunluk ise iyi bir okuyucu ve deneyicidir. En önemlisi bunların çoğunluğunun çok fazla boş vakti vardır. Azınlıktaki kişiler sistemin güvenliği açığını
bulup bir takım araçlar yazarlar, script kiddies denilen yaşları genelde 18 den küçük, bu araçları kullanan kişilerde hemen denemelere başlarlar.

Herkesin hemen herşeyden haberdar olması olayın bir başka dezavantajıdır. Exploit yazıldıktan sonra ( hackerlerin yazdığı araçlar ), hemen tüm script kiddies ler devreye girip dener, siz daha kodunuzun hatasını düzeltme yamasını hazır hale getirmeden , binlerce kişi atağı başlatır.

Peki bir hata yaptınız kodunuzda, bunu düzeltme işlemi ve maliyetini biliyor musunuz ?

İşte Microsof firmasında bir hata bulunduktan sonraki maliyet adımları :

  • Yamanın yazılması için gerekli planın yapılmasının maliyeti, birisi çıkıp bir yama planı yapmalıdır.
  • Hatalı bölümü bulmak için çalışan uygulama geliştiricilerin maliyeti
  • Hata bulunduktan sonra düzeltme işlemini yapan uygulama geliştiricilerin maliyeti
  • Yeni haliyle sistemi test eden geliştiricilerin maliyeti
  • Yamanın kurulumunu hazırlayan geliştiricilerin maliyeti
  • Kurulumun testini hazırlayan grubun maliyeti
  • Uluslarası versiyonlar için kurulum ve test maliyeti
  • Yamayı web üzerinden post etmenin maliyeti
  • Dökümantasyonun hazırlanma maliyeti
  • Yamadan dolayı oluşacak kötü izlenim için marketing çalışması maliyeti
  • Yama indirilirken oluşan bandwidth maliyeti
  • Üretimdeki olası düşüş maliyeti ( bu yama için çalışan kişilerin başka işler yapmasının engellenmesi )
  • Müşterilere oluşan maliyet. ( Sistemlerini reboot edebilirler vs )
  • Müşterilerin sizden vaçgeçmesi yüzünden oluşan maliyet
AlıntıdıR.!
 

Cansiz

New member
Güvenli Sistemlerin Tasarımı

Güvenli sistem tasarımı için, güvenlik unsurları, sistem tasarımın en başında yer almalıdır. Güvenlik açığı bulunan sistemlerde iki genel hataya rastlanmaktadır.

Birinci hata “straightforward”. Bir uygulama geliştirilir, test edilir ve müşterilere ulaştırılır. Bu aşamalarda, yazılım geliştiriciler ya güvenlik unsurlarını düşünmez ve eklemez ya da, güvenlik unsurlarını eklediğini “düşünür”. Daha da kötüsü, alakasız güvenlik algoritmalarını sırf o gün meşhur diye, ya da paketin üzerine yazmak için eklerler.

Bu konuda kitabın yazarının bir örneği var, şöyleki :

Bir firma çıkartacağı yeni ürüne RSA public-key şifreleme özelliğini koyuyor. Sebebi sorulduğunda ise, çok popular bir teknoloji olduğu için bunun ürünün satışına yardımcı olacağı düşündükerini söylüyor. Sonra rsa algoritmasını uygulamaya gerçekleyen yazılımcıyla görüşüp nasıl gerçeklediğini soruyorlar. Uygulamacı ise üniversitede öğrendiği teorik bilgiyle ( iki büyük asal sayı al vs vs ) diye anlatıyor. Teorik bilginin gerçek hayat problemlerini çözmek konusunda pek bir başarısı maalesef yoktur. Uygulamadan rsa algoritması kaldırılırken, yazılımcıya ise işletim sistemin apilerini kullanması tavsiye edilir. Aslında bu durumdan daha da vahimi uygulama geliştiricinin tek başına geliştirdiği kendi şifreleme algoritması olabilirdi.

İkinci büyük hata ise, güvenlik unsurlarını, kodlama sonrasına bırakmaktır. Bu hata şu sebeplerle engellenmelidir :​
  • Güvenlik unsurlarını en başta tasarlamayıp, kodlama sonrasına bırakmak, kodu kaplamaya benzer.
  • Kodlama sonrası eklentiler pahalıdır çünkü kodda tekrar değişiklik gerektirebilir.
  • Kodlama sonrası eklenti, varolan algoritmada değişiklik gerektirebilir.
Neden Güvenli Kodlamada Hatalar Yapılır
Bu konuda yapılan çalışmalarda genel olarak şu sebeplere rastlanmıştır :
  • Güvenlilik işi sıkıcıdır
  • Kodu güvenli yapma işlemi fonksiyonalletiği kısıtlar
  • Güvenlik ölçmenin bir birimi ve metodu yoktur
  • Güvenlik uygulama geliştiricinin bir görevi değil, bu işin uzmanının bir görevidir.
Güvenli Kod Yazmayı yaşayarak öğrenmek​
  • Güvenlik için liste hazırlayın
  • Kodlanacak program için güvenliğin önemini yazın
  • Güvenlik işleminin geliştirilecek programın vazgeçilmez öğesi olduğunu unutmayın
  • Hatalarınızdan ders alın
  • Programınız çalışırken minimum “sistem hakları” ile çalışsın
  • Programınızın bulunduğu ortamı en güvensiz yer olarak düşünün
  • Hata oluşması durumunda neler yapılacağının listesini çıkartın
  • Hata oluştuğunda programınız güvenli moda geçmeli
Güvenlik Listesi ve Hazırlanması​
İlk adım olarak oluşturacağınız bu listenin mümkün olduğu kadar ürün bağımsız yapın, daha sonra çıkan örnek dosyanızı her yazılımınız için özelleştirin.

Bu listeler hazırlanırken ve özelleştirilirken aşağıdaki sorulara cevap verebilmelisiniz.

  • Programınızı kimler kullanacak
  • Programınızın kullancıları için güvenli kod veya güvenlik ne demek, bu tüm kullanıcılarda aynı mı yoksa kullanıcı tiplerine gore değişebilirmi
  • Programınızın çalışacağı platform nedir , cep telefonu, sunucu, internet vs.
  • Güvenli kod derken, tam olarak neyi korumak ve güvence altına almanız gerekir
  • Eğer güvence altına almanız gereken nesneleri koruyamazsanız, bunun kullanıcılarınıza etkisi nedir ?
  • Programınızı kim yönetecek, ( yönetmek <> kullanmak )
  • Programınızı kodlarken, işletim sistemi size güvenli kod adına neler sunabiliyor
En az hak kullanarak çalışma
Bilindiği üzere, Windows NT,2000,XP,.Net Server, Xnix işletim sistemlerinde kullanıcılara çeşitli haklarla sistem üzerinde çalışma yetkisi verilir. Sizin programınız, bu haklardan en azı bile olsa çalışabilmeli. Birçok program gereksiz yere administrator veya root yetkisi ile çalışmak üzere tasarlanır, buda programınızı bir şekilde kırabilen bir kişinin sistem üzerinde aynı yetkilerle işlem yapabilmesine olanak verir.

Aslında programınız en düşük yetkilerle çalışabilse bile, birçok kullanıcı maalesef sistemine admin hakları ile giriş yapar ihtiyacı olmadığı halde. Aslında belkide tek bu sebeple Windows 2000 ve sonraki işletim sistemlerinde, normal kullanıcı yetkisi ile girildiği halde, admin hakları program çalıştırabilme eklenmiştir.

Programınızın en az hak ile çalışabildiğinden emin olabilmek için, programınızın eriştiği sistem kaynaklarını listeleyin : dosya erişimleri, registry erişimleri,sistem debug etme erişimleri vs



Dışardaki sisteme güvenmeyin
Uygulamınızın etrafındaki sisteme güvenmeyin. %100 kontrolunuzun olmadığı sistemlerden gelecek datanın güvensiz, değiştirilmiş olabileceğini unutmayın. Bu konuda kendi başımda geçen gerçek bir olay ile örnek vermek istiyorum : Çok büyük bir firmanın ( 1 milyar dolar civarında satışı var ), büyük bir bankaya ( türkiyedeki en iyi banka bence :O) ) verdiği bir yazılımda bu hata vardı. Maalesef sunucuya kurulan bu yazılıma beklenen bilgi beklenen formatın dışında geliyordu, sunucuda her seferinde göçüyordu. Datanın ağ üzerinde neden değiştiği hiçbir zaman bulunamadı, muhtemelen bir virusten kaynaklandığı düşünüldü, problemi düzeltmek için sunucu yazılımına ek yapıldı ve yazılımın beklemediği formatta gelen datayı cope atması sağlandı.



Güvenli şekilde hataya düşmek
Unutmayın programınız, siz her türlü önlemi alsanızda bir hata yüzünden kırılabilir. Sistem probleminden vs den dolayı programınız hataya düşerse herşeyi düşünüp hataya güvenli şekilde düşmeniz gerekmektedir. Programınız diğer programların kapatılmasına yol açmamalı, kayıt edilmemiş bilgiyi kaybetmemelidir. Aşağıda verilen örnek koddaki çok ciddi hatayı görebiliyormusunuz ?

PHP:
DWORD dwRet = YetkiAl(); 

If (dwRet == YETKI_ALINAMADI_VEYA_YETKI_HATASI) 

{                // dialog cıkart ve yetki hatası mesajı yaz 

} 

else 

// devam et yetki aldık
Varsayılan güvenlik ayarları
Uygulamanızdaki güvenlik ayarlarından hangilerinin varsayılan olarak aktif, hangilerinin pasif durumda olacağına karar vermek aslında çok zor ve önemli bir süreçtir. Bu durumda kullanılabilecek yöntemlerden biri Pareto İlkesidir. Bu ilkeye yazılıma uyarlarsak, bir uygulamanın ancak %20 si tüm kullanıcıların %80 i tarafından kullanılır. Bu da demekki güvenlik ayarlarınızın %20 si aktif %80 i pasif olabilir.

Şimdi burdaki terimleri bilerek türkçeyi çevirmedim, internette araştırma yaparken hep bu isimlerle bulacaksınız bunları çünkü. İkinci olarak zaten şimdi hepsini açıklayacağız J



Authentication
Authentication, kimliğini ispat etmektir. Burada kimliğini ispat eden bir kullanıcı, bir program veya bir bilgisayar olabilir. Kimlik ispatlama yönteminin sabit bir formu yoktur, bu kullanıcı ismi/şifre, özel tek bir şifre, parmak izi, ip adresi vs gibi birçok şekilde olabilir.

Belli başlı authentication algoritmaları şunlardır :
  • Basic Authentication
  • Digest Authentication
  • Form yapısı ile authentication
  • Passport authentication
  • Windows Authentication
  • NTLM authentication
  • Kerberos v5 authentication
  • X509 authentication
  • IPSec
  • RADIUS
Bunların diziliş sırası daha az güvenliden daha çok güvenliğe doğru değildir. Hepsinin kullanım alanı farklıdır. Şimdi bunları inceleyelim.
Basic Authenticaiton
Tıkla!

Artık bunun neresi authentication sayılıyorsa

En basit ve ilkel authentication metodur. Tüm web sunucuları ve browserler bunu destekler. Şifre ağ üzerinden giderken bir koruma yapılmaz. Kullanıcı ismi ve şifre ağ üzerinden giderken base64 algoritması ile şifrelenir ki buda çözülmesi kolay bir algoritmadır. Base64 algoritması ile ilgilenen varsa ilgili bilgiyi 1521 nolu rfc de bulabilir, eğer ilgilenen varsa ve ingilizcesi yoksa mail atarsa çevirmeye çalışırım. Eğer bağlantı protokolünüz SSL/TLS değilse kullanılmaması şiddetle tavsiye edilir.



Digest Authentication
Digest Authentication, Basic Authentication gibi rfc2617 de tanıtılmıştır. Yapı olarak basic authentication a çok benzemekle beraber farkı şifre ağ üzerinde taşınmaz. Bu yöntem http protokolüden ziyade LDAP ,IMAP, POP3 ve SMTP protokollerinde kullanılır



Form yapısı ile Authentication
Bu authentication yöntemi için herhangi bir standart yoktur. Web sitelerine üye olurken veya üye iseniz login olurken kullanılan formlardaki authenticaitondır. Microsoft herşeye olduğu gibi buna da el atarak bu konuda bir standartlaşmaya gitmek için ASP.NET e bir sınıf eklemiştir. ASP.NET bilmediğim için nedir ne değildir birşey diyemeceğim merak eden varsa help ten FormsAuthenticationModule a bakabilir. Buradaki bağlantı türününde SSL/TLS olması tavsiye edilir. Bu tip authentication çeşidini internetteki web sitelerinde sıklıkla görebilirsiniz.



Microsoft Passport Authentication
Bu konuda detaylı bilgiyi Tıkla! dan bulabilirsiniz. ASP.NET ede bunu desteklemek için gerekli sınıflar eklenmiştir.

Windows Authentication
Windows işletim sistemleri 2 tip authentication yöntemi destekler, NTLM ve Kerberos. Authentication işlemi SSPI denilen arabirimle yapılır. Dört adet arabirim vardır, NTLM,Kerberos, Schannel ve Negotiate. NTLM ssp’si NTLM authentication için, Kerberos Kerberos için, Schannel SSL/TLS bağlantılar için kullanılır. Negotiate ise, W2K ve sonraki işletim sistemlerinde sunucu ile istemcinin NTLM’mi yoksa Kerberos mu kullanacağına karar verir.
 

yeozkara

New member
Teşekürler eline sağlık her ne kadar yarısına kadar okudumsa da, okuduğum kadarı ile süper.
 

HTML

Üst