Bu hafta düzenlenen Siber Güvenlik Konferansı 2014’te “Son Kullanıcı Güvenliği ve CSP” başlıklı bir sunum gerçekleştirdim. Bunu sunumu gerçekleştirmekteki amacım, Türkiye’de gerçekleştirdiğim web uygulama güvenliği testlerinde şimdiye kadar bir kere bile CSP uygulanmamasıydı. Bu nedenle son kullanıcı güvenliğinin ne denli önemli olduğunu anlattım.
Ne zamandır aklımda olan bir iş olarak Django için CSP app’i geliştirmeyi planlıyordum. Lakin özgür yazılımın güzelliği yine, bir kere daha hayat kurtardı. Mozilla’nin github hesabında Django için CSP uygulaması bulunuyordu.
Son Kullanıcı Güvenliği ve CSP
Bu yazıda Content Security Policy kavramı anlatılmayacaktır. CSP hakkında detaylı bilgilere http://www.html5rocks.com/en/tutorials/security/content-security-policy/ ve https://developer.mozilla.org/en-US/docs/Web/Security/CSP/Introducing_Content_Security_Policy adreslerinden erişilebilir.
Django ve Django-csp
Django uygulamalarına kolaylıkla entegre edilebilecek django-csp uygulamasına aşağıdaki linkten erişilebilir.
https://github.com/mozilla/django-csp
Aşağıdaki komutlar ile django-csp kurulur ve örnek bir django uygulaması oluşturulur.
//django-csp kurulum sudo pip install django-csp // örnek django uygulaması django-admin startproject csptest
Settings.py dosyasında aşağıdaki modifikasyon gerçekleştirlir. django-csp middleware olarak eklenmelidir.
MIDDLEWARE_CLASSES = ( # ... 'csp.middleware.CSPMiddleware', # ... )
Uygulama genelinde çalışacak şekilde Content Security Policy aktifleştirilmiş bulunmaktadır. Artık istediğimiz CSP kuralını settings.py dosyasına tanımlayabiliriz.
CSP_DEFAULT_SRC = ("'self'", 'cdn.cdnhizmet.com') CSP_SCRIPT_SRC = ("'self'", '*.google.com')
Yukarıdaki örnek tanımlamalar settings.py dosyasında yazılmıştır. Uygulamadan gelen HTTP cevabı aşağıdaki şekildedir.
HTTP/1.0 200 OK Date: Wed, 14 May 2014 18:38:29 GMT Server: WSGIServer/0.1 Python/2.7.6 X-Frame-Options: SAMEORIGIN Content-Type: text/html Content-Security-Policy: script-src 'self' *.google.com; default-src 'self' cdn.cdnhizmet.com
Görüldüğü üzere yapılan CSP tanımlamalar django uygulaması tarafından uygulanmıştır.
Tanımlanabilecek tüm CSP header değişkenleri aşağıdaki listede belirtilmiştir.
CSP_DEFAULT_SRC Set the default-src directive. A tuple or list of values, e.g. ("'self'", 'cdn.example.net'). ‘self’ CSP_SCRIPT_SRC Set the script-src directive. A tuple or list. None CSP_IMG_SRC Set the img-src directive. A tuple or list. None CSP_OBJECT_SRC Set the object-src directive. A tuple or list. None CSP_MEDIA_SRC Set the media-src directive. A tuple or list. None CSP_FRAME_SRC Set the frame-src directive. A tuple or list. None CSP_FONT_SRC Set the font-src directive. A tuple or list. None CSP_CONNECT_SRC Set the connect-src directive. A tuple or list. None CSP_STYLE_SRC Set the style-src directive. A tuple or list. None CSP_SANDBOX Set the sandbox directive. A tuple or list. None CSP_REPORT_URI Set the report-uri directive. A string with a full or relative URI.
Methodlara Özgü CSP Tanımlamaları
Eğer herhangi bir özel durum için belli view fonksiyonlarında farklı CSP kuralları çalıştırılması gerekiyorsa, django-csp bu ihtiyacı kolaylıkla gidermektedir.
@csp_exempt decorator
csp_exemp decorator’u sayesinde ilgili view method’u için CSP kuralları devre dışı bırakılabilir.
from csp.decorators import csp_exempt # Will not have a CSP header. @csp_exempt def myview(request): return render(...)
@csp_update decorator
csp_update decorator’u ile belirlenen herhangi bir CSP kuralı, decorator’un tanımlandığı view fonksiyonuna özgü şekilde değiştirilebilmektedir.
from csp.decorators import csp_update # Will allow images from imgsrv.com. @csp_update(IMG_SRC='imgsrv.com') def myview(request): return render(...)
Örnekte myview isimli fonksiyon için resimlerin kaynağı imgsrv.com adresi olarak değiştirilmiştir. Bu dekoratör ile farklı kaynaklardan resim çağrısı yapan view’leri oluşturan fonksiyonlarda oldukça esnek ve güvenli bir yapı sağlanabilmektedir.
Sonuç
Özellikle e-ticaret ve start-up firmalar için harikulade bir framework. Son kullanıcı güvenliğini ( XSS, ClickJacking ve CSRF ) konusunda framework’ün kendi aldığı önlemler son derece güçlü ve güzel. Örneğin XFrameOptionsMiddleware ve CsrfViewMiddleware özelliklerinin default olarak aktif gelmesi, view dosyalarında ki değişken kullanımlarında default olarak output encoding’in yapılması son kullanıcı güvenliğini %90’a taşıyan özelikler. Bunların yanı sıra CSP kuralları uygulandığında %99 oranında son kullanıcı güvenliği sağlanabilmekte.