Nginx缓存路径安全需严格遵循最小权限原则:缓存目录须属Nginx用户且权限750,临时路径须独立配置并禁用world-writable,启用disable_symlinks防符号链接逃逸,并通过systemd强化隔离。

缓存路径权限配置是 Nginx 安全加固中容易被忽视但影响深远的一环。它直接关系到缓存文件是否可被未授权读取、篡改,甚至成为提权跳板。核心原则是:缓存目录必须由 Nginx 运行用户专属持有,禁止其他用户(尤其是同组或全局)写入或遍历,同时避免与日志、配置等敏感路径混用。
缓存目录归属与基础权限
使用 proxy_cache_path 或 fastcgi_cache_path 指令定义的缓存路径,必须明确归属 Nginx 工作用户(如 nginx 或 www-data),且不能属于 root 或其他高权限用户。
- 创建缓存目录时,用
sudo mkdir -p /var/cache/nginx,再立即执行sudo chown nginx:nginx /var/cache/nginx - 设置目录权限为
750(属主读写执行、属组只读执行、其他无权限),禁用 world-writable:sudo chmod 750 /var/cache/nginx - 确保父路径(如
/var/cache)不开放 group/o 写权限,否则可能绕过子目录限制
禁用临时路径越权风险
Nginx 在处理上传或代理请求时会用到临时文件路径(如 client_body_temp_path、proxy_temp_path)。这些路径若配置不当,可能被恶意利用写入任意内容。
- 在
http块中显式指定独立临时路径,例如:client_body_temp_path /var/tmp/nginx/client_body 1 2; - 该路径同样需
chown nginx:nginx+chmod 750,且不能与缓存路径共用同一父目录 - 添加
use_temp_path=off;到proxy_cache_path行末,强制将缓存直接写入目标路径,跳过临时中转环节
防止缓存路径符号链接逃逸
攻击者可能通过构造含符号链接的 URI,诱导 Nginx 将缓存写入系统关键位置(如 /etc 或 /root)。新版 Nginx(≥1.11.1)提供原生防护机制。
- 在
http或server块中启用:disable_symlinks on from=/var/cache/nginx; - 该配置表示:仅当符号链接目标位于
/var/cache/nginx及其子目录内时才允许解析,否则返回 403 - 配合
alias使用时尤其重要;若使用root指令,还需确保其路径不跨越缓存根目录边界
系统级隔离增强(systemd 环境)
当 Nginx 由 systemd 托管时,可借助服务单元参数进一步封锁缓存路径的访问边界。
- 新建覆盖配置:
sudo systemctl edit nginx,填入: [Service]NoNewPrivileges=yesProtectSystem=strictReadWritePaths=/var/cache/nginx /var/log/nginx- 执行
sudo systemctl daemon-reload && sudo systemctl restart nginx生效
缓存安全不是配完 proxy_cache_path 就结束的事。从归属、权限、路径约束到运行时隔离,每一层都得对齐最小权限原则。漏掉任意一环,都可能让缓存从性能优化手段变成攻击入口。


















