☰
Authelia 开源单点登录与多因素认证门户:架构全景、核心特性与反向代理实战部署指南
2026/10/4 13:49:17 网站建设 项目流程

Authelia 开源单点登录与多因素认证门户:架构全景、核心特性与反向代理实战部署指南

【免费下载链接】autheliaThe Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready.项目地址: https://gitcode.com/GitHub_Trending/au/authelia

本文以仓库根目录 README.md 为骨架,结合 config.template.yml 配置模板、examples/compose下的 Docker Compose 示例以及internal/、cmd/下的 Go 源码实现,系统讲解 Authelia 的身份认证与授权架构、OpenID Connect 能力、多因素认证方式、细粒度访问控制模型,以及如何在 Traefik、nginx、Caddy 等反向代理后完成从快速体验到生产化部署的完整路径。读完本文,你将能够基于当前仓库快速拉起一套带 Web 门户的 SSO/2FA 认证服务,并理解其底层授权判定与配置解析的实现原理。

Authelia 是什么:反向代理旁的"认证与授权控制平面"

Authelia是一个开源的身份认证与授权服务器,通过一个 Web 门户为你的应用提供**双因素认证(2FA)与单点登录(SSO)能力。它在架构上扮演的是反向代理的伴侣(companion)角色:不直接暴露在公网,而是由 nginx、Traefik、Caddy、HAProxy、Envoy、Skipper 等反向代理把请求交给它,由它决定允许(allow)、拒绝(deny)还是重定向(redirect)**该请求。

用 README.md 的原话概括其安全定位:"Authelia is not directly exposed on the Internet (your reverse proxies are) however, it's still the control plane for your internal security"——即代理才是公网入口,而 Authelia 是内部安全的"控制平面"。这一设计决定了它的所有访问控制决策都必须建立在代理可信的前提下,因此在集成时通常要求代理开启trustForwardHeader之类的选项(下文 compose 示例中可见)。

从源码看,服务的入口位于 cmd/authelia/main.go,实际启动逻辑由 internal/commands/root.go 中的NewRootCmd()定义:进程启动时会依次执行配置存在性检查、配置加载、日志配置、配置键校验与配置语义校验(见PreRunE链),随后进入RootRunE加载各 Provider(认证、存储、会话、通知、OIDC 等)并执行启动检查,最后通过service.RunAll(ctx)拉起 HTTP 服务。

核心特性全景:从 OpenID Certified 到后量子密码学

README.md 的 Features summary 列出了 Authelia 的关键能力,逐项展开如下。

OpenID Connect 1.0 / OAuth 2.0(OpenID Certified)

Authelia 已通过OpenID Certified™认证,覆盖 OpenID Connect 协议的Basic OP / Implicit OP / Hybrid OP / Form Post OP / Config OP五类 profile。README 同时坦诚说明:该能力在路线图上仍处于 beta 阶段,但实现已经非常完整,并以此支撑了完整的协议认证。对应的服务端实现位于 internal/oidc/(包括 issuer、client policy、claims、discovery、provider 等模块),HTTP 层处理位于 internal/handlers/ 下的handler_oauth2_*系列文件(authorization、token、introspection、revocation、userinfo、jwks、wellknown、pushed authorization request 等)。

后量子密码学(Post-Quantum Cryptography)就绪

README 在特性列表中明确列出Post-Quantum Cryptography这一能力。从源码看,internal/oidc/mldsa.go 与 internal/oidc/issuer_algorithms_mldsa_test.go 表明仓库已实现基于 ML-DSA(Module-Lattice-Based Digital Signature Algorithm)的签名算法支持,并在 issuer 算法测试中覆盖了 ML-DSA 场景——这意味着 OIDC 令牌签发侧已具备抗量子计算的签名算法接入能力。

多因素认证(2FA)手段

README 列出的第二因素方法包括:

方法说明仓库对应实现
安全密钥(Security Keys)支持 FIDO2 / WebAuthn,典型设备如 YubiKeyinternal/webauthn/ + internal/handlers/handler_sign_webauthn.go
基于时间的一次性密码(TOTP)兼容主流 Authenticator 应用internal/totp/ + internal/handlers/handler_sign_totp.go
移动推送通知(Mobile Push)通过 Duo 的 Partner Auth API 实现internal/duo/ + internal/handlers/handler_sign_duo.go

