5.2 KiB
5.2 KiB
安全加固
概述
生产环境的安全加固是防止数据泄露和服务被攻击的关键措施。本文从应用配置、传输安全、访问控制、数据保护等维度介绍安全加固实践。
:::tip 安全原则
- 最小权限:只开放必要的端口和权限
- 纵深防御:多层安全措施叠加
- 默认安全:配置默认值应为安全选项 :::
应用层安全
关闭 DEBUG 模式
# .env 生产环境配置
FLASK_DEBUG=False
:::warning 重要 DEBUG 模式会暴露详细的错误堆栈、SQL 查询等敏感信息,生产环境必须关闭。 :::
JWT 安全
# .env 配置
JWT_SALT=<随机生成的64位强密码>
JWT_EXPIRE_MINUTES=720
# 生成强密码
python -c "import secrets; print(secrets.token_urlsafe(48))"
:::tip JWT 安全要点
JWT_SALT必须使用随机强密码,禁止使用默认值- 不同环境使用不同的
JWT_SALT - 定期轮换
JWT_SALT(需同时使所有已发 token 失效) - token 过期时间不宜过长,建议 12 小时以内 :::
演示模式
# 演示环境:禁止写操作
FLASK_DEMO=True
演示模式下所有写操作(新增/编辑/删除/状态变更/导入/导出)都会被 @check_demo 装饰器拦截。
CORS 配置
# config/app.py 中配置
CORS_ALLOWED_ORIGINS = "https://www.example.com,https://admin.example.com"
:::warning CORS 安全
- 生产环境禁止使用
origins="*"(允许任意来源) - 仅列出信任的前端域名
- 如需支持多子域,使用逗号分隔而非通配符 :::
.env 文件安全
文件权限
# 设置 .env 文件权限(仅运行用户可读写)
chmod 600 .env
# 查看权限
ls -la .env
# -rw------- 1 app app 1024 Sep 5 10:00 .env
敏感信息管理
# .env 中的敏感字段
DB_PASSWORD=<数据库密码>
REDIS_PASSWORD=<Redis密码>
JWT_SALT=<JWT密钥>
FLASK_SECRET_KEY=<Flask密钥>
:::tip 安全建议
.env文件禁止提交到 Git(已在.gitignore中排除)- 不同环境的
.env独立管理,禁止共用 - 生产环境密码至少 16 位,包含大小写字母、数字、特殊字符
- 定期轮换数据库密码和 JWT 密钥 :::
数据库安全
MySQL 安全配置
-- 创建专用数据库用户(禁止使用 root)
CREATE USER 'djangoadmin'@'%' IDENTIFIED BY '<强密码>';
GRANT SELECT, INSERT, UPDATE, DELETE ON djangoadmin_prod.* TO 'djangoadmin'@'%';
FLUSH PRIVILEGES;
-- 禁止远程 root 登录
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');
FLUSH PRIVILEGES;
:::tip 最小权限原则 应用数据库用户只需 SELECT/INSERT/UPDATE/DELETE 权限,禁止 GRANT/CREATE/DROP 等管理权限。 :::
Redis 安全
# redis.conf 安全配置
# 设置密码
requirepass <强密码>
# 禁止危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command DEBUG ""
# 绑定地址
bind 127.0.0.1
# 禁用 protected-mode(设置了密码后)
protected-mode no
防火墙配置
iptables 基础规则
# 仅开放必要端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -p tcp --dport 8021 -j ACCEPT # Flask(如不走 Nginx)
iptables -A INPUT -i lo -j ACCEPT # 本地回环
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP # 默认拒绝
# 保存规则
iptables-save > /etc/iptables/rules.v4
:::tip 端口规划
| 端口 | 服务 | 是否对外 | 备注 |
|---|---|---|---|
| 22 | SSH | 是(限制 IP) | 建议修改默认端口 |
| 80 | Nginx HTTP | 是 | 跳转 HTTPS |
| 443 | Nginx HTTPS | 是 | 主入口 |
| 8021 | Flask | 否 | 仅 Nginx 可访问 |
| 3306 | MySQL | 否 | 仅应用可访问 |
| 6379 | Redis | 否 | 仅应用可访问 |
| ::: |
上传文件安全
# 文件类型白名单
ALLOWED_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.gif', '.pdf', '.doc', '.docx', '.xls', '.xlsx'}
# 文件大小限制
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
:::tip 文件安全措施
- 上传文件重命名为 UUID,防止路径遍历攻击
- 验证文件类型(检查文件头,不依赖扩展名)
- 上传目录禁止执行权限
- 图片文件重新编码(防止嵌入恶意代码) :::
安全检查清单
FLASK_DEBUG=FalseJWT_SALT使用随机强密码FLASK_SECRET_KEY使用随机强密码.env文件权限600- CORS 不使用
*通配符 - 数据库用户非 root 且最小权限
- Redis 设置密码并禁用危险命令
- 防火墙仅开放必要端口
- 上传文件类型白名单验证
- 日志不记录敏感信息(密码、token)
- HTTPS 启用且禁用 TLSv1.0/1.1
总结
安全加固的核心是纵深防御:应用层关闭 DEBUG、配置强 JWT 密钥、限制 CORS;数据层数据库最小权限、Redis 密码保护;网络层防火墙仅开放必要端口;文件层上传白名单验证。生产环境务必逐项检查安全清单,定期审计。