Authelia 静态资源访问控制:Nginx + Authelia 安全认证配置指南

概述

Authelia 是一个轻量级开源单点登录(SSO)与身份认证网关,提供一个登录界面,支持内置用户管理(YAML)或 LDAP/AD 等外部身份源。本配置通过 Nginx 作为反向代理,结合 Authelia 的 /api/verify 接口,实现对静态资源(如 HTML、CSS、JS、图片等)的受控访问。

其核心思想是:所有请求必须先通过 Authelia 认证。Authelia 生成加密的 authelia_session Cookie 交给浏览器,仅当浏览器携带有效 Cookie 时,Authelia 才返回 X-Authelia-User 头;Nginx 将此头安全传递给后端,而客户端伪造 Cookie 或该头部 Authelia 直接校验会失败,从而实现强身份保护。

工作流程详解

  1. 客户端发起请求
    用户访问 https://static.example.com/some-file.js

  2. Nginx 触发内部认证检查
    由于配置了 auth_request /auth;,Nginx 会自动内部重定向/auth 地址进行认证验证。

    重要:auth_request 保证每一个请求都必须通过此验证环节,无论是否携带 Cookie。

  3. /auth 路径为内部专用
    location = /auth { internal; } 确保该路径仅能由 Nginx 内部触发,禁止外部直接访问(否则攻击者可绕过认证)。

  4. 转发至 Authelia 进行认证
    Nginx 将请求通过 proxy_pass http://authelia:9091/api/verify 转发给 Authelia。
    Authelia 会:

    • 检查请求中是否包含有效的认证 Cookie(来自之前登录);
    • 若无有效 Cookie,则返回 302 重定向至 Authelia 登录页;
    • 若验证通过,则返回 HTTP 200,并在响应头中添加:
      • X-Authelia-User: username (注意:实际头名为 x-authelia-user,Nginx 会转为小写加下划线)
      • 设置加密的 authelia_session Cookie(浏览器自动存储)
  5. Nginx 提取并安全传递用户身份
    使用 auth_request_set $user $upstream_http_x_authelia_user;,将 Authelia 返回的 X-Authelia-User 头值提取到 Nginx 变量 $user 中。

    此变量完全由 Authelia 控制,客户端无法修改。

  6. 安全注入用户信息到后端
    使用 proxy_set_header X-Forwarded-User $user;,将合法用户身份传递给后端静态服务器。

    后端服务可通过 X-Forwarded-User 头识别当前登录用户,用于日志记录、权限控制等。

  7. 防止客户端伪造身份头

    • 使用 proxy_hide_header X-Forwarded-User; 等指令,屏蔽所有可能被客户端伪造的敏感头,确保这些头只能由 Authelia → Nginx 生成
    • 客户端即使手动添加 X-Forwarded-User: admin,也会被 Nginx 自动移除。
  8. 增强防护:内部密钥校验(可选)
    添加自定义头 X-Internal-Secret,后端服务可校验该值是否匹配预设密钥(如 "K9m#pL2$vQ7xRnBzWfTcYhJdSgUkVbNqXwEaZrOyPtFjMlIuHn"),进一步确认请求来源为可信代理。

    注意:该密钥需保密,不应暴露在前端或日志中。

  9. 后续请求复用 Session
    客户端浏览器在首次登录后会保存 Authelia 设置的加密 Cookie。下次请求时,Cookie 自动携带,Authelia 直接识别用户身份,无需重新登录,实现无缝 SSO 体验。

  10. 最终访问静态资源
    Nginx 将原始请求(含已验证的 X-Forwarded-User)转发至 /var/www/html 下的静态文件服务器。后端可选择:

    • 忽略该头(仅做访问控制);
    • 或根据头内容实现细粒度权限(如仅允许特定用户下载某文件)。

Nginx 配置示例


server {
    listen 443 ssl;
    server_name static.example.com;

    # --- 安全加固:隐藏所有可能被客户端伪造的头. 提示不要将这些返回给客户端 ---
    proxy_hide_header X-Forwarded-User;
    proxy_hide_header X-Forwarded-Email;
    proxy_hide_header Authorization;

    # --- 核心认证逻辑 ---
    auth_request /auth; # 所有请求都必须经过 /auth 验证。 这是关键一步
    auth_request_set $user $upstream_http_x_authelia_user; # 提取 Authelia 返回的用户头到变量 $user , 根据配置还能返回 X-Authelia-Groups|组 X-Authelia-Authorities|权限

    # --- 安全传递用户身份给后端 ---
    proxy_set_header X-Forwarded-User $user; # 将变量 $user 设置到 X-Forwarded-User 头

    # --- 可选:添加内部密钥,供后端验证请求来源 ---
    proxy_set_header X-Internal-Secret "K9m#pL2$vQ7xRnBzWfTcYhJdSgUkVbNqXwEaZrOyPtFjMlIuHn";

    # --- 静态资源服务 ---
    location / {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }

    # --- Authelia 认证接口(仅限内部调用)---
    location = /auth {
        internal;
        proxy_pass http://authelia:9091/api/verify;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }
}
上一篇