Django Uygulamalarında Client-Site Security ve CSP

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.