Authelia 集成 Active Directory(LDAP)实战指南:配置、过滤器默认值与源码实现解析
2026/9/11 4:03:39 网站建设 项目流程

Authelia 集成 Active Directory(LDAP)实战指南:配置、过滤器默认值与源码实现解析

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

Authelia 作为面向 Web 应用的单点登录与多因素认证门户,其第一因子认证可以直接对接 Microsoft Active Directory。本文以官方 Active Directory 集成指南为主体,完整讲解implementation: 'activedirectory'的最小配置、服务账号授权要求、属性与过滤器默认值,并结合仓库源码说明密码修改的 UTF-16 编码、Microsoft NT 时间戳等底层实现,帮助你在真实域环境中快速落地一套安全可用的 LDAP 认证后端。

前提假设与适配说明

官方指南默认了以下前提条件,在更复杂的场景中需要相应调整:

  • 与 Authelia 配合使用的 LDAP 实现(即 Active Directory 域控制器)已经完整部署,并且 Authelia 进程能够通过网络访问到它。
  • 所有服务都属于example.com域。示例中的域名、子域名、DN 都需要替换为你自己的域,除非你只是在本地测试或确实想使用该域名。

需要特别说明的是,官方无法为每一种 LDAP 服务器的部署方式都给出指南,下面展示的是一种建议性配置。你仍然需要理解 LDAP 配置本身,并根据自身需求定制;微软官方的 Active Directory 文档与本文末尾 延伸阅读 中的仓库文档是进一步学习的入口。此外,本文给出的配置依赖各实现的默认值,请先查看 默认值小节 再按需调整。

Authelia 端最小配置

在 Authelia 的configuration.yml中,通过authentication_backend.ldap配置 LDAP 认证后端。与 Active Directory 配合的最小示例配置如下:

authentication_backend: ldap: implementation: 'activedirectory' address: 'ldaps://ldap.example.com' base_dn: 'DC=example,DC=com' user: 'CN=authelia,OU=people,DC=example,DC=com' password: 'insecure_secret'

对关键配置项的理解:

  • implementation: 'activedirectory':这是整份配置的核心。它让 Authelia 自动套用 Active Directory 专属的属性映射、过滤器默认值与特殊实现细节(如密码修改时的特殊编码)。该枚举值在源码中定义为LDAPImplementationActiveDirectory = "activedirectory",见 internal/configuration/schema/const.go。
  • address:LDAP 服务地址,格式为[<scheme>://]<hostname>[:<port>],允许ldapldapsldapi(Unix 域套接字)三种 scheme。生产环境建议使用ldaps://(LDAP over TLS),比 StartTLS 更安全;示例中使用ldaps://ldap.example.com即默认 636 端口。
  • base_dn:所有 LDAP 查询的基准 DN 容器。域为example.com时通常是DC=example,DC=com,也可进一步收窄,例如OU=authelia,DC=example,DC=com,以限定查询范围(用户搜索时会与additional_users_dn拼接)。
  • user/password:绑定用服务账号的完整 DN 与其密码,用于用户查询与密码修改操作。官方强烈建议使用64 位以上的随机字母数字字符串作为该密码(参考 生成安全随机值指南 中的 Random Alphanumeric String 一节)。

更完整的 LDAP 配置项(如timeoutstart_tlstlspoolingpermit_referralspermit_unauthenticated_bindattributes等)参见 LDAP 认证后端配置文档。

Application 端:服务账号的创建与授权

在 Active Directory 中创建一个专用服务账号,并为其设置一个复杂密码。配置时:

  • 以该账号的**完整 Distinguished Name(DN)**作为user配置项的值;
  • 确保该账号具备执行以下操作的最小权限:
    • 读取被允许使用 Authelia 的用户与组的属性;
    • 修改用户密码(仅当你需要启用密码重置功能时)。

微软官方 Active Directory 文档详细说明了如何为新账号配置权限(即如何设置委派与读取权限),请按需查阅。从安全角度看,这是 LDAP 集成导论 中描述的Service-User Binding(服务账号绑定)模式——Authelia 主要支持的就是这种绑定方式,它比匿名绑定(需显式开启permit_unauthenticated_bind,官方强烈不建议)和端用户绑定(无法兼容忘记密码流程)更适合生产环境。

activedirectory 实现的默认值

implementation被设置为activedirectory时,Authelia 会隐式注入一组默认值。这些默认值在源码中定义于DefaultLDAPAuthenticationBackendConfigurationImplementationActiveDirectory,见 internal/configuration/schema/authentication.go。

属性映射默认值(Attribute defaults)

下表给出该实现下各项属性的默认目录属性。例如username_attribute即 Username 列对应的sAMAccountName

UsernameDisplay NameMailGroup NameDistinguished NameMember Of
sAMAccountNamedisplayNamemailcndistinguishedNamememberOf

源码中实际还补充了更多映射(部分未在文档表中列出):FamilyName: sn(姓)、GivenName: givenName(名)、MiddleName: middleNamePhoneNumber: telephoneNumberStreetAddress: streetAddressLocality: lRegion: stPostalCode: postalCodeCountry: c,并默认GroupSearchMode: filterTimeout: 5s、TLS 最低版本 TLS1.2。这意味着启用该实现后,即使你不写attributes段,Authelia 也能正确读取这些常用字段。

其中sAMAccountName作为用户名唯一标识正是 RFC2307 针对 Active Directory 的推荐做法;官方强调用户名必须由单一、管理员保证唯一的值构成,否则 Authelia 会直接认证失败并在日志中报错。

过滤器默认值(Filter defaults)

过滤器是 LDAP 配置中最容易出错的部分,也是最需要谨慎设置的部分。默认的用户过滤器会自动排除以下三类账号:

  • 被禁用或锁定的账号(!(userAccountControl:1.2.840.113556.1.4.803:=2))(使用 LDAP 匹配规则 OID 按位与UF_ACCOUNTDISABLE位);
  • 密码已过期的账号(!(pwdLastSet=0))pwdLastSet为 0 表示从未设置密码);
  • 账号已过期的账号(|(!(accountExpires=*))(accountExpires=0)(accountExpires>={date-time:microsoft-nt}))(不存在、为 0 或已超过当前时间视为有效,其中{date-time:microsoft-nt}是搜索时替换为当前 Microsoft NT 纪元时间的占位符)。
