Harbor LDAP 模式下 AD 用户登录与登出验证指南:从 UI、Docker CLI 到源码原理
Harbor LDAP 模式下 AD 用户登录与登出验证指南从 UI、Docker CLI 到源码原理【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harborHarbor 的认证模式auth_mode被配置为ldap_auth时用户身份完全由外部 Active DirectoryAD或其他 LDAP 服务器管理。本文以仓库中的功能测试用例 1-06-AD-user-log-in-log-out.md 为主体系统讲解 AD 用户在 Harbor 中的首次登录、登出、再次登录、错误凭据、docker login客户端验证、管理员角色授予以及用户被 AD 禁用后的行为并结合 LDAP 认证实现 与 LDAP 会话封装 的源码说明每一步背后的认证原理。读完本文你将掌握 LDAP 模式下 Harbor 用户生命周期的完整验证方法以及 AD 用户与本地用户在系统管理视图中的差异。测试目标与环境前置条件验证目标本测试用于验证当用户由外部 AD 服务器管理时一个非管理员用户能够在 Harbor Web UI 和 Docker CLI 上正常登录、登出且具备 LDAP 模式下应有的安全与权限行为。其核心验证点包括从未登录过的 AD 用户可凭 AD 中的身份标识首次登录 UI登出后回到登录页再次登录可正常进入LDAP/AD 模式下用户不能在 Harbor 中修改自己的账户设置或修改密码密码由 AD 负责错误的用户名或密码组合登录时错误提示不泄露哪个输入值有误Docker 客户端可通过docker login成功或失败地验证凭据系统管理员可在“管理选项”中看到该 AD 用户并对其授予或移除系统管理员角色用户在 AD 中被禁用或删除后将无法再通过 UI 或 Docker 客户端登录。环境要求根据测试用例文档执行本测试需要满足以下条件正在运行的 Harbor 实例一个可用、已启动的 Harbor 服务LDAP 认证模式Harbor 的认证模式被设置为ldap_auth即auth_mode配置为 LDAP用户数据存储在 AD 服务器中Docker CLI 主机一台安装了 Docker CLIDocker 客户端的 Linux 主机用于执行docker login验证Active Directory 服务器已搭建好 AD 服务器并准备若干个可用于测试的用户。LDAP 认证模式与关键配置auth_mode 与 ldap_authHarbor 通过auth_mode配置项决定用户的认证方式。当需要对接 AD/LDAP 时该值被设置为ldap_auth。在 Harbor 的配置元数据中LDAP 相关配置项均有对应的环境变量键和默认值位于 src/lib/config/metadata/metadatalist.go核心参数整理如下配置项common 常量环境变量默认值说明LDAP_URLLDAP_URL空必填LDAP 服务器 URL如ldap://ad.example.com:389或ldaps://ad.example.com:636LDAP_BASE_DNLDAP_BASE_DN空必填LDAP 绑定的基础 DN如dcexample,dccomLDAP_UIDLDAP_UIDcn用作 LDAP 绑定身份标识的属性例如cn或SAMAccountnameLDAP_FILTERLDAP_FILTER空LDAP 搜索过滤器LDAP_SCOPELDAP_SCOPE2搜索用户的范围0-BASE1-ONELEVEL2-SUBTREELDAP_SEARCH_DNLDAP_SEARCH_DN空执行搜索的账号 DNLDAP_TIMEOUTLDAP_TIMEOUT5连接 LDAP 服务器的超时时间秒从源码可见LDAP_UID的默认值是cn这也正是测试用例第 1 步中“用户 ID 可以是其 AD 用户 DN 的cn属性或ldap_uid配置的属性”的由来——即 AD 用户首次登录时输入的 ID就是其在 AD 中对应cn或SAMAccountname等配置属性的值。LDAP URL 的规范化处理在 LDAP 会话实现 的formatURL函数中Harbor 会对配置的 LDAP URL 做规范化只接受ldap与ldaps两种协议若未显式写协议则按ldap处理若 URL 带端口且端口为636则自动按ldaps处理未指定端口时ldap默认补389、ldaps默认补636。这意味着你在 AD 场景下可以写ldap://ad-host或直接写ad-host:636Harbor 都会补全为可用的连接串。底层认证流程登录时 Harbor 做了什么理解测试步骤前先看 Harbor 在 LDAP 模式下认证一次所经历的关键调用链。核心实现在 src/core/auth/ldap/ldap.go 的Authenticate方法中空用户名校验用户名为空时直接返回ErrAuth“Empty user id”不会发起任何网络请求建立 LDAP 会话通过ldapCtl.Ctl.Session(ctx)读取系统 LDAP 配置并Open()连接连接超时由LDAP_TIMEOUT控制见 src/pkg/ldap/ldap.go搜索用户调用ldapSession.SearchUser(p)按LDAP_UID属性与用户名构造过滤器搜索。若搜索结果为空返回“Not found an entry”若多于一个返回“Multiple entries found”——这两种情况都会阻止登录避免歧义DN 绑定验证取搜索结果的 DN调用Bind(dn, password)用用户自己的 DN 和提交的密码向 AD 发起绑定src/pkg/ldap/ldap.go绑定失败即认证失败组装用户模型把 AD 返回的UsernameLDAP_UID属性值、Realnameuid/cn、Emailmail/email填入用户模型同步本地信息syncUserInfoFromDBsrc/core/auth/ldap/ldap.go从 Harbor 本地数据库读取该用户名对应的SysAdminFlag保证系统管理员标记能从会话传递附加 LDAP 组attachLDAPGroupsrc/core/auth/ldap/ldap.go遍历用户条目中的组 DN 列表若命中了LDAP group admin dn配置则标记AdminRoleInAuth true同时把用户所属 LDAP 组填充进 Harbor 用户组。登录成功后PostAuthenticatesrc/core/auth/ldap/ldap.go负责后续落地若该用户是首次登录本地库中不存在则调用OnBoardUsersrc/core/auth/ldap/ldap.go在 Harbor 数据库中创建一条本地记录。值得注意的是密码字段会被替换为一个随机生成的字符串且备注为from LDAP.——即 LDAP 用户的密码不会存储于 Harbor 本地库密码验证始终以 AD 为准。若用户已存在则只做邮箱同步且会校验邮箱格式是否合法。这就是为什么 LDAP 用户不能也不需要在 Harbor 内修改密码。测试步骤详解步骤 12首次登录与登出操作从未登录过 Harbor 的 AD 用户在 UI 登录页使用其在 AD 中的 IDcn或ldap_uid配置的属性值完成首次登录随后从 UI 登出。预期登录后应看到非管理员视角的仪表盘与导航栏不应看到“管理选项/Admin Options”登出后重新显示登录页面。原理首次登录时Authenticate在 AD 中搜索并绑定成功随后PostAuthenticate发现本地库无此用户通过OnBoardUser完成“本地记录落地”之后该用户才能与项目、角色等实体关联。由于AdminRoleInAuth未被标记、SysAdminFlag也不为真UI 呈现的自然是普通用户视角。步骤 34再次登录并核对账户设置操作用户再次登录 UI。预期能正常登录用户看不到自己的账户设置也不能修改密码密码修改需到 LDAP/AD 侧进行。原理由于密码由 AD 管理Harbor 本地库中该用户没有真实密码因此前端不提供账户设置与改密入口。这符合 LDAP 模式下“身份信息由外部目录服务单一管理”的预期。步骤 5错误凭据登录的安全提示操作使用错误的密码和错误的用户名组合登录 UI。预期错误提示不应显示哪一个输入值有误只应显示“用户名邮箱与密码组合不正确”这类统一信息。原理在 认证错误处理 中认证失败统一以ErrAuth类型返回Harbor 只把ErrAuth视为“凭据错误”其余错误视为服务端错误src/core/auth/authenticator.go。统一化错误信息可以避免向攻击者泄露“用户是否存在”这类目录枚举信息。对应的单元测试 ldap_test.go 也验证了错误密码与空凭据都会得到ErrAuth。步骤 67Docker 客户端登录验证操作在安装了 Docker CLI 的 Linux 主机上执行docker login harbor_host分别用正确密码和错误密码验证。预期正确密码docker login成功错误密码docker login失败。原理docker login走的是 Harbor 的 registry V2 认证接口该接口同样调用核心认证链Authenticate→ LDAP 搜索与绑定因此与 UI 共享同一套凭据校验逻辑。测试用例第 7 步专门验证客户端侧的失败路径确保错误凭据不会在任何入口获得 token。步骤 8系统管理员的用户管理视角操作以系统管理员身份登录 UI进入“管理选项admin Options”。预期在用户列表中能看到上述 AD 用户且该用户与本地数据库用户没有差异系统管理员可以对其授予或移除系统管理员角色。原理首次登录时OnBoardUser已在 Harbor 用户表中建立了该 AD 用户的本地记录密码为随机串、来源标注为 LDAP因此从管理视角看它与本地用户一样可被授予角色。此外syncUserInfoFromDB在每次登录时都会从数据库回填SysAdminFlag因此管理员在 UI 上授予的角色会在该用户下次登录时生效。步骤 910AD 侧禁用用户后的登录失效操作在 AD 服务器中禁用或删除该用户。预期该用户此后无论通过 UI 还是 Docker 客户端都无法再登录。原理LDAP 模式下的每次登录都会实时向 AD 发起搜索与 DN 绑定。用户被禁用或删除后SearchUser找不到条目或绑定被 AD 拒绝认证直接失败。由于 Harbor 本地并不保存 AD 用户的真实密码也没有本地缓存的绕过通道因此“在 AD 中禁用即全局失效”是 LDAP 模式的天然安全特性。测试与源码的对应关系小结测试验证点对应源码/配置依据首次登录按cn/ldap_uid属性匹配src/core/auth/ldap/ldap.go、配置元数据密码由 AD 管理、本地不保存OnBoardUser随机密码生成与from LDAP.备注src/core/auth/ldap/ldap.go错误凭据统一报错、不泄露字段ErrAuth错误类型与统一处理src/core/auth/authenticator.go搜索不到或多条命中均拒绝登录Authenticate中的空结果/多结果分支src/core/auth/ldap/ldap.go管理员角色可授予并可回填syncUserInfoFromDB回填SysAdminFlagsrc/core/auth/ldap/ldap.goAD 禁用后登录失效每次登录实时搜索与 DN 绑定src/pkg/ldap/ldap.go注意事项与常见问题首次登录的 ID 形式测试用例明确提示用户首次登录输入的是其 AD DN 中的cn属性值或ldap_uid配置的属性值。若 AD 使用SAMAccountname作为登录名需将LDAP_UID配置为对应属性否则会搜不到用户。错误提示的合规性步骤 5 的“统一错误提示”是安全设计测试时不要误认为是 Bug若在界面上看到具体字段的错误可能是改动了默认错误文案。Docker 客户端的时间与凭据docker login失败时可先确认 Harbor 的LDAP_URL、LDAP_BASE_DN等配置是否正确对应 配置元数据 中的环境变量再用docker logout harbor_host清理本地缓存的旧凭据后重试。组管理与并行附组若配置了 LDAP 组搜索过滤器ldap_group_search_filter登录时会验证并填充用户组当AttachParallel开启时Harbor 会用 5 个并发 worker 分组验证组 DN以降低与 LDAP 服务器的交互延迟src/core/auth/ldap/ldap.go。【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考