Dijital Pazarlama - Seo Ajansı

Güvenli Yazılım Kılavuzu

Yazılım güvenliğinin amacı, başarılı bir iş operasyonunu sağlamak için bilgilerin ve kaynakların gizliliğini, bütünlüğünü ve kullanılabilirliğini bir arada tutmaktır. Bunları güvenlik kontrolleri ile gerçekleştirmeye çalışırız.

Tipik olarak bir yazılım geliştirme ekibi bir uygulama geliştirirken sadece yapması gerektiğini düşündüğü uygulama geliştirme bakış açısından yaklaşır. Ya da şöyle diyebiliriz; kendilerine verilen gereksinimlere dayanarak belirli şeyleri gerçekleştirmek için bir uygulama tasarlarlar. Öte yandan saldırgan, uygulama ile neler yapabileceği ve onu nasıl kötüye kullanabileceği ile daha fazla ilgilenir.

Örneğin bir dropdown menü veya pulldown menü veya hatta bir buton gibi istemci-taraflı kontroller aslında herhangi bir güvenlik avantajı sağlamazlar. Bir saldırgan, OWASP ZAP, Burp Suite gibi web proxy araçları veya Wireshark gibi ağ dinleme araçları kullanarak uygulamanın ilettiği paketleri yakalayıp, kendi özelleştirilmiş isteklerini sunucuya göndererek temelde istemci taraflı yani web ara yüzü kontrollerini bypass etmiş olur.

Ayrıca, Flash uygulamaları gibi Java applet’leri de decompile edilip güvenlik zafiyetleri araştırmak için incelenebilir. Burada önemli olan güvenlik açıklarının bir yazılımın yaşam döngüsünün her bir fazında yer alabileceğini göz önünde bulundurmaktır. Bu yüzden kendi en iyi kodlama pratiklerden oluşan kontrol listemizi oluşturmak isteriz.

“Her bir kilit için, onu kırmaya veya açmaya çalışan birileri vardır. Saldırganlar için tek bir zafiyetin olması yeterli olacaktır.”

Aşağıdaki en iyi kodlama pratiklerini sınıflandırılmış halde bulabilirsiniz.

• Girdi Doğrulama
• Çıktı Kodlama
• Kimlik Doğrulama & Parola Yönetimi
• Oturum Yönetimi
• Erişim Yönetimi
• Kriptolojik Pratikler
• Hata Yönetimi & Log Tutma
• Veri Koruması
• İletişim Güvenliği
• Sistem Konfigürasyonu
• Database Güvenliği
• Dosya Yönetimi
• Memory Yönetimi
• Genel Kodlama Pratikleri

Girdi Doğrulama
• Güvenilir bir sistemde test edin
• Tüm veri kaynakları tanımlayın ve güvenilen ve güvenilmeyen şeklinde sınıflandırın
• Merkezi girdi doğrulama rutini kullanın
• Uygun bir karakter seti kullanın (UTF-8)
• Karakter setini kullanarak verileri encode edin
• Hata durumunda girdileri reddedin
• UTF-8 decoding desteğini kontrol edin
• İstemci tarafından sağlanan veriyi doğrulayın
• Header’ların sadece ASCII içerdiğini doğrulayın
• Redirect’ten gelen verileri doğrulayın
• Veri tiplerini doğrulayın
• Data range’ini doğrulayın
• Veri boyutlarını doğrulayın
• Mümkünse whitelist kullanın
• <>”%’()&+\\’\”

Çıktı Kodlama
• Güvenilir bir sistem kullanın
• Herbir çıktı kodlama için test rutini belirleyin
• Context anlamında çıktı kodlaması yapın
• Tüm karakterleri encode edin
• Context anlamında çıktı sanitize edin — güvenilir olmayan sorgular
• Tüm çıktıları sanitize edin — güvenilir olmayan OS komutları

Kimlik Doğrulama ve Parola Yönetimi
• Tüm sayfalarda/kaynaklarda kimlik doğrulaması yapın
• Kimlik doğrulama kontrollerini zorlayın
• Standart & test edilmiş kimlik doğrulama servisleri kullanın
• Merkezi kimlik doğrulama kontrolleri
• Kimlik doğrulama mantığı ve talep edeni ayırın — redirection kullanın
• Kimlik doğrulama kontrolü başarısız olursa bunu güvenli yapmalı
• Admin & hesap yönetimi güvenli olmalı
• Credential deposu — salted hash’ler — MD5 kullanmayın
• Password hash’leri güvenilir bir sistemde yapılmalı
• Kimlik doğrulama verileri tamamlandıktan sonra doğrulanmalı
• Kimlik doğrulamanın nerede başarısız olduğunu göstermeyin
• Harici sistemler için kimlik doğrulama şarttır
o Şifreli & güvenilir depo
• HTTP POST kullanın
• Geçici olmayan parolalar — şifreli bağlantı
• Parola karmaşıklığını uygulayın!
• Parola boyutu –15 karakterin üzerinde olsun
• Gizlenmiş parola girişi kullanın
• Hatalı login girişimleri — disable edin
• Parola sıfırlama soruları önceden programlanmış olmasın
• Email ile sıfırlama — önceden kayıtlı mail adresi olmalı
• Geçici parola veya link
• Geçici parolalar/link’ler — geçerlilik süresi
• Geçici parolayı değiştirmeye zorlayın
• Kullanıcıları bilgilendirin
• Parolanın tekrar kullanımına izin vermeyin
• Parola minimum kullanım ömrü 1 gün olsun
• Parola değişimini zorlayın
• “Beni hatırla?” kullanmayın!
• Son kullanımı kullanıcıya bildirin
• Monitoring yapın
• Üretici parolaları / varsayılan hesaplar
• Kritik operasyonlar için tekrar kimlik doğrulaması yapın
• Önemli hesaplar için çok faktörlü kimlik doğrulaması yapın
• 3rd party kod — son derece dikkatli ve kontrollü

