ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Harbor 管理员账号登录与登出验证:从 UI 到 Docker CLI 的完整测试指南

Harbor 管理员账号登录与登出验证:从 UI 到 Docker CLI 的完整测试指南 Harbor 管理员账号登录与登出验证从 UI 到 Docker CLI 的完整测试指南【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor导读本文基于 Harbor 官方测试用例1-08 Admin User Log In and Log OutDB 模式与 LDAP 模式系统讲解如何验证管理员账号在 Harbor 中的完整登录/登出链路包括 Web UI 登录、UI 登出、错误密码提示、以及 Docker 客户端docker login的身份验证。读完本文你将掌握该用例的执行步骤、预期结果及其背后的源码级认证原理认证器注册机制、错误码锁定策略、会话销毁与 Token 签发可直接复现为 Harbor 部署后的基础验收用例。1. 用例定位认证是 Harbor 的第一道安全防线Harbor 是一个开源的云原生镜像仓库所有镜像的推送、拉取、复制等操作都建立在用户身份认证之上。用例1-08位于 tests/testcases/Group1-user-management/1-08-admin-log-in-log-out.md属于用户管理测试组Group1的基础用例核心目的是验证管理员admin账号在 Web UI 上可以正常登录与登出验证错误密码登录时系统不会泄露到底是用户名错还是密码错的细节只提示用户名与密码组合不正确验证 Docker CLI 通过docker login harbor_host也能完成与 UI 相同的认证。该用例同时覆盖了 Harbor 两种最常见的认证模式数据库认证DB Mode与LDAP 认证LDAP Mode。2. 环境准备在执行本用例之前需要满足以下条件条件说明Harbor 实例一个正在运行且可访问的 Harbor 实例认证模式Harbor 配置为对本地数据库DB或 LDAP 服务器进行认证客户端主机一台安装了 Docker CLIDocker client的 Linux 主机用于执行docker login测试账号具备系统管理员权限的账号默认部署时为admin关于认证模式的配置Harbor 通过安装配置生成认证模式定义于系统配置项auth_mode。从源码结构看认证模式是驱动 Harbor 选择认证器authenticator的关键参数见 src/core/auth/authenticator.go 中的Login函数func Login(ctx context.Context, m models.AuthModel) (*models.User, error) { authMode, err : config.AuthMode(ctx) ... if authMode || IsSuperUser(ctx, m.Principal) { authMode common.DBAuth } authenticator, ok : registry[authMode] ... }注意即使是 LDAP 模式Harbor 也约定超级用户admin数据库内 ID 为 1始终走本地数据库认证因此管理员账号在任何认证模式下都能登录。3. 测试步骤详解3.1 步骤 1 2UI 登录与登出管理员用户通过用户名登录 Harbor Web UI管理员用户从 Web UI 登出。预期结果步骤 1、2 中管理员用户均能成功登录/登出。Harbor UI 的登录与登出请求由CommonController处理路由注册于 src/server/route.goweb.Router(/c/login, controllers.CommonController{}, post:Login) web.Router(/c/log_out, controllers.CommonController{}, get:LogOut)POST /c/login接收表单字段principal用户名与password调用auth.Login完成认证成功后通过PopulateUserSession将用户写入会话GET /c/log_out从安全上下文中取出当前用户名若为 OIDC 用户则重定向到 OIDC Provider 的登出地址否则调用DestroySession销毁会话。对应实现见 src/core/controllers/base.go 中的Login与LogOut方法。3.2 步骤 3错误密码登录的错误信息验证使用管理员的错误密码登录 Web UI检查页面显示的报错信息。预期结果错误提示不应指明是哪个输入值用户名或密码不正确而应只显示用户名和密码的组合不正确这类模糊提示。这一安全设计在源码中有明确支撑当认证失败时auth.Login会对凭据错误统一处理而 UI 侧的Login方法只返回 HTTP 401CustomAbort(http.StatusUnauthorized, )不向前端回传具体失败原因见 src/core/controllers/base.go。更深一层authenticator.go中通过ErrAuth错误类型区分用户凭据错误与服务端错误只有ErrAuth才被视为坏凭据type ErrAuth struct { details string } // Authenticate 返回 ErrAuth 时视为凭据错误其余错误视为服务端错误3.3 步骤 4Docker CLI 成功登录在一台安装了 Docker CLI 的主机上执行docker login harbor_host输入管理员用户名与密码验证管理员用户可以通过 Docker 客户端登录。预期结果Docker 客户端登录成功。docker login背后的流程是Docker 客户端向 Harbor 的 Token 服务发起请求Harbor 完成用户名/密码校验后签发一个由私钥签名的 Bearer Token签名算法为 RS256Docker 客户端凭此 Token 访问镜像仓库 API。Token 服务路由为/service/token见 src/server/route.go签发逻辑见 src/core/service/token/authutils.go。3.4 步骤 5Docker CLI 错误密码登录再次使用docker login harbor_host但这次输入错误的密码。预期结果Docker 客户端登录失败认证被拒绝。4. 预期结果汇总步骤操作预期结果1admin 在 UI 登录登录成功2admin 在 UI 登出登出成功3UI 使用错误密码登录登录失败仅提示用户名和密码组合不正确不泄露具体输入错误4Docker CLI 使用正确凭据docker login登录成功5Docker CLI 使用错误密码docker login登录失败5. 源码级原理剖析5.1 认证器注册机制DB 与 LDAP 的统一抽象Harbor 将认证逻辑抽象为AuthenticateHelper接口见 src/core/auth/authenticator.go各认证模式在包初始化时通过auth.Register注册到全局registrymapvar registry make(map[string]AuthenticateHelper) func Register(name string, h AuthenticateHelper) { ... }DB 模式注册名为common.DBAuth实现见 src/core/auth/db/db.go。核心逻辑是调用userMgr.MatchLocalPassword(principal, password)直接与本地数据库中的用户凭据比对匹配失败返回auth.NewErrAuth(Invalid credentials)LDAP 模式注册名为common.LDAPAuth实现见 src/core/auth/ldap/ldap.go。认证分两步先用搜索过滤器定位用户条目再用该条目的 DN 与用户提交的密码执行 LDAP Bind。Bind 成功即认证通过随后 Harbor 会将用户信息同步OnBoard到本地数据库以便与其他实体项目、角色关联。此外还有 OIDC、UAA、HTTP Auth Proxy 等认证器见 src/core/auth 目录它们共享同一接口这也是DB 或 LDAP 模式能共用同一套测试用例的根本原因。5.2 登录失败锁定暴力破解防护为防止针对管理员账号的暴力破解auth.Login内置了失败锁定机制// 1.5 seconds const frozenTime time.Duration 1500 * time.Millisecond var lock NewUserLock(frozenTime) if lock.IsLocked(m.Principal) { log.Debugf(%s is locked due to login failure, login failed, m.Principal) return nil, nil } user, err : authenticator.Authenticate(ctx, m) if err ! nil { if _, ok err.(ErrAuth); ok { log.Warningf(Login failed, locking %s, and sleep for %v, m.Principal, frozenTime) lock.Lock(m.Principal) time.Sleep(frozenTime) } return nil, err }即一旦认证返回ErrAuth该用户名会被锁定 1.5 秒并强制睡眠期间再次登录直接失败。这也是为什么步骤 3 和步骤 5 中连续使用错误密码会被拒绝的底层保障之一。5.3 会话与安全上下文UI 登录成功后用户信息被写入会话后续请求由安全上下文Security Context承载权限判定。本地认证用户的上下文实现见 src/common/security/local/context.goIsAuthenticated()用户是否已认证IsSysAdmin()是否为系统管理员SysAdminFlag或 LDAP 管理员组角色AdminRoleInAuth为真Can()通过 RBAC 评估器判定用户对某资源的操作权限系统管理员直接获得全部权限admin.New(...)。管理员账号之所以能管理全部项目与系统设置正是因为本地安全上下文为其挂载了系统管理员评估器。5.4 Docker Token 认证链路docker login与 UI 登录共享同一套凭据校验但后续授权机制不同Docker 客户端携带 Token 访问 registry。Token 服务根据请求中的scope如repository:library/hello-world:pull,push解析资源与动作并签发带权限声明的 JWT相关解析逻辑见 src/core/service/token/authutils.go 的GetResourceActions。6. 执行要点与问题排查端口与地址docker login使用的harbor_host需与 Harbor 的外部访问地址一致若配置了 HTTPS 证书客户端主机需信任 Harbor 的 CA 证书错误信息检查步骤 3 的关键是观察报错文案——如果页面提示用户名不存在或密码错误等能区分输入值的细节说明认证信息泄露处理不符合预期LDAP 模式注意LDAP 用户登录成功后会 OnBoard 到本地数据库但密码不落库后续仍由 LDAP 服务器校验管理员admin不受 LDAP 影响始终走 DB 认证见 src/core/auth/authenticator.go 的IsSuperUser逻辑相关自动化佐证Harbor 的 API 自动化测试中也大量使用admin/Harbor12345作为默认管理员凭据执行登录与用户管理操作可参考 tests/apitests/python/test_user_crud.py 与 tests/apitests/python/test_user_group.py。7. 小结通过本用例可以一次性覆盖 Harbor 认证体系的三个关键面UI 会话登录/登出、错误凭据的信息最小化提示、Docker 客户端 Token 认证。结合 src/core/auth 目录下的认证器实现与 src/core/controllers/base.go 的控制器逻辑读者既能复现完整测试流程也能理解 Harbor 认证体系统一接口 多模式注册 失败锁定 最小信息泄露的设计思想为后续进行 LDAP、OIDC 等更复杂认证模式的验证打下基础。【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进