nginx 默认跟随符号链接存在越权读取风险,需通过 disable_symlinks、严格 root/alias 设置、删除符号链接、容器与selinux约束、目录扫描及安全响应头等多层防护。

当 index 指令指向的默认文件(如 index.html)本身是符号链接时,Nginx 不会自动校验该链接是否安全——它只按常规路径解析并返回内容。若链接目标落在 Web 根目录之外,或被恶意篡改指向敏感系统文件(如 /etc/passwd),就可能造成越权读取。真正有效的防护不靠链接本身,而在于限制 Nginx 能访问的范围和解析行为。
禁用符号链接自动解析
Nginx 默认允许跟随符号链接,这是风险源头。应在 location 或 server 块中显式关闭:
- 添加
disable_symlinks on;(需在支持该指令的版本中,如较新主线版) - 或更通用的做法:使用
disable_symlinks if_not_owner;,仅当链接目标不属于文件所有者时拒绝解析 - 配合
root指令严格限定文档根目录,避免alias引入路径歧义
用 alias + 显式路径替代 index + 符号链接
不依赖 index 自动查找,而是直接用 location / 配合 alias 指向一个真实、受控的静态目录:
- 例如:
location / { alias /var/www/public/; },然后确保该目录下index.html是普通文件 - 删除所有用于“快捷访问”的符号链接,从源头消除跳转风险
- 若必须保留链接结构,可在构建阶段用脚本将符号链接展开为硬链接或复制文件,而非运行时解析
结合内核与应用层双重约束
仅靠 Nginx 配置不够,需叠加底层控制:
- 容器部署时,挂载只读卷并限制
bind mount范围,使符号链接无法逃逸到宿主机敏感路径 - 启用 SELinux 或 AppArmor 策略,禁止 Nginx 进程对
/etc、/root等目录的读取能力 - 在应用启动前扫描站点目录:
find /var/www -type l -exec ls -la {} \;,人工确认所有链接目标合法且不可写
启用安全响应头与访问日志审计
即使发生异常访问,也要确保可追溯、可拦截:
- 配置
add_header X-Content-Type-Options nosniff;和X-Frame-Options SAMEORIGIN,降低利用成功率 - 开启详细访问日志,记录
$request_filename字段,便于回溯实际解析后的物理路径 - 对
index相关请求(如 URI 为/或/index.html)单独设置日志格式,便于监控异常目标路径











