ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Harbor LDAP 模式下非管理员用户创建项目:基于测试用例 2-11 的完整验证指南

Harbor LDAP 模式下非管理员用户创建项目:基于测试用例 2-11 的完整验证指南 Harbor LDAP 模式下非管理员用户创建项目基于测试用例 2-11 的完整验证指南【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor导读本文以 Harbor 仓库测试套件中的 2-11-LDAP-user-create-project.md 为核心系统讲解在LDAP/AD 认证模式auth_modeldap_auth下非管理员用户如何登录 Harbor 并创建项目、如何验证项目可见性与镜像推拉权限。文章不仅完整还原测试用例的每一步操作还结合 LDAP 认证模块源码 与 项目创建 API 实现解释LDAP 用户如何被本地库接纳入驻、项目访问权限如何判定等底层原理帮助你独立复现该验证场景并排查实际部署中的同类问题。一、测试背景这份用例在验证什么测试用例 2-11 属于tests/testcases/Group2-image-management/目录下的镜像管理功能组与 2-01-DB-user-create-project.md数据库认证模式互为对照版本。两者的验证目标完全一致验证非管理员non-admin用户能否在 Harbor 中创建项目以及项目的公开/私有属性是否正确约束其他用户的可见性与拉取权限。2-11 的特殊之处在于所有参与测试的用户都不是 Harbor 本地数据库用户而是来自外部 LDAP/AD 服务器。这意味着测试同时覆盖了两条技术链路LDAP 认证链路LDAP 用户能否成功登录 Harbor认证通过后系统为其在本地库建立关联记录项目权限链路非管理员用户能否调用项目创建 API以及公开public与私有项目对第三方的可见/可拉取差异是否符合预期。二、前置环境准备根据用例要求运行本测试需要满足以下环境条件条件说明Harbor 实例一个运行中且可访问的 Harbor 实例认证模式Harbor 配置为 LDAP/AD 认证auth_mode为ldap_auth用户数据存储在 LDAP/AD 服务器上Docker 客户端一台安装了 Docker CLI 的 Linux 主机测试账号至少两个非管理员用户用户 A、用户 B且均存在于 LDAP/AD 中用例同时强调在测试中用户 A、用户 B 以及项目 X、项目 Y 应替换为更长、更有实际含义的名称避免使用过于简短的名字这既是为了可读性也是为了避免与 Harbor 内置保留名或现有测试数据冲突。2.1 如何将 Harbor 切换为 LDAP 认证模式ldap_auth是 Harbor 内置的认证模式常量定义于 src/common/const.goLDAPAuth ldap_auth在部署配置层面你可以在 make/harbor.yml.tmpl 中通过环境变量注入认证模式或在系统管理页面Administration → Authentication中选择LDAP并填写 LDAP 服务参数。与之对应的配置结构体定义在 src/lib/config/models/model.go// LdapConf holds information about ldap configuration type LdapConf struct { URL string json:ldap_url // LDAP 服务器地址如 ldap://ldap.example.com:389 或 ldaps://... SearchDn string json:ldap_search_dn // 搜索账号 DN用于目录检索 SearchPassword string json:ldap_search_password // 搜索账号密码 BaseDn string json:ldap_base_dn // 搜索基 DN Filter string json:ldap_filter // 用户搜索过滤器 UID string json:ldap_uid // 用户名属性默认取该属性的值作为登录名 Scope int json:ldap_scope // 搜索范围Base/OneLevel/Subtree ConnectionTimeout int json:ldap_connection_timeout // 连接超时秒 VerifyCert bool json:ldap_verify_cert // 是否校验 LDAPS 证书 }对应地GroupConf结构体用于配置 LDAP 用户组导入相关参数type GroupConf struct { BaseDN string json:ldap_group_base_dn,omitempty Filter string json:ldap_group_filter,omitempty NameAttribute string json:ldap_group_name_attribute,omitempty SearchScope int json:ldap_group_search_scope AdminDN string json:ldap_group_admin_dn,omitempty MembershipAttribute string json:ldap_group_membership_attribute,omitempty AttachParallel bool json:ldap_group_attach_parallel,omitempty }关键参数说明ldap_url支持ldap://与ldaps://两种协议。根据 src/pkg/ldap/ldap.go 中formatURL的解析逻辑若省略协议则默认按ldap处理省略端口时ldap默认补:389ldaps默认补:636若显式写端口且为 636协议会自动识别为ldaps。ldap_verify_cert为true时校验 LDAPS 证书为false时跳过证书校验对应源码InsecureSkipVerify: !s.basicCfg.VerifyCert见 src/pkg/ldap/ldap.go。ldap_connection_timeout以秒为单位通过goldap.DefaultTimeout作用于 LDAP 连接见 src/pkg/ldap/ldap.go。三、LDAP 认证原理用户是如何进入Harbor 的在动手执行测试前先理解 LDAP 模式下的认证与用户落库机制有助于判断测试中出现的各种现象。核心实现位于 src/core/auth/ldap/ldap.go该文件在包初始化时向认证框架注册了 LDAP 认证器func init() { auth.Register(common.LDAPAuth, Auth{ userMgr: user.New(), }) }3.1 Authenticate搜索 绑定两步认证Authenticate方法ldap.go的执行流程如下参数校验用户名为空直接返回Empty user id错误建立会话通过ldapCtl.Ctl.Session(ctx)加载系统 LDAP 配置并Open()建立连接搜索用户调用SearchUser(p)在目录中检索该用户名——注意源码要求恰好命中一条记录len(ldapUsers) 0报 Not found an entrylen(ldapUsers) ! 1报 Multiple entries foundDN 绑定用搜索到的用户 DN 与用户提交的密码执行ldapSession.Bind(dn, m.Password)完成密码校验组装用户信息将 LDAP 条目中的用户名、真实姓名、邮箱填入models.User补充系统内信息syncUserInfoFromDB从 Harbor 本地库回填系统管理员标志SysAdminFlagattachLDAPGroup按配置附加用户所属的 LDAP 组并支持通过ldap_group_attach_parallel开启并行组校验见 ldap.go。3.2 OnBoardUser本地库的影子记录LDAP 服务器本身不存储 Harbor 的项目、角色等业务数据因此 Harbor 采用**影子用户dummy record**策略认证通过后将用户写入本地用户表以便将其关联到项目等实体。OnBoardUserldap.go的关键行为邮箱为空时若用户名含则直接以用户名充当邮箱密码不保存在本地库——生成一个随机字符串仅用于占位Password is not kept in local db记录来源标记为from LDAP.。这解释了测试环境要求用户数据存储在 LDAP/AD 服务器的原因Harbor 本地表只是关联用的影子记录用户的真实凭据永远以 LDAP/AD 为准。3.3 用户搜索过滤器的构造SearchUser依赖 src/pkg/ldap/filter.go 中的FilterBuilder构造 LDAP 过滤器用户配置的ldap_filter会先经过normalizeFilter处理自动补全首尾括号见 filter.go再与用户名属性等于输入值的条件进行 AND 组合并调用goldap.EscapeFilter对输入用户名做特殊字符转义防止 LDAP 注入见 src/pkg/ldap/ldap.go。四、测试步骤全解LDAP 模式下非管理员用户的完整操作链路用例 2-11 明确说明步骤与 2-01 完全相同唯一区别是用户来自 LDAP/AD。因此以下步骤完整继承自 2-01-DB-user-create-project.md并将其中的DB 用户语境替换为 LDAP 用户。约定用户 A、用户 B 均为非管理员 LDAP 用户项目 X、项目 Y 名称请替换为有实际含义的长名称。4.1 阶段一通过 UI 创建公开/私有项目以用户 A非管理员登录 Harbor Web UI。创建新项目 X公开性设为关闭publicity off即私有项目。在项目创建 API 的实现中public元数据未显式设置时会默认落为false见 src/server/v2.0/handler/project.go// populate public metadata as false if it isnt set if req.Metadata.Public { req.Metadata.Public strconv.FormatBool(false) }创建另一个新项目 Y公开性设为开启publicity on即公开项目。4.2 阶段二跨用户验证公开/私有项目的可见性保持用户 A 处于登录状态在另一个浏览器中以用户 B非管理员登录。用户 B 查看自己的公共项目public projects列表确认项目 Y 可见、项目 X 不可见。用户 A 修改项目 X 的公开性为开启将项目 Y 的公开性修改为关闭。用户 B 刷新公共项目列表确认项目 X 变为可见、项目 Y 变为不可见。可见性差异正是公开项目元数据publictrue/false在列表过滤层面的直接体现它决定了未授权用户能否在 UI 上发现该项目。4.3 阶段三Docker CLI 推拉镜像验证读写权限在 Docker 客户端主机上以用户 A 身份执行docker login harbor_host。此时认证走的是 LDAP 链路用户名与密码被提交给 HarborHarbor 到 LDAP 目录搜索并绑定该用户的 DN 完成校验。用户 A 执行docker push分别向项目 X 与项目 Y 推送镜像例如docker push harbor_host/project_x/image:tag。用户 A 在浏览器中确认镜像已成功推送到项目 X 与项目 Y。在 Docker 客户端主机上以用户 B 身份执行docker login harbor_host。用户 B 分别执行docker pull尝试拉取项目 X 中的镜像与项目 Y 中的镜像。五、预期结果与分析用例对上述每一步给出了明确的预期结果2-01-DB-user-create-project.md 原文为步骤 5用户 B 应看到项目 Y 被列出而项目 X 未被列出步骤 7用户 B 应看到项目 X 被列出而项目 Y 未被列出步骤 9、10镜像应成功推送到项目 X 与项目 Y并能在 UI 中查看步骤 11、12用户 B 可以拉取项目 X 的镜像不能拉取项目 Y 的镜像。5.1 为什么非管理员能创建项目默认情况下Harbor 允许任何已登录用户创建项目除非系统配置了仅管理员可创建项目project_creation_restriction常量定义于 src/common/const.go。在 项目创建 API 中逻辑非常清晰onlyAdmin, err : config.OnlyAdminCreateProject(ctx) ... if onlyAdmin !(a.isSysAdmin(ctx, rbac.ActionCreate) || secCtx.IsSolutionUser()) { log.Errorf(Only sys admin can create project) return a.SendError(ctx, errors.ForbiddenError(nil).WithMessage(Only system admin can create project)) }即只有当onlyAdmin为真且当前用户不是系统管理员时项目创建才会被拒绝在默认配置下LDAP 普通用户非管理员同样具备项目创建权限。这就是测试用例的前提——用户 A、用户 B 作为非管理员也能完成创建与推送操作。5.2 为什么私有项目的镜像不能跨用户拉取当用户 B 尝试拉取私有项目 Y 的镜像时被拒绝这是 Harbor 对项目访问控制的预期行为私有项目的镜像仅对项目成员开放用户 B 不是项目 Y 的成员因此无法访问其内容而公开项目 X 允许任何已登录用户拉取。测试用例正是利用这一差异验证了公开/私有属性的完整生效链路。六、源码级佐证LDAP 用户与项目成员的关联测试步骤中用户 A 推送、用户 B 拉取的行为背后还涉及LDAP 用户/组与项目成员关系的建立。在 src/core/auth/ldap/ldap_test.go 中有两个测试用例直接印证了这一点TestAddProjectMemberWithLdapUserldap_test.go通过auth.SearchAndOnBoardUser(ctx, mike)先在本地库安置 LDAP 用户再以EntityType: common.UserMember、Role: common.RoleProjectAdmin将其添加为项目成员验证 LDAP 用户可以作为项目成员写入project_member表TestAddProjectMemberWithLdapGroupldap_test.go以GroupType: common.LDAPGroupType常量值为 1见 src/common/const.go的方式将 LDAP 组如cnharbor_users,ougroups,dcexample,dccom整体添加为项目成员验证了 LDAP 组授权路径。这两组测试说明LDAP 用户在 Harbor 中承担项目角色时走的是认证成功后影子落库 → 以本地用户 ID 关联项目成员的链路与本地 DB 用户的使用方式一致。七、常见问题与排查建议在实际复现本用例时若遇到失败可参考以下排查方向依据均来自前文涉及的源码现象可能原因排查要点LDAP 用户无法登录用户名在目录中命中多条记录Authenticate要求搜索恰好命中一条需收紧ldap_filter或检查ldap_uid属性ldap.go登录提示 LDAP 连接失败URL/端口/协议配置不当检查ldap_url协议与端口formatURL的补全规则见 ldap.goLDAPS 校验失败证书不受信任视环境将ldap_verify_cert置为false源码对应InsecureSkipVerify非管理员无法创建项目开启了仅管理员可创建项目检查系统配置project_creation_restriction或改用系统管理员账号操作私有项目被其他用户看到/拉到公开性元数据被误设为 true确认创建项目时public未勾选且未通过 API 传入metadata.publictrue八、总结测试用例 2-11 是 HarborLDAP 认证模式下镜像生命周期与项目权限体系的集成验证它覆盖了LDAP 用户登录 → 非管理员创建项目 → 公开/私有可见性过滤 → Docker 推拉权限控制的完整闭环。结合 LDAP 认证模块 与 项目创建 API 的源码可以看到Harbor 通过LDAP 目录认证 本地影子记录的机制让外部目录中的用户无缝获得与本地用户一致的镜像管理与项目协作能力。对于正在将 Harbor 接入企业 LDAP/AD 目录的团队本文的步骤与预期结果可以直接作为验收清单使用。【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表