此外还支持:

  • 无密码认证(Passwordless Authentication):通过 WebAuthn Passkey 直接登录(对应配置项webauthn.enable_passkey_login);
  • 密码重置:通过邮箱确认进行身份验证后重置密码(identity_validation.reset_password段落负责该流程的 JWT 生命周期);
  • 访问限制(Regulation):在短时间内多次认证失败后封禁用户,防止暴力破解(配置见regulation段落,实现见 internal/regulation/regulator.go)。

细粒度访问控制规则

Authelia 的访问控制不是简单的"放行/拦截",而是支持按以下维度组合匹配的规则引擎:

  • 子域(domain / domain_regex)
  • 用户 / 用户组(subject)
  • 请求 URI(resources 正则)
  • 请求方法(methods)与查询参数(query)——从 internal/authorization/authorizer.go 的GetRuleMatchResults可以看到MatchesMethods、MatchesQuery等判定项
  • 网络(networks,支持 CIDR 或预定义网络名)

每条规则可独立选择one_factor(单因素)或two_factor(双因素)策略;对于受 one_factor 策略保护的端点,Authelia 还支持HTTP Basic Authentication,方便非浏览器客户端(如 API、脚本)直接携带凭据访问。

高可用与存储

  • 高可用(HA):使用远程数据库(MySQL/MariaDB/PostgreSQL)持久化业务数据,使用Redis作为高可用 KV 存储承载会话(session.redis段落还支持 Redis Sentinel 哨兵高可用与 TLS 配置)。
  • 单机轻量场景可使用 SQLite(storage.local)与内存会话(默认memoryprovider)。

反向代理兼容性

README 明确列出开箱即用的集成对象:

  • Traefik:通过其 ForwardAuth 中间件,开箱即用;
  • Caddy:通过forward_auth指令;
  • LinuxServer SWAG容器提供精选配置;
  • Kubernetes:兼容 ingress-nginx、Traefik Kubernetes CRD / Ingress、Istio、Envoy Gateway 等多种 Ingress Controller 与 Gateway;并提供 beta 状态的Helm Chart安装支持。

访问控制模型深入:规则如何匹配与判定

访问控制是 Authelia 的灵魂功能,config.template.yml 的access_control段落给出了完整语义,而 internal/authorization/authorizer.go 给出了判定实现。

**规则对象(rule)**由以下键构成:

  • domain:规则适用的域名或域名集合,可用通配符*匹配任意子域(如*.example.com),含通配符的 YAML 值必须用单引号包裹;
  • subject:可选,形如user:<username>或group:<groupname>,缺省匹配任意用户;
  • policy:必选,取值bypass、one_factor、two_factor、deny;
  • resources:可选,正则列表,匹配一组资源路径,缺省匹配任意资源。

关键语义(README/config 中反复强调):

  1. 规则顺序即优先级——"the first policy matching (domain, resource, subject) applies",第一条命中的规则生效,后续规则不再参与;
  2. default_policy兜底——若未配置access_control,ACL 默认对所有人生效deny(即默认拒绝一切);配置后,未命中任何规则的请求走default_policy(默认也是deny);
  3. 规则支持domain_regex正则域名(可用命名分组(?P<User>...)、(?P<Group>...)提取用户/组),以及networks(引用definitions.network预定义或直接写 CIDR/单 IP)。

源码层面的判定逻辑非常直观:Authorizer.GetRequiredLevel顺序遍历rules,一旦rule.IsMatch(subject, object)命中即返回该规则的Policy与HasSubjects;遍历完仍未命中则回落到defaultPolicy。NewAuthorizer还会预扫描所有规则:只要存在two_factor策略(或默认策略为 two_factor,或 OIDC 配置要求 MFA),就会把mfa标志置位,供IsSecondFactorEnabled()查询——这解释了为什么 Authelia 能感知"是否需要启用第二因素基础设施"。

反向代理集成实战:以 Traefik ForwardAuth 为例

仓库的 examples/compose/lite/compose.yml 是一个可运行的完整示例,其 Traefik 集成方式代表了 Authelia 的标准接入姿势:

