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

Two scoops of Django - Security Best Practices

Avatar for Spin Spin
April 06, 2014

Two scoops of Django - Security Best Practices

The presentation is based on the book 「Two scoops of Django : Best Practices for Django 1.5」by Daniel Greenfeld and Audrey Roy.

Avatar for Spin

Spin

April 06, 2014
Tweet

More Decks by Spin

Other Decks in Programming

Transcript

  1. Django Configurations Designate Settings DEBUG / TEMPLATE_DEBUG ALLOW_HOSTS SECRET_KEY !

    $ python manage.py --settings=[setting path] $ django-admin.py --settings=[setting path] $ export DJANGO_SETTINGS_MODULE=[setting path]
  2. Django Configurations Designate Settings DEBUG / TEMPLATE_DEBUG ALLOWED_HOSTS SECRET_KEY !

    # Must be set when DEBUG = False ALLOWED_HOSTS = [ 'localhost', 'www.example.com', '.example.com', '*' # Avoid ! ]
  3. Django Configurations Designate Settings DEBUG / TEMPLATE_DEBUG ALLOWED_HOSTS SECRET_KEY !

    ‣ Configuration values, not code. ‣ DO NOT keep them in version control. ‣ Use environment variables.
  4. Django Configurations Designate Settings DEBUG / TEMPLATE_DEBUG ALLOWED_HOSTS SECRET_KEY !

    ! def get_env_variable(varname): try: return os.environ[varname] except KeyError: msg = "Set the %s environment variable" % var_name raise ImporperlyConfigured(msg)
  5. Django Security Features XSS Protection CSRF Protection Injection Protection Clickjacking

    Protection SSL / HTTPS Password Storage Data Validation ‣ Django by default escapes specific characters ‣ Be careful when using is_safe attribute ‣ Be very careful when storing HTML in Database
  6. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than @csrf_protect • Be careful with @csrf_exempt
  7. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than csrf_protect() • Be careful with csrf_exempt() ‣ Random token value by CsrfViewMiddleware (CSRF cookie) ‣ `csrf_token` template tag generate hidden input ‣ Every request calls django.middleware.csrf.get_token() ‣ Compare CSRF cookie with `csrfmiddlewaretoken` value ‣ With HTTPS, CsrfViewMiddleWare will check referer header
  8. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than csrf_protect() • Be careful with csrf_exempt() ‣ Pass CSRF token as POST data with every POST request ‣ Set a custom `X-CSRFToken` header on each request ‣ CSRF cookie might not exist without `csrf_token` tag
  9. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than csrf_protect() • Be careful with csrf_exempt() var origSync = Backbone.sync; Backbone.sync = function (method, model, options) { options.beforeSend = function (xhr) { xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken')); }; ! return origSync(method, model, options); };
  10. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than @csrf_protect • Be careful with @csrf_exempt
  11. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than @csrf_protect • Be careful with @csrf_exempt
  12. CSRF protection • Django CSRF Protection Workflow • CSRF Protection

    for AJAX Request • HTML Search Form • CsrfViewMiddleware rather than @csrf_protect • Be careful with @csrf_exempt
  13. Injection protection • Script Injection • SQL Injection ‣Beware of

    the eval(), exec() and execfile() ‣DO NOT use `pickle` module to serialize/deserialize data. ‣Only use safe_load() in PyYAML
  14. Injection protection • Script Injection • SQL Injection ‣ Django

    Queryset escape varaibles automatically ‣ Be careful to escape raw SQL properly ‣ Exercise caution when using extra()
  15. Clickjacking protection • `X-Frame-Options` HTTP header • Configurations • @xframe_options_exempt

    • Browsers Support Whether or not a resource is allowed to load within a frame or iframe
  16. Clickjacking protection • `X-Frame-Options` HTTP header • Configurations • @xframe_options_exempt

    • Browsers Support MIDDLEWARE_CLASSES = ( ... 'django.middleware.clickjacking.XFrameOptionsMiddleware', ... )
  17. Clickjacking protection • `X-Frame-Options` HTTP header • Configurations • @xframe_options_exempt

    • Browsers Support # Default X_FRAME_OPTIONS = 'SAMEORIGIN' ! X_FRAME_OPTIONS = 'DENY'
  18. Clickjacking protection • `X-Frame-Options` HTTP header • Configurations • @xframe_options_exempt

    • Browsers Support ‣ Internet Explorer 8+ ‣ Firefox 3.6.9+ ‣ Opera 10.5+ ‣ Safari 4+ ‣ Chrome 4.1+
  19. SSL / HTTPS • HTTPS Everywhere ! • Secure Cookies

    • HSTS • Packages ‣ Web server configuration ‣ Django middleware ‣ SSL certificate from reputable source
  20. SSL / HTTPS • HTTPS Everywhere ! • Secure Cookies

    • HSTS • Packages SECURE_PROXY_SSL_HEADER = False ! $ export HTTPS=on
  21. SSL / HTTPS • HTTPS Everywhere ! • Secure Cookies

    • HSTS • Packages SESSION_COOKIE_SECURE = True ! CSRF_COOKIE_SECURE = True
  22. SSL / HTTPS • HTTPS Everywhere ! • Secure Cookies

    • HSTS • Packages ‣Redirect HTTP links to HTTPS ‣Web server level configuration ‣HSTS-compliant browsers
  23. SSL / HTTPS • HTTPS Everywhere ! • Secure Cookies

    • HSTS • Packages Strict-Transport-Security: max-age=31536000, includeSubDomains
  24. SSL / HTTPS • HTTPS Everywhere ! • Secure Cookies

    • HSTS • Packages ‣ django-sslify ‣ django-secure ‣ django-hstsmiddleware
  25. Password Storage • PBKDF2 + SHA256 • User.password • PASSWORD_HASHER

    • Use bcrypt • Increase work factor <algorithm>$<iteration>$<salt>$<hash>
  26. Password Storage • PBKDF2 + SHA256 • User.password • PASSWORD_HASHER

    • Use bcrypt • Increase work factor PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.SHA1PasswordHasher', 'django.contrib.auth.hashers.MD5PasswordHasher', 'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher', 'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher', 'django.contrib.auth.hashers.CryptPasswordHasher', )
  27. Data Validation • Django Forms • User-Uploaded Content ‣ Designed

    to validate Python dictionaries ‣ Not only for HTTP POST request ‣ DO NOT use ModelForms.Meta.exclude ‣ Use ModelForms.Meta.fields instead
  28. Data Validation • Django Forms • User-Uploaded Content from django

    import forms from .models import Store ! class StoreForm(forms.ModelForm): ! class Meta: model = Store # Don't Do this!! excludes = ("pk", "slug", "modified")
  29. Data Validation • Django Forms • User-Uploaded Content from django

    import forms from .models import Store ! class StoreForm(forms.ModelForm): ! class Meta: model = Store # Explicitly specifying what we want fields = ("title", "address", "email")
  30. Data Validation • Django Forms • User-Uploaded Content ‣ Limit

    upload in web server ‣ FileField / ImageField ‣ python-magic ‣ Validate with specific file type library
  31. Data Validation • Django Forms • User-Uploaded Content from django.utils.image

    import Image ! try: Image.open(file).verify() except Exception: # Pillow (or PIL) doesn't recognize it as an image. six.reraise(ValidationError, ValidationError( self.error_messages['invalid_image'], code='invalid_image', ), sys.exc_info()[2])
  32. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages
  33. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages
  34. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages
  35. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages ‣ Web server configuration ‣ Django middleware
  36. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages
  37. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages
  38. Django Admin Change the Default Admin URL Access Admin via

    HTTPS Limited Access Based on IP Use `allow_tags` attribute with Caution Admin Docs Packages ‣ django-admin-honeypot ‣ django-axes
  39. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date
  40. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date
  41. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date ‣ PCI-DSS Security Standards ‣ Sufficient Time/Resource/Funds ‣ Using 3rd-Party Services ‣ Beware of Open Source Solutions
  42. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date ‣ Check access/error logs regularly ‣ Install monitoring tools
  43. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date
  44. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date
  45. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date
  46. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date
  47. What else ? Harden your servers NEVER store credit card

    data Server monitoring Vulnerability reporting page Keep things up-to-date