用户过滤器(Users Filter)
(&(|({username_attribute}={input})({mail_attribute}={input}))(sAMAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(pwdLastSet=0))(|(!(accountExpires=*))(accountExpires=0)(accountExpires>={date-time:microsoft-nt})))

该过滤器的语义是:用户名或邮箱匹配输入是普通用户账号(sAMAccountType=805306368未被禁用密码已设置账号未过期。在源码中,占位符替换由resolveUsersFilter完成:{username_attribute}{mail_attribute}等属于启动阶段替换(连接建立前一次性完成),而{input}{date-time:microsoft-nt}属于搜索阶段替换(每次搜索时实时计算),见 internal/authentication/ldap_user_provider.go。其中 Microsoft NT 纪元时间由UnixNanoTimeToMicrosoftNTEpoch将 Unix 纳秒时间戳转换为 1601-01-01 起的 100 纳秒间隔计数,见 internal/utils/time.go。

组过滤器(Groups Filter)
(&(member={dn})(|(sAMAccountType=268435456)(sAMAccountType=536870912)))

该过滤器表示:member属性包含该用户 DN({dn}为搜索阶段替换,来自用户档案查询得到的完整 DN)对象是全局/通用安全组(sAMAccountType=268435456域本地安全组(sAMAccountType=536870912)。这也解释了为何属性映射中需要distinguishedName:Active Directory 是少数具备可搜索 DN 属性的目录,从而支持这类基于 DN 的过滤。

Microsoft Active Directory sAMAccountType 对照

Account Type Value描述等价过滤器
268435456全局/通用安全组对象N/A
536870912域本地安全组对象N/A
805306368普通用户账号(&(objectCategory=person)(objectClass=user))

这组数值是 SAM 协议中定义的账号类型枚举,微软官方文档(Account Type Values)对其有详细说明。理解该表有助于你按需裁剪过滤器,例如只允许特定组或特定 OU 的用户登录。

从源码理解 Active Directory 的特殊实现细节

除了默认值,activedirectory实现还带有一个其他实现没有的特殊行为——密码修改的专用编码。在 internal/authentication/ldap_user_provider.go 的setPassword方法中:

  • Implementation == "activedirectory"时,Authelia 不会走通用的userPassword属性或 RFC 3062 密码修改扩展,而是将新密码用双引号包裹后按 UTF-16 小端序(UTF-16LE)编码,再通过Replace(ldapAttributeUnicodePwd, ...)写入unicodePwd属性;
  • 同时,若服务器支持微软的 Server Policy Hints 控件(MsftPwdPolHints/MsftPwdPolHintsDeprecated),还会附加对应 LDAP 控制,让密码修改遵循域密码策略(复杂度、长度、历史等),并在违反策略时返回ErrPasswordWeak

该路径正是“Application 端需授予服务账号修改用户密码权限”的代码依据:Authelia 以服务账号身份发起对该用户的ModifyRequest。单元测试TestShouldUpdateUserPasswordActiveDirectory*(见 internal/authentication/ldap_user_provider_test.go)验证了该流程,并在断言中展示了sAMAccountName作为用户名属性的默认映射。

另外,过滤器占位符的两阶段替换机制(启动阶段 vs 搜索阶段)也是一种性能优化:启动阶段只替换一次、且在建立连接前完成,并预先检测过滤器中是否存在搜索阶段占位符,从而避免每次搜索都做无谓的字符串替换。相关标志位的初始化逻辑见 internal/authentication/ldap_user_provider_lifecycle.go 附近。

关于组搜索模式与递归组的补充

该实现默认使用filter组搜索模式(GroupSearchMode: filter),即直接用组过滤器查询结果。若需要支持递归组(用户通过嵌套组间接成为某个组的成员),可在groups_filter中尝试微软专用的匹配规则 OID:

(&(member:1.2.840.113556.1.4.1941:={dn})(objectClass=group)(objectCategory=group))

官方说明该过滤器目前仅针对 Microsoft Active Directory 做过测试。另一种实验性的memberof搜索模式基于用户对象上的memberOf属性判定组成员,但官方通常不建议在生产使用;其占位符{memberof:dn}{memberof:rdn}的替换规则与约束详见 LDAP 集成导论中的组搜索模式与过滤器替换。

延伸阅读

  • LDAP 认证后端完整配置项说明:addresstimeouttlspoolingpermit_referralsattributes等全部选项。
  • LDAP 集成导论:绑定方式对比、各 implementation 概览、组搜索模式与过滤器占位符替换规则。
  • 生成安全随机值指南:为服务账号生成高强度随机密码。
  • 实现代码:internal/configuration/schema/authentication.go(默认值)、internal/authentication/ldap_user_provider.go(密码修改)、internal/utils/time.go(NT 纪元转换)。

【免费下载链接】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),仅供参考

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

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

立即咨询