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

Two scoops of Django - Security Best Practices

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.

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