Oturum Yönetimi
• Sunucunun/framework’ün yönetim kontrollerini kullanın
• Session-ID sadece güvenilir sistemlerde oluşturulmalı
• Standart veya iyi denetlenmiş algoritmaları kullanın
• Cookie’ler için kısıtlanmış domain/path tanımları
• Logout ile bağlantı tamamen sonlanmalı
• Kimlik doğrulama ile erişilen tüm sayfalara erişim sonlanmalı
• Oturum hareketsizlik süresi mümkün olduğunda kısa olmalı
• Kalıcı login’e izin vermeyin
• Login’den önce oluşmuş oturumları kapatın
• Kimlik doğrulama sonrası yeni oturum-ID atayın
• Eş zamanlı login’e izin vermeyin (Facebook, Gmail değilseniz)
• URL’de, hatalarda, log’larda oturum-ID’sini saklayın
• Sunucu taraflı korumalar
• HTTP/HTTPS geçişlerinde yeni oturum-ID atayın
• Oturum başına güçlü token’lar/parametreler kullanın
• İstek başına veya oturum-başına
• Cookie’ler için “Secure” özelliğini aktif edin
• Cookie’ler için “HttpOnly“ özelliğini aktif edin

Erişim Kontrolü
• Sadece güvenilir sistem objeleri kullanın
• Erişim yetkisini kontrol etmek için site genelinde tek bir bileşen kullanın
• Erişim kontrolleri başarısız durumda güvenli olmalıdır
• Uygulama kendi güvenlik konfigürasyonuna erişemezse deny etmeli
• Yetki doğrulama kontrolleri her bir istekte yapılmalı
• Privilege mantığını diğer kodlardan ayırın
• Sadece yetkili kullanıcıların sahip olması gerekenler
o Dosyalara ve diğer kaynaklara erişimi kısıtlayın
o Korunun URL’lere erişimi kısıtlayın
o Korunan fonksiyonlara erişimi kısıtlayın
o Doğrudan nesne referanslarını kısıtlayın
o Servislere erişimleri kısıtlayın
o Uygulama verilerine erişimi kısıtlayın
o Güvenlik-ilişkili konfigürasyon bilgilerine erişimi kısıtlayın

• Erişim kontrolleri tarafından kullanılan politika, kullanıcı ve veri özelliklerine erişimi kısıtlayın
• Durum verileri istemci tarafında saklanmalıdır
• Uygulama mantığı akışını iş kurallarınıza uydurun
• Belirli bir süre içindeki işlem sayısını kısıtlayın (cihaz veya kullanıcı)
• “Referrer” header kullanın
• Uzun oturumlarda tekrar yetki doğrulaması yapın
• Hesap denetimi yapın, kullanılmayan hesapları kapatın
• Servis hesapları için en az ayrıcalık ilkesi kullanın
• Erişim kontrol politikası oluşturun

Kriptolojik Pratikler
• Tüm kriptolojik fonksiyonlar güvenilir ortamlarda olmalı
• Master secret’lar yetkisiz erişimden korunmalı
• Modüller güvenlik bir şekilde fail etmeli
• Rastgele sayı üreticileri onaylanmış olmalı
• Modüller FIPS 140–2 uyumlu olmalı
• Anahtar yönetimi için politika ve süreç oluşturun

Hata Yönetimi ve Log Tutma
• Hata mesajlarında bilgi ifşası olmamalı
• Debug yada stack trace bilgileri görüntülenmemeli
• Jenerik hata mesajları/özelleştirilmiş hata sayfaları
• Uygulama kendi hatalarını yönetmeli
• Allocate edilen memory doğru bir şekilde boşa çıkmalı
• Hata işleme mantığı varsayılan olarak erişimi reddetmeli
• Log’lama kontrolleri güvenilir sistemde olmalı
• Hem başarılı hem başarısız aktiviteleri desteklemeli
• Önemli olaylar için log’lama olmalı
• Log’lara erişim kısıtlanmalı
• Log’lama operasyonları için bir master rutin kullanılmalı
• Hassas bilgiler bulunmamalı
• Log analizi için bir mekanizma olmalı
• Log girişi bütüntüğünü doğrulayın — hash kullanın!
• Aşağıdakileri log’layın
o Giriş hataları
o Kimlik doğrulama girişimleri (*başarısız)
o Tampering olayları
o Geçersiz/süresi-dolmuş token’lar ile bağlantılar
o Sistem istisnaları
o Admin fonksiyonları
o Backend TLS bağlantı hataları
o Kriptolojik modül hataları


