分享技术 · 探索极限 · Code is Art
安全 发布 2023-01-17 1.2k 阅读 约 6 分钟阅读

Django 生产环境安全设置清单

使用 Django 自带的部署检查工具梳理生产环境安全项,并记录 HTTPS 强制跳转、反向代理 SSL 头等关键配置。

Django 生产环境安全配置是项目上线前必须完成的检查。Django 自带了 check --deploy 命令来帮助开发者快速识别常见的安全配置遗漏,上线前建议先执行一次,再逐项处理提示。

如果你是 Django 新手入门,建议先了解 Django 调试工具对比:debug-toolbar 与 silk,在开发阶段就养成良好的安全习惯。同时也要注意 Django 日期聚合查询的时区坑,生产环境中时区配置不当同样会引发安全问题。

Django 生产环境安全:运行部署检查

python manage.py check --deploy

这个命令会扫描 settings.py 并列出所有不符合生产环境安全要求的配置。它检查的内容涵盖以下所有关键项。

关闭 DEBUG 模式

生产环境必须将 DEBUG 设为 False。开启时会暴露详细的错误堆栈、SQL 查询和服务器路径,攻击者可以利用这些信息进行进一步渗透。

DEBUG = False

同时记得配置 ADMINSSERVER_EMAIL,让 500 错误通过邮件通知维护人员:

ADMINS = [('Admin', 'admin@example.com')]
SERVER_EMAIL = 'noreply@example.com'

强制 HTTP 跳转 HTTPS

SECURE_SSL_REDIRECT = True

如果 Django 部署在 Nginx、负载均衡器或其他反向代理后面,需要告诉 Django 哪个请求头代表 HTTPS 协议:

SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

这条配置是反向代理架构下 Django 官方推荐的做法,否则 SECURE_SSL_REDIRECT 会导致无限重定向循环。

HTTPS 站点应确保 Cookie 只通过加密通道传输,这是 Django 生产环境安全的基础环节,防止中间人窃取会话:

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

如果希望 Cookie 不被 JavaScript 读取(防御 XSS 窃取),可以加上 HttpOnly

SESSION_COOKIE_HTTPONLY = True

HSTS(HTTP 严格传输安全)

告诉浏览器始终使用 HTTPS 访问本站,防止 SSL 剥离攻击:

SECURE_HSTS_SECONDS = 31536000  # 一年
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

注意:设置 SECURE_HSTS_SECONDS 后,在过期前无法降级回 HTTP。建议先从小值开始测试,确认无误后再改为一年。详见 HSTS 官方文档

安全响应头

Django 提供了一组中间件来添加安全相关的 HTTP 头:

SECURE_BROWSER_XSS_FILTER = True        # X-XSS-Protection
SECURE_CONTENT_TYPE_NOSNIFF = True      # X-Content-Type-Options: nosniff
X_FRAME_OPTIONS = 'DENY'                # X-Frame-Options,防止点击劫持

ALLOWED_HOSTS

生产环境必须配置允许的域名列表,否则 Django 会拒绝所有请求。这是 防止 HTTP Host 头攻击 的第一道防线:

ALLOWED_HOSTS = ['www.kuddy.cn', 'kuddy.cn', '127.0.0.1']

数据库与密钥安全

Django 生产环境安全的另一个重点是凭据管理。以下三项永远不要硬编码在代码中:

  • SECRET_KEY — 用于会话签名、CSRF Token、密码重置等核心安全机制
  • 数据库密码
  • 第三方 API Key

推荐做法是通过环境变量或 .env 文件注入:

import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DATABASES['default']['PASSWORD'] = os.environ['DB_PASSWORD']

CSRF 保护

Django 默认启用 CsrfViewMiddleware,生产环境中不要关闭。如果使用前后端分离架构(API 与前端不同源),可能需要配置 CSRF_TRUSTED_ORIGINS

CSRF_TRUSTED_ORIGINS = ['https://www.kuddy.cn']

安全日志与监控

生产环境应记录安全相关事件,方便事后追溯:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'security_file': {
            'level': 'WARNING',
            'class': 'logging.FileHandler',
            'filename': '/var/log/django/security.log',
        },
    },
    'loggers': {
        'django.security': {
            'handlers': ['security_file'],
            'level': 'WARNING',
            'propagate': True,
        },
    },
}

总结

以上配置覆盖了 Django 官方部署检查清单 的核心项。每次上线或重大变更后都建议重新执行 check --deploy,确保没有遗漏。

发表回复