Nginx可通过auth_request实现权限拦截、map脱敏日志、internal隔离私有文件,构建访问控制与行为审计双闭环。

Nginx 本身不内置 RBAC 或会话管理,但可通过组合配置实现“访问控制 + 行为审计”双闭环:一边拦住非法请求,一边如实、安全地记录谁在何时访问了什么。关键不是堆功能,而是让权限判断和日志落盘协同工作,且不泄露敏感信息。
用 auth_request 做实时权限拦截
权限校验必须前置、轻量、不可绕过:
- 在需保护的 location 中添加
auth_request /auth; - 单独定义一个
location = /auth { internal; proxy_pass http://auth-service/check; },确保该路径无法被外部直接调用 - 后端鉴权服务(如 Spring Boot 接口)根据 JWT、Cookie 或请求头返回 200(放行)或 403(拒绝)
- 所有校验逻辑由后端完成,Nginx 只做“守门人”,不碰用户凭证
对静态资源启用脱敏型审计日志
直接记原始 URL 或参数会违反等保/GDPR 要求:
- 用
map提取并掩码敏感字段,例如从/user/138****1234/avatar.jpg中提取手机号并脱敏:map $request_uri $masked_phone { ~(? - 自定义日志格式,只引用脱敏变量:
log_format audit_static '$remote_addr [$time_local] "$request" $status "$masked_phone" "$http_user_agent"';
- 仅在静态资源 location 中启用:
location ~* \.(js|css|png|pdf)$ { access_log /var/log/nginx/static_audit.log audit_static; }
分离高危接口日志并标记越权线索
后台路径(如 /admin/、/api/v1/users/)需单独审计:
- 定义
map标识风险操作:map "$request_method:$uri" $is_admin_action { ~^(POST|PUT|DELETE):/admin/|/sys/|/api/v1/(users|roles) "1"; default "0"; } - 在对应 location 中启用条件日志:
location ^~ /api/v1/ { access_log /var/log/nginx/admin_audit.log json if=$is_admin_action; } - 日志中嵌入
$http_x_user_id(用户ID)、$target_id(路径提取的目标ID)、$realip_remote_addr(真实IP),便于后续分析平行越权(同一用户查多个他人 ID)或上下越权(普通角色调用管理员接口)
限制私有文件直连,用 internal + alias 切断访问链
前端藏链接没用,真正敏感文件(如身份证扫描件、合同 PDF)必须物理隔离:
- 将文件存放在 Web 根目录外,例如
/data/private/ - 配置内部重定向:
location /private/ { internal; alias /data/private/; } - 所有访问必须经后端鉴权后,用
X-Accel-Redirect头触发 Nginx 内部投递,避免暴露真实路径
不复杂但容易忽略