Veri Koruma
• En az ayrıcalık ilkesi
• Cache’lenmiş/geçici cookie’leri temizleyin
• Hassas verileri şifreleyin
• Sunucu-taraflı kaynak kodunu koruyun
• Parolalar güvenlik olmayan şekilde saklanmamalı
• Yorum satırlarını silin
• Gereksiz uygulama ve dokümanları silin
• HTTP GET ile hassas bilgi kullanmayın
• Otomatik tamamlama özelliklerini kapatın
• İstemci taraflı cache’lemeyi disable edin
• Uygulama verilerin kaldırılmasını desteklemeli
• Hassas veriler için erişim kontrolleri

İletişim Güvenliği
• Bağlantıyı korumak için TLS kullanın
• TLS sertifikalarının özellikleri
• TLS’in başarısız olması durumunda güvenli olmalı
• Hassas veriler için TLS kullanın
• Harici bağlantılar için TLS kullanın
• Tüm bağlantılarda tek bir standart TLS
• Karakter encoding’i şart koşun
• HTTP header’larda parametreleri filtreleyin

Sistem Konfigürasyonu
• Onaylanmış son versiyonları kullanın
• Güvenlik yamaları yönetimi
• Dizin listelemeyi kapatın
• Process/web-sunucu/servis hesapları — en az ayrılcalık ilkesi
• Güvenlik bir şekilde fail etmeli
• Gereksiz fonksiyonlar ve dosyalar silinmeli
• Test kodları silinmeli
• Robots.txt’de üst dizin şeklinde disallow edin
• Desteklenen HTTP method’larını tanımlayın
• HTTP 1.0/1.1 desteği ve farklıklıkların kontrolü
• HTTP header’lardaki gereksiz bilgileri temizleyin
• Güvenlik konfigürasyonu deposu okunabilir olmalı
• Varlık yönetimi kullanın
• Geliştirme ortamı vs. üretim ortamı
• Yazılım değişik kontrol sistemi kullanın

Database Güvenliği
• Güçlü parametreli sorgular kullanın
• Girdi doğrulama/çıktı kodlama uygulayın
• En az ayrıcalık ilkesi
• Güvenli credential bilgiler
• Hardcoded connection string kullanmayın
• Ayrı bir sistemde konfigürasyon dosyasında şifreli saklanmalı
• İzinlerin kaldırılması için stored procedure kullanın
• Bağlantıyı kapatın (hareketsizlik durumu)
• Varsayılan admin parolalarını değiştirin
• Gereksiz fonksiyonları kaldırın
• Üretici içeriklerini kaldırın
• Varsayılan hesapları silin
• Her uygulama için farklı hesaplar kullanın

Dosya Yönetimi
• Kullanıcı verisini dinamik “include” fonksiyonuna alırken!
• Dosya yüklemeden önce kimlik doğrulama yapın
• Yüklenebilecek dosya türlerini kısıtlayın
• Dosya header’larını kontrol edin
• Dosya yükleme alanını web context’inden ayırın
• Web sunucu için dosyaları kısıtlayın
• Yüklenen dosyalarda execution yetkilerini kapatın
• Unix’te güvenlik upload sağlayın
• İzin verilen dosya adları ve türleri için whitelist kullanın
• Beklemediğiniz değer ise reddedin
• Kullanıcıdan gelen verileri redirect içinde kullanmayın
• Geçerli, göreceli path URL’leri kullanın
• Dizin ve dosya path’lerini kullanmayın
• İstemciye belirli bir dosya path’i kesinlikle göndermeyin.
• Dosyalar ve kaynaklar read-only olmalı
• Yüklenen dosyalar AV/malware taramasından geçirilmeli

Memory Yönetimi
• Güvenilmeyen veriler için girdi/çıktı kontrolleri yapın
• Buffer büyüklüğünü kontrol edin
• Fonksiyon byte sayısını kabul eder
• Buffer sınırlarını kontrol edin
• Input string’leri kısaltın
• Garbage collection’a güvenmeyin
• Execute edilemeyen stack kullanın
• Zafiyetli fonksiyonlardan kaçının
• RAM’i boşa çıkarın

Genel Güvenli Kodlama Pratikleri
• Test edilmiş/onaylanmış managed code
• Built-in API kullanın, doğrudan OS komutu kullanmayın
• Checksum/hash kullanın
• Birden fazla eş zamanlı istekleri durdurun
• Paylaşılan değişkenleri koruyun
• Değişkenleri ve data store’ları hazırlayın
• Yükseltilmiş haklar gerektiğinde
• Hesaplama hatalarından kaçının
• Kullanıcı tarafından sağlanan verileri geçirmeyin
• Yeni kod oluşturulmasını kısıtlayın
• İkincil uygulamalar/kod/kütüphane — gözden geçirin
• Güvenli güncellemeyi implemente edin

Yorumunuz..

Daha yeni Daha eski