services: authelia: image: 'authelia/authelia' volumes: - './authelia:/config' labels: traefik.enable: 'true' traefik.http.routers.authelia.rule: 'Host(`authelia.example.com`)' traefik.http.routers.authelia.entrypoints: 'https' traefik.http.routers.authelia.tls: 'true' traefik.http.routers.authelia.tls.certresolver: 'letsencrypt' traefik.http.middlewares.authelia.forwardAuth.address: 'http://authelia:9091/api/authz/forward-auth' traefik.http.middlewares.authelia.forwardAuth.trustForwardHeader: 'true' traefik.http.middlewares.authelia.forwardAuth.maxResponseBodySize: '8192' traefik.http.middlewares.authelia.forwardAuth.authResponseHeaders: 'Remote-User,Remote-Groups,Remote-Name,Remote-Email'

解读其中的关键点:

  • ForwardAuth 地址指向 Authelia 的/api/authz/forward-auth端点——这正是 config.template.ymlserver.endpoints.authz段落中forward-auth实现的默认路径;除此之外还提供ext-authz、auth-request(nginx auth_request 风格)与legacy等实现(对应 internal/handlers/handler_authz_impl_*.go 系列);
  • trustForwardHeader: 'true':告知 Traefik 把原始请求头(X-Forwarded-* 等)透传给 Authelia,使后者能基于真实客户端 IP 做网络规则匹配与监管计数;
  • authResponseHeaders:认证通过后,把Remote-User、Remote-Groups、Remote-Name、Remote-Email等用户信息头写回上游请求,让后端应用无需再自行解析 SSO 会话;
  • 受保护的业务服务(示例中的secure与public,均为traefik/whoami)通过traefik.http.routers.<name>.middlewares: 'authelia@docker'挂载该中间件。

快速开始:Docker Compose 两种实验场景

README 的 Getting Started 章节提供两组docker compose捆绑(bundle),作为"先看到 Authelia 跑起来"的起点,二者均随镜像自带自签名证书,需要按需定制:

Local(本地测试场景)

  • 适用场景:不想关心任何配置、纯本地验证;服务器不暴露到公网;
  • 工作方式:域名写入本机 hosts 文件,使用自签名证书,无需 DNS 与真实证书;
  • 对应目录:examples/compose/local/。

Lite(轻量上公网场景)

  • 适用场景:服务器将暴露到公网,需要配置域名与 DNS;
  • 工作方式:证书通过LetsEncrypt签发(示例中即certificatesResolvers.letsencrypt.acme配置,HTTP-01 质询);
  • "Lite" 的含义:外部依赖最小化——文件型用户存储(file)+ SQLite 配置存储。README 特别提醒:这种配置下服务无法良好扩展(will not scale well),适合验证而非生产;
  • 对应目录:examples/compose/lite/,其中 compose 由authelia、redis(会话)、traefik(入口与 ForwardAuth)以及两个whoami测试服务(secure/public)组成。

部署方式与生产化路径

README 列出了 Authelia 的多种安装形态:

  • 独立服务:AUR(authelia)、APT 仓库、FreeBSD Ports;
  • 二进制/包:静态二进制、.deb包;
  • 容器:Docker、Kubernetes;
  • 编排:通过 Helm Chart(beta)结合 Ingress Controller / Ingress 配置完成部署。

生产化部署的完整流程(裸金属与 Kubernetes 两条路线)参见仓库文档站点中的 docs/content/integration/ 目录(含各代理集成与 Kubernetes 集成指南)。README 同时给出三条生产建议:

  1. 固定版本 tag,不要用latest——"It's recommended to pin a version tag instead of using thelatesttag";
  2. 升级前阅读 release notes——Authelia 仍在活跃开发中,可能引入破坏性变更(breaking changes);
  3. HA 用户必读:config 模板在多处标注了statelessness主题(如 file 认证后端、SQLite 存储、filesystem 通知、session 等段落),提示 Kubernetes/HA 场景需要确保无状态化设计——例如文件型用户数据库不支持多实例横向扩展。

配置体系速览:基于 config.template.yml 的分段解读

