Harbor默认禁止匿名拉取因关闭anonymous_access以符合安全基线;开启需在系统设置勾选且仅对public项目生效,匿名用户不可push或查看成员;K8s用imagePullSecrets时应关闭匿名访问以防暴露元数据。

Harbor 为什么默认不允许匿名拉取镜像
因为 Harbor 默认关闭 anonymous_access,这是安全基线设计——不显式开启,就拒绝未认证请求。很多团队在内网直接用 docker pull 失败,第一反应是“网络不通”,其实是被 401 拦下了。
- 匿名拉取需在 Harbor UI 的「配置管理」→「系统设置」中勾选「允许匿名访问」,且仅对公开项目(
public项目)生效 - 即使开启,匿名用户也无法执行
docker push、docker tag或查看项目成员列表 - Kubernetes 集群若用
imagePullSecrets拉私有镜像,关掉匿名访问反而是正确做法;误开反而可能暴露镜像元数据(如 manifest 列表)
给开发人员分配最小权限:project-admin ≠ admin
很多人一上来就给用户加 project-admin 角色,结果对方能删整个项目、改机器人账号、甚至覆盖 webhook 配置。其实绝大多数场景只需要 developer 或自定义角色。
-
developer可 push/pull 镜像、创建 tag、触发扫描,但不能删镜像、不能改项目设置 - 需要自动清理旧镜像?别给
project-admin,改用 Harbor 提供的retention policy(保留策略),它由系统后台执行,不依赖用户权限 - 机器人账号(robot account)更适合 CI/CD 场景:它自带 token、可设过期时间、权限粒度比人更细,比如只允许向
dev项目 push:latest
LDAP 同步后用户没权限?检查 group_search_filter 和 project role binding
LDAP 用户登录成功但进不了项目,大概率是组映射没生效,或 Harbor 没把 LDAP 组和项目角色绑对。
- Harbor 不自动同步 LDAP 组权限,必须手动在项目「成员」页添加对应 LDAP 组,并指定角色(如
developer) -
group_search_filter配错会导致 Harbor 根本查不到你的组,常见错误值:(objectClass=group)(AD 应该用(objectClass=groupOfNames)或(objectClass=group)视 AD 类型而定) - 如果 LDAP 组名含空格或特殊字符,Harbor 会截断或报错;建议在 LDAP 端用短横线命名,如
harbor-dev-team,同步后直接绑定到项目
镜像扫描失败常见原因:clair / trivy 配置与镜像层兼容性
扫描状态长期卡在 scanning 或直接显示 error,不是扫描器挂了,往往是镜像本身或配置不匹配。
- Trivy 扫描失败常见于使用了多阶段构建但未清理中间层的镜像——Harbor 默认上传所有层,Trivy 可能因解析非标准 layer 报
failed to parse image - Clair v2 已废弃,Harbor 2.5+ 默认用 Trivy;若仍强制配 Clair,需确保
clair_endpoint可达且版本兼容(Clair v4 要求 Harbor ≥ 2.3) - 私有证书问题最隐蔽:如果 Harbor 用自签名证书,Trivy 容器里没信任该 CA,就会静默失败;解决方法是在
/data/secret/clair/certs下挂载 CA 证书,并重启harbor-trivy容器
权限模型不是越宽越好,Harbor 的 RBAC 粒度足够细,但得亲手配——比如一个只跑测试的 Jenkins 任务,用 robot account + developer 角色 + retention policy 就够了,没必要碰 project-admin。配置项写错一个字符,比如 group_search_filter 里少个括号,整个 LDAP 组授权就失效,这种细节比功能本身更影响落地。










