概述
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 直接校验会失败,从而实现强身份保护。
工作流程详解
-
客户端发起请求
用户访问https://static.example.com/some-file.js
。 -
Nginx 触发内部认证检查
由于配置了auth_request /auth;
,Nginx 会自动内部重定向至/auth
地址进行认证验证。重要:
auth_request
保证每一个请求都必须通过此验证环节,无论是否携带 Cookie。 -
/auth 路径为内部专用
location = /auth { internal; }
确保该路径仅能由 Nginx 内部触发,禁止外部直接访问(否则攻击者可绕过认证)。 -
转发至 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(浏览器自动存储)
-
Nginx 提取并安全传递用户身份
使用auth_request_set $user $upstream_http_x_authelia_user;
,将 Authelia 返回的X-Authelia-User
头值提取到 Nginx 变量$user
中。此变量完全由 Authelia 控制,客户端无法修改。
-
安全注入用户信息到后端
使用proxy_set_header X-Forwarded-User $user;
,将合法用户身份传递给后端静态服务器。后端服务可通过
X-Forwarded-User
头识别当前登录用户,用于日志记录、权限控制等。 -
防止客户端伪造身份头
- 使用
proxy_hide_header X-Forwarded-User;
等指令,屏蔽所有可能被客户端伪造的敏感头,确保这些头只能由 Authelia → Nginx 生成。 - 客户端即使手动添加
X-Forwarded-User: admin
,也会被 Nginx 自动移除。
- 使用
-
增强防护:内部密钥校验(可选)
添加自定义头X-Internal-Secret
,后端服务可校验该值是否匹配预设密钥(如"K9m#pL2$vQ7xRnBzWfTcYhJdSgUkVbNqXwEaZrOyPtFjMlIuHn"
),进一步确认请求来源为可信代理。注意:该密钥需保密,不应暴露在前端或日志中。
-
后续请求复用 Session
客户端浏览器在首次登录后会保存 Authelia 设置的加密 Cookie。下次请求时,Cookie 自动携带,Authelia 直接识别用户身份,无需重新登录,实现无缝 SSO 体验。 -
最终访问静态资源
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;
}
}