仓库根目录的 config.template.yml 是一份 1600+ 行的全量注释模板,默认位置为configuration.yml;使用 Docker 时容器默认期望其在/config/configuration.yml;默认加载位置可通过环境变量X_AUTHELIA_CONFIG覆盖。模板注释还提醒:该模板不会自动随版本更新,实际参数以官方文档为准。

从 CLI 看,internal/commands/root.go 提供了-c/--config标志(可传多个配置文件或目录,默认configuration.yml)、--config.exp.filters过滤器,以及access-control、build-info、crypto(含hash-password帮助主题)、storage、config、debug等子命令;启动方式形如:

authelia -c configuration.yml

各配置段落与要点如下:

server(服务端)

  • address:通用地址语法[<scheme>://]<hostname>[:<port>][/<path>],scheme 可为tcp/tcp4/tcp6/unix/fd,默认端口9091;
  • asset_path:静态资源覆盖目录;disable_healthcheck、tls(key/certificate/client_certificates)、headers.csp_template、buffers(读写缓冲,默认 4096)、timeouts(读写 6s、空闲 30s)、endpoints(pprof/expvars 开关,以及四种 authz 端点的implementation与authn_strategies)。

log 与 telemetry

  • log:level(info/debug/trace)、format(json/text)、file_path、keep_stdout;
  • telemetry.metrics:独立 Metrics 服务,默认地址tcp://:9959/metrics,对应 internal/metrics/(Prometheus 指标,prometheus.go)。

第二因素与认证方法

  • default_2fa_method:新用户与首选方法被禁用时的默认 2FA 方法,取值totp、webauthn、mobile_push;
  • totp:issuer、algorithm(默认 SHA1)、digits(6 或 8)、period(默认 30s)、skew、secret_size(默认 32,最小 20)、allowed_algorithms/digits/periods、disable_reuse_security_policy;
  • webauthn:disable、enable_passkey_login、display_name、attestation_conveyance_preference(none/indirect/direct)、timeout、filtering(AAGUID 白/黑名单、禁止可备份导出设备)、selection_criteria(attachment:cross-platform/platform;discoverability;user_verification)、metadata(MDS3 元数据校验:validate_trust_anchor、validate_entry、validate_status 等);
  • duo_api:hostname、integration_key、secret_key(可用 secret 注入)、enable_self_enrollment。

身份校验流程(identity_validation)

  • reset_password:jwt_lifespan(默认 5 分钟)、jwt_algorithm(HS256)、jwt_secret(模板中为示例值a_very_important_secret,生产必须替换);
  • elevated_session:管理凭据等敏感操作需要"提权会话",code_lifespan、elevation_lifespan、characters(OTP 字符数,默认 8)、require_second_factor、skip_second_factor。

ntp(时间同步校验)

用于保证服务器时间足够准确以校验 TOTP:address(默认udp://time.cloudflare.com:123)、version、max_desync(默认 3s)、disable_startup_check(可完全离线运行)、disable_failure。

definitions(可复用定义)

  • user_attributes:公共表达式语言(CEL)表达式定义的用户属性(对应 internal/expression/ 模块);
  • network:网络名到 CIDR 列表的映射(如internal、VPN),供 ACL 的networks引用。

authentication_backend(认证后端)

二选一:

  • ldap(生产推荐):address、implementation(activedirectory/freeipa/lldap/custom)、timeout、start_tls、tls(server_name、skip_verify、min/max TLS 版本、mTLS 证书链)、pooling、base_dn、additional_users_dn、users_filter、additional_groups_dn、groups_filter、group_search_mode(filter/memberof)、permit_referrals、user/password、attributes(username/display_name/mail/member_of/group_name 等映射)。实现位于 internal/authentication/ldap_user_provider.go;
  • file(开发/轻量):path(用户数据库文件)、watch、search(email 搜索、大小写不敏感)、password哈希参数(argon2id、scrypt、pbkdf2、sha2crypt、bcrypt 全套可调)。实现位于 internal/authentication/file_user_provider.go。

两者均受password_change.disable、password_reset.disable/custom_url、refresh_interval(LDAP 组数据刷新间隔,可设为disable/0/always)控制。

password_policy 与 privacy_policy

  • password_policy.standard:min/max_length、require_uppercase/lowercase/number/special;或zxcvbn(强度算法,min_score默认 3);
  • privacy_policy:enabled、require_user_acceptance(按浏览器要求用户接受隐私政策)、policy_url(必须为 https 绝对 URL)。

session(会话)

  • 会话 cookie 标识登录态;providers 为memory(默认)或redis;
  • secret:会话数据加密密钥(仅 Redis/Sentinel 场景使用,模板示例值insecure_session_secret必须替换);
  • cookies列表:每项含name(默认 authelia_session)、domain、authelia_url(必需,必须是 https,且与 domain 匹配)、default_redirection_url、same_site(none/lax/strict)、inactivity(默认 5m)、expiration(默认 1h)、remember_me(默认 1M,设为 -1 可禁用);
  • redis:host/port 或 unix socket、timeout、max_retries、username/password、database_index、连接池参数、tls、以及high_availability(Sentinel:sentinel_name、sentinel_username/password、nodes、route_by_latency/route_randomly)。

regulation(防爆破监管)

modes(如user)、max_retries(0 表示禁用)、find_time(窗口期,默认 2 分钟)、ban_time(封禁时长,默认 5 分钟)。实现见 internal/regulation/regulator.go。

storage(存储)

三选一:local(SQLite,path,适合轻量非有状态部署)、mysql(address/database/username/password/timeout/tls)、postgres(额外支持多实例servers故障转移列表与schema)。所有方案共享encryption_key(最小 20 字符,用于加密库中敏感信息;更换时必须通过 CLI 操作数据库)。

notifier(通知)

二选一:filesystem(filename,把通知写入文件,适合开发)或smtp(address/timeout/username/password/sender/identifier/subject/startup_check_address;安全默认强制 TLS、校验 x509 证书,可用disable_require_tls放宽——仅限未认证连接)。通知用于密码重置、WebAuthn/TOTP 注册等场景,实现位于 internal/notification/。

identity_providers.oidc(OIDC 身份提供方)

  • hmac_secret:用于签名 OAuth2 令牌(授权码、access token、refresh token);
  • jwks:至少一个 JWK 需支持 RS256 算法(RSA 密钥最低 2048 位);每项含key_id(≤7 位字母数字,自动生成,建议不配置)、algorithm、use(当前仅sig)、key(PEM 私钥)。完整配置建议阅读docs/content/configuration/下的 OIDC 文档。

安全、社区与开源治理

  • 安全策略:Authelia 对安全问题非常重视,漏洞报告遵循 SECURITY.md 中声明的策略;相关安全话题在 docs/content/policies/ 下有专题文档;
  • 社区渠道:README 提供 Matrix(Support/Contributing 房间)、Discord、以及团队邮箱(team@authelia.com,security@authelia.com仅限安全问题)等联系方式;
  • 为什么开源:README 给出的理由——安全应当以近乎零成本惠及所有人,且开源可被任何人审计,保证产品不会作恶;
  • 参与贡献:见 CONTRIBUTING.md,项目遵循 all-contributors 规范,任何形式的贡献都受欢迎;
  • 许可证:Authelia 基于Apache 2.0许可,全文见 LICENSE。

小结

Authelia 的定位清晰而聚焦:它不替代反向代理,而是作为代理背后的认证与授权决策引擎,用一套 Web 门户把 2FA、SSO、细粒度 ACL 和 OIDC 提供方能力统一起来。对开发者而言,从仓库出发可以非常高效地建立完整认知:README 提供能力全景与部署路线,config.template.yml 提供逐项参数说明,examples/compose/lite/compose.yml 提供可运行的 Traefik + ForwardAuth 参考实现,而 internal/authorization/authorizer.go、internal/commands/root.go 等源码则让"规则如何判定""配置如何加载"等黑盒变得透明。上手的第一步,就是克隆仓库、翻阅examples/compose下的两个 bundle,并牢记 README 的忠告:生产环境固定版本 tag、升级前读 release notes、为 HA 场景保证无状态化。

【免费下载链接】autheliaThe Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready.项目地址: https://gitcode.com/GitHub_Trending/au/authelia

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询