题图摄于圣安东尼奥
注:微信公众号不按照时间排序,请关注“亨利笔记”,并加星标以置顶,以免错过更新。
(本文作者何威威系Harbor开源项目贡献者,本文节选自《Harbor权威指南》一书。)
(续上一篇)
3. 访问控制与授权
访问控制是企业应用中必须考虑的问题,不同的用户使用系统功能时应该具有不同的权限,或者说需要授权才能进行一定的操作。最常见的授权模型是基于角色的访问控制,Harbor 定义了5 种角色,用户可依据在项目中担任的角色来确定在系统中使用的权限。
Harbor 以项目为单位管理镜像、Helm Chart等Artifact,除了公开的Artifact(如公开项目中的镜像等)可以匿名访问,用户必须成为项目的成员,才可以访问项目的资源。在 Harbor 中还有系统管理员的特殊角色,拥有“超级用户”权限,可以管理所有项目和系统级的资源和配置。除了 Harbor 初始安装时默认创建的系统管理员 admin,拥有系统管理员角色的用户还能把其他普通用户设置为系统管理员角色。在 LDAP 认证模式下,还可设定 LDAP 的管理员组来自动获得Harbor系统管理员角色。(本文为公众号亨利笔记原创文章)
项目成员分为项目管理员、维护人员、开发者、访客和受限访客等5种角色,用户在项目中可以拥有其中一种成员角色,不同的成员角色对项目里的资源拥有不同的访问权限。创建项目的用户自动拥有该项目的项目管理员角色,还能够把其他用户添加为项目成员,并赋予一个项目角色来访问项目中的资源。各个项目的访问权限都是互相独立的,即同一个用户在不同的项目中可以拥有不同的成员角色。Harbor完整的角色权限如下表所示。
权 限 | 项目管理员 | 维护人员 | 开发者 | 访 客 | 受限访客 |
---|---|---|---|---|---|
查看项目仓库 | ✔ | ✔ | ✔ | ✔ | ✔ |
创建项目仓库 | ✔ | ✔ | ✔ | ||
编辑、删除项目仓库 | ✔ | ✔ | |||
查看、复制、拉取 Artifact | ✔ | ✔ | ✔ | ✔ | ✔ |
推送 Artifact | ✔ | ✔ | ✔ | ||
扫描、删除 Artifact | ✔ | ✔ | |||
查看、拉取Helm Chart | ✔ | ✔ | ✔ | ✔ | ✔ |
推送 HelmChart | ✔ | ✔ | ✔ | ||
删除 Helm Chart | ✔ | ✔ | |||
查看项目成员 | ✔ | ✔ | ✔ | ✔ | |
创建、编辑、删除项目成员 | ✔ | ||||
创建、编辑、删除、查看项目标签 | ✔ | ✔ | |||
查看扫描器 | ✔ | ✔ | ✔ | ✔ | ✔ |
修改扫描器 | ✔ | ||||
查看策略 | ✔ | ✔ | |||
添加、删除、修改策略 | ✔ | ✔ | |||
查看机器人账户 | ✔ | ✔ | ✔ | ✔ | |
创建、编辑、删除机器人账户 | ✔ | ||||
查看 Webhook | ✔ | ✔ | |||
新建、编辑、停用、删除 Webhook | ✔ | ||||
查看项目日志 | ✔ | ✔ | ✔ | ✔ | |
查看项目配置 | ✔ | ✔ | ✔ | ✔ | ✔ |
编辑项目配置 | ✔ |
在“系统管理”→“用户管理”页面,系统管理可以查看、创建、删除用户(创建、删除功能仅限本地用户认证模式可用),也可以设置或取消用户为管理员。(本文为公众号:亨利笔记 原创文章
在使用 LDAP 和 OIDC 认证模式时,“系统管理”里会出现一个“组管理”的功能,如图所示。在“组管理”页面,系统管理员可以查看、新增、编辑和删除组。
在 LDAP 认证模式下,单击“组管理”页面的“新增”按钮,在“导入LDAP组”对话框中填写上 LDAP 组域和名称后即可把 LDAP 组导入系统。在下图的示例中导入了 LDAP 的 “cn=developer,ou=Groups,dc=goharbor,dc=io” 组到系统中,并命名为 Harbor 的 Developer 组。
下图所示的示例中,在 Harbor 项目中把 Developer 组赋予开发者角色,即添加了 LDAP 中的组“cn=developer,ou=Groups,dc=goharbor,dc=io”为项目成员,并且为开发者角色。
在 OIDC 认证模式下,单击“组管理”页面的“新增”按钮,在显示的“新建OIDC组”对话框中填写上 OIDC 的组名称即可新建一个 OIDC 组。如下图所示,新建了一个 Harbor 的 developer 组。(本文为公众号亨利笔记原创文章)
如下图所示,在 Harbor 项目中为 developer 组赋予开发者角色,即添加了 OIDC 中的 developer 组为项目成员,并且具有开发者角色。(本文为公众号:亨利笔记 原创文章
添加组成员成功后,用户登录 Harbor 系统后可以用组的角色访问相应的项目。如用户 jack 登录 Harbor 后,会拥有项目开发者角色的权限,如图所示。
4. 机器人账户
Harbor 之外的其他应用系统往往有访问 Harbor 的需求,如持续集成和持续交付(CI/CD)系统需要访问 Harbor 项目的 Artifact 和 Helm Chart 等。这些系统访问 Harbor 时,需要有用户账户进行认证,但由于这些系统不与真实世界的人员绑定,因此不方便在 LDAP 等身份认证系统中开设对应的用户账户。为了解决这个问题,Harbor 设计了机器人账户来满足系统之间认证的问题。使用机器人账户有不少优点:可以不暴露真实人员的用户密码;可以自定义设置访问账户的有效期;还可以随时禁用它。(本文为公众号:亨利笔记 原创文章
在项目的“机器人账户”页面下可以添加、禁用、删除和查看项目的机器人账户,如图所示。
在“机器人账户”页面单击“添加机器人账户”按钮,在“创建机器人账户”对话框中填写上“名称”即可创建一个机器人账户。如图所示创建了一个名为“gitlab-ci”的机器人账户,具有 Artifact 和 Helm Chart 的推送和拉取权限,并且永不过期。
创建机器人账户成功后,可以选择复制机器人账户的“令牌”到剪切板,也可以把机器人账户的详细信息导出并保存到文件中,如图所示。在用“docker login”命令登录 Harbor 服务时,可使用 “robot$” 前缀加上填写的机器人账户名称作为用户名并将令牌作为密码登录。(本文为公众号亨利笔记原创文章)
注意:系统不会保存机器人账户的令牌信息,用户必须在机器人账户创建成功后立刻记录令牌信息。如果未保存或丢失存此令牌,则不能通过系统恢复或找回此机器人账户的令牌。
如果机器人账户的令牌不再被使用,则可以在“机器人账户”管理页面禁用或者删除对应的机器人账户。已禁用的账户可以再次启用,但删除后的账户不能再次恢复。
在漏洞扫描器扫描 Artifact 时,Harbor 会创建一个拥有 scanner-pull 权限的临时机器人账户,并发送该机器人账户信息给漏洞扫描器,使其能拉取并扫描 Artifact。在扫描结束后,该账号立即被删除。
5. 常见问题
Harbor 目前不支持自动把已有的用户迁移到新的认证模式,所以如果系统中存在其他认证系统的用户,则不支持修改用户的认证模式。
LDAP 用户登录时会检查用户是否在 LDAP 管理员组中,如果不在管理员组中,则接着会检查其在数据库中映射的用户是否设置了系统管理员标识,如果设置了,则用户依然会以系统管理员的身份访问 Harbor。要解决这种问题,建议把用户从 LDAP 管理员组中删除后,同时去 Harbor 的“用户管理”页面把其映射的系统管理员标识去掉。
在机器人账户的名称中含有“”符号,“” 在 Shell 终端或脚本里有特殊含义,“”及其之后的字母会作为一个变量来处理,这样登录时会因为使用的用户名错误导致登录失败。在 Shell 终端或者脚本中用 “docker login” 命令登录 Harbor 时,需要对机器人账户名称中的 “” 符号使用 “\” 符号进行转义,比如用 “robot\gitlab-ci” 替代 “robotgitlab-ci”,或者用' '单引号把用户名包裹起来,比如用 'robotgitlab-ci' 替代 robotgitlab-ci。
因为 CLI 密码只支持拉取和推送 Artifact 的操作,不支持 API 的调用,所以无法在远程复制策略中使用。