Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Güvenli Yazılım Geliştirme

Güvenli Yazılım Geliştirme

Şirket içi eğitim için hazırlanmıştır

Ahmet Pirimoğlu

November 30, 2024
Tweet

More Decks by Ahmet Pirimoğlu

Other Decks in Programming

Transcript

  1. Ajanda • Kavramlar • Güvenli Yazılım Geliştirme Süreçleri • Sık

    Karşılaşılan Güvenlik Açıkları • Güvenlik Standartları ve En İyi Uygulamalar • Kod İnceleme ve Güvenlik Testleri • Sonuç ve Öneriler
  2. %100 Güvenlik Yoktur "The only secure computer is one that's

    unplugged, locked in a safe, and buried 20 feet under the ground in a secret location... and I'm not even too sure about that one" -- Dennis Huges, FBI
  3. Ne Kadar Güvenliğe İhtiyacım Var? • Gereksinimleri çıkarma, hedeflerle •

    İhtiyaç olan kadarını tam olarak yapma • Yeniden gözden geçirme periyotları
  4. Geleneksel Yaklaşım ile Koruma • Firewall’lar ile sistemlerimizi koruruz •

    “Saldırganları uzak tutalım” • Kriptografi kullanımı yazılımın güvenliğini sağlar • “Tüm verilerimizi şifreli saklıyoruz” • Yazılım ürünlerinin bittiğinde test edilmesi • Saldır ve yamala (penetrate and patch) • Güvenlik özellikleri yazılımlarımızı güvenli kılar • “Biz SSL kullanıyoruz” • Proje hedefleri içerisinde güvenliğin konu edilmemesi • “Güvenlik konusunu bir sonraki sürümde ele alacağız”
  5. Tehdit Modelleme •Yazılımınıza yönelik tehditleri bilmeden güvenli bir yazılım üretemezsiniz

    •Tehdit modellemesi yazılım geliştirmeden önce yapılmalıdır
  6. Tehdit Modelleme • Modelleme Süreci • Sistemi Anlamak • Tehditleri

    Belirlemek • Risk Değerlendirme • Önlemler Geliştirme • Araçlar, • Microsoft Threat Modeling Tool • OWASP Threat Dragon
  7. Tehdit Modelleme • Bir e-ticaret sitesinde: • Hassas Veri: Kullanıcıların

    kredi kartı bilgileri • Tehdit: Veri aktarımı sırasında dinleme (man-in-the-middle saldırısı) • Çözüm: TLS/SSL kullanarak veri aktarımını şifrelemek • Bu yöntem, yazılımın daha güvenli hale gelmesini sağlamak için proaktif bir yaklaşımdır.
  8. Şifreleme (Karşılaştırma) Özellik AES-256 bcrypt Tür Simetrik Şifreleme Hashing Algoritması

    Anahtar Şifreleme ve şifre çözme için aynı anahtar gerekir. Tek yönlü (geri dönüş yok) Amaç Veri şifreleme Parola koruma Kullanım Alanı Dosya şifreleme, veri aktarımı Parola hashleme, kimlik doğrulama
  9. SAST vs DAST Özellik SAST (Statik) DAST (Dinamik) Test Edilen

    Alan Kaynak kod Çalışan uygulama Zamanlama Geliştirme aşamasında Çalışan yazılım üzerinde Yetenek Mantıksal hataları tespit eder Çalışma zamanındaki açıkları tespit eder Avantaj Erken tespit Çalışma ortamına uygun Dezavantaj Çalışma zamanındaki açıkları tespit edemez Geliştirme sırasında tespit yapamaz
  10. Araçlar SAST • Sonarqube • Fortify SCA • Checkmarx •

    Veracode Static Analysis DAST • OWASP ZAP • Burp Suite • Netsparker
  11. İhtiyaçlar • Güvenlik eğitimi ve farkındalık • Kod tarama ve

    test araçlarının entegrasyonu • Yazılımın güncel tutulması • Siber tehditlere karşı proaktif yaklaşımlar
  12. Girdilerin Sınanması: Neden? • Güvenilmez kaynaklardan gelen tüm girdiler işleme

    tabi tutulmadan önce sınanmalıdır • Uygunsuz girdiler ile bir sürecin işleyişini değiştirmek mümkündür • Neye güvenilebileceği her uygulama ve her kuruluş için farklı olabilir • Kullanıcılardan, ağ üzerinden • Sistem üzerindeki diğer süreçlerden • Library den (.so, .dll vb.) • İşletim sisteminden • Uygulama içerisindeki diğer fonksiyonlardan gelen verilerin sınanması gerekli olabilir
  13. Girdilerin Sınanması: Nasıl? • Geçerli olan girdiler tanımlanmalı ve bunun

    dışındaki veriler kabul edilmemelidir • Tersi yapılmamalıdır: Geçersiz verileri/sembolleri tanımlama ve diğerlerinin tümünü kabul etme • Veriler için maksimum uzunluk/büyüklük tanımlanmalı ve daha büyük girdi kabul edilmemelidir
  14. Güvenli Yazılım Tasarımı Önerileri • Güvenlik gereksinimleri uygulama yaşam döngüsündeki

    her bir aşamada tam olarak tanımlanmalı ve sürekli bir biçimde analiz edilmelidir. • Gözden geçirme sürecinin bu döngüye eklenmesi gerekmektedir.
  15. Güvenli Yazılım Tasarımı Önerileri • Uygulama veritabanında kişisel veri içeren

    birincil anahtar (kimlik no, e-posta adresi vb.) şifrelenerek saklanmalıdır. • Kişisel veriler üzerinde işlem yapılması ana amaç olmayan durumlarda uygulama kişisel verileri maskeleyerek görüntülemeli, aktarmalı veya işlemelidir. • Uygulamanın geliştirme, test ve eğitim ortamlarında kişisel veri olmamalı, anonimleştirilmiş veriler kullanılmalıdır. • Kişisel veri içeren uygulama veritabanı yedekleri şifreli olarak saklanmalıdır. • Uygulama, kişisel veriler için saklama sürelerini takip edebilmeli ve saklama süresi sona eren verilerin silinebilmesini / yok edilebilmesini sağlamalıdır.
  16. Güvenli Yazılım Tasarımı Önerileri • Uygulamadaki bileşenler hata durumlarında varsayılan

    olarak güvenli durumlara geçmelidir • Uygulamaya yapılan tüm erişim istekleri hem istek hem de yanıt zamanında yetkilendirmeye tabi tutulmalıdır. • Geçersiz olmuş, potansiyel olarak tehlikeli işlevlerin bulunduğu kütüphane ve modüller tasarımda ve uygulamada yer almamalıdır.
  17. Güvenli Yazılım Tasarımı Önerileri • Kimlik doğrulaması, özellikle herkese açık

    olan sayfa ve kaynaklar dışındaki tüm sayfa ve kaynaklara erişim için önkoşul olmalıdır. • Tüm parola alanlarında kullanıcı giriş yaparken kullanıcının parolası maskelenmeli ve açık olarak görünmemelidir. • Parola giriş alanları uzun ve karmaşık bir parola girilmesini engellememeli, deyimsel parola kullanımına izin vermeli ya da teşvik etmelidir. Örneğin, parolaların en az 15 karakter uzunluğunda girilebilmesine olanak tanıması, en az bir büyük, bir küçük harf, bir özel karakter ve bir sayı kullanılması, son 5 parolayla aynı parolanın kullanılmaması vb.
  18. Güvenli Yazılım Tasarımı Önerileri • Kimlik bilgileri uygun şifreli bir

    bağlantı kullanılarak iletilmeli ve kimlik bilgilerinin girilmesi için kullanıcıya gereken tüm sayfalar / işlevler şifreli bir bağlantı kullanılarak yapılmalıdır. • Unutulan parola işlevi ve diğer kurtarma yolları geçerli parolayı açığa çıkarmamalı ve yeni parola kullanıcıya düz metin olarak gönderilmemelidir.
  19. Güvenli Yazılım Tasarımı Önerileri • Değişen parola işlevselliği eski parolayı,

    yeni parolayı ve bir parola onayını kapsamalıdır. • Tüm şüpheli kimlik doğrulama kararları için özet veri içerecek şekilde log kaydı oluşturulmalıdır. • Hesaplara ilişkin parolaları korumak için yeterince güçlü kriptografik yöntemler (şifreleme, özet alma) kullanılmalı ve bu kriptografik yöntemlerin kaba kuvvet saldırılarına karşı güçlü olmalıdır.
  20. Güvenli Yazılım Tasarımı Önerileri • Kaba kuvvet saldırıları ya da

    servis dışı bırakma saldırıları gibi otomatik yapılan yaygın kimlik doğrulama saldırılarını önlemek için istekler azaltılmalıdır. (rate limiting, throttling)
  21. Güvenli Yazılım Tasarımı Önerileri • Oturum açma, parola sıfırlama ya

    da hesap unutma gibi işlevler sıralı denemelerle bilgi edinmeye olanak vermemelidir.
  22. Güvenli Yazılım Tasarımı Önerileri • Hassas işlevler gerçekleştirilmeden önce, yeniden

    kimlik doğrulama, daha güçlü bir mekanizmayla kimlik doğrulama, ikinci faktör veya işlem imzalama gibi yöntemler uygulanmalıdır. • Uygulama kullanıcının son başarılı oturum açma tarih ve saatini görüntülemelidir. • Unutulan parola ve diğer kurtarma yolları kısa ileti, e-posta onayı, mobil onay, çevrimdışı onay vb. yöntemleri kullanmalıdır. • Hesaplar geçici veya kalıcı olarak kilitlenebilmelidir. Kalıcı olarak kilitlenen hesaplar eğer üzerindeki geçici kilit kaldırılsa da kilitli kalmalıdır.
  23. Güvenli Yazılım Tasarımı Önerileri • Kaynak kodunda veya kaynak kodu

    depolarında gizli bilgiler, API anahtarları ve parolalar mevcut olmamalıdır. • Yazılım altyapısında ya da herhangi bir bileşen için kullanılan teknolojide üzerinde varsayılan parolalar yer almamalıdır
  24. Güvenli Yazılım Tasarımı Önerileri • Parolalar için bir en uzun

    geçerlilik süresi tanımlanmış olmalıdır. • Örneğin Seviye 3 güvenlik için 30 gün, Seviye 1 ve 2 güvenlik için 60 gün
  25. Güvenli Yazılım Tasarımı Önerileri • URL yeniden yönlendirmelerinin sadece bilinen

    "beyaz liste" adreslerine yapılması, bilinmeyen adreslere yönlendirme gerekiyorsa kullanıcının uyarılarak onayının alınması sağlanmalıdır. • Karşı alanlar arası kaynak paylaşımında (Cross- domain Resource Sharing, CORS) güvenilmeyen veri kullanılmamalıdır
  26. Güvenli Yazılım Tasarımı Önerileri • Uygulama tarafından etkin ve aynı

    zamanlı oturumların sayısı sınırlandırılabilmelidir. • Oturum sonlandığında oturum ile ilgili tüm geçici depolama alanları ve çerezler uygulama tarafından silinmelidir. • Web uygulamalarında oturum çerezlerinde HTTPOnly bayrağı etkin olmalıdır. Ayırca "Secure" olarak yapılandırılmalıdır.
  27. Güvenli Yazılım Tasarımı Önerileri • Log kayıtlarında olayların zaman sıralamasına

    ilişkin araştırma yapılabilecek şekilde zaman bilgisi yer almalıdır. • Log kayıtlarını okuyan araçlarda istenilmeyen bir işlemi yapacak kayıt üretilmemelidir. • Uygulama tarafından üretilen log kayıtları hassas bilgi içermemelidir.
  28. Güvenli Yazılım Tasarımı Önerileri • Uygulama hassas bilgileri formlarda bulunan

    gizli alanlarda saklamamalıdır. • Uygulama Cross-Site Request Forgery (CSRF)'dan kaynaklanan açıklıklardan korunma mekanizmasına sahip olmalıdır.
  29. Güvenli Yazılım Tasarımı Önerileri • Bütün veritabanı sorguları, parametre olarak

    yapılmalı ve veritabanına erişimde kullanılan dile karşı (SQL, NoSQL vb.) enjeksiyon saldırılarını önleyebilecek denetimler yapılmalıdır.
  30. Güvenli Yazılım Tasarımı Önerileri • Uygulama, web servisi ile gönderilen

    veride betik (script) içermeyecek şekilde tasarlanmalıdır. • Uygulama, web servislerinden şifreli olarak paylaşılan verileri yine şifreli olarak saklayacak şekilde tasarlanmalıdır • Uygulama, kişisel verileri şifreli olarak saklamalı ve bu verilerin taşınmasında korumalı iletişim kanallarını kullanmalıdır