创建系统机器人账户

Harbor 引入了系统级机器人账户的概念。管理员可以创建一个覆盖多个项目的系统级机器人账户。系统机器人账户用于创建非用户范围的凭据,以执行跨多个项目的操作和 API 调用。

每个系统机器人账户可以拥有多个系统权限和跨多个项目的项目级别权限。

权限参考包含权限及其操作的列表。这些权限可以组合并分配给系统机器人账户,使其能够通过 OCI 客户端或 Harbor API 执行所需的任务。机器人账户不能用于登录用户界面。

您还可以创建项目范围的机器人账户,这些账户的访问权限仅限于单个项目。阅读更多关于项目机器人账户的信息。

查看系统机器人账户

  1. 以管理员身份登录到您的 Harbor 实例。
  2. 在侧边栏中,选择管理部分中的 机器人账户

System robot account page

此页面包含 Harbor 实例中所有现有系统机器人账户的列表。该表包含每个系统机器人账户的以下信息

  • 系统账户的名称。这源自为您的 Harbor 实例配置的机器人账户前缀和创建账户时分配的名称。机器人账户名称遵循格式 <prefix><account_name>。如果您在此页面上使用搜索功能,则只需搜索不带前缀的账户名称。

  • 启用状态指示账户是激活还是停用。

  • 账户被分配的系统权限计数。要查看分配的系统权限的完整集合,请单击 权限 链接。

    View all the system permissions

  • 账户关联的项目数量。单击 项目 链接以查看与账户关联的项目的完整列表。

    View list of all projects associated with a system robot account

  • 创建时间显示机器人账户的创建时间。

  • 账户过期时间。根据创建时间和创建机器人账户时设置的过期时间计算得出。

  • 手动为系统机器人账户添加的描述。

添加系统机器人账户

  1. 使用系统管理员权限登录到 Harbor 界面。

  2. 转到 管理,选择一个项目,然后选择 机器人账户

  3. 单击 新建机器人账户

    Create system robot account window

  4. 输入此机器人账户的名称和可选描述。

  5. 为此机器人账户设置过期时间。默认情况下,使用系统配置的过期时间。如果您想创建永不过期的机器人账户,也可以从下拉列表中选择 永不过期

  6. 为此机器人账户选择系统权限。

  7. 如果您想在所有项目中使用此系统机器人账户,请选择 覆盖所有项目 。使用此选项意味着此系统机器人账户将能够访问 Harbor 实例中的所有现有和未来项目。您可以选择要授予机器人账户的权限。

    Cover all projects and select permissions

  8. 如果您希望此机器人账户仅覆盖某些项目或被授予某些权限,请使用项目表选择要分配给系统机器人账户的项目和权限。此表显示每个项目名称、项目创建时间和用于为该项目分配系统机器人账户权限的下拉列表。

    Project table for assigning robot accounts

    单击项目名称旁边的复选框以关联此机器人账户。

    默认情况下,该表显示 Harbor 实例中的所有项目。您可以使用 项目名称 标题右侧的 筛选图标 来筛选项目。请注意,项目表可能会分为多个页面,并且一次只显示一部分项目,具体取决于您的 Harbor 实例中有多少项目以及有多少项目符合您的筛选条件。

    Filter project names

    使用 权限 下拉列表选择要分配给特定项目的权限。您可以控制按项目分配给单个机器人账户的权限,从而对每个机器人账户进行细粒度控制。您可以选择 全选取消全选 以快速添加或删除机器人账户的所有权限。

    推送仓库 权限必须与 拉取仓库 权限一起分配。您不能单独分配推送仓库权限。

    Set project permission

    单击 重置所有项目权限 下拉列表以控制每个项目的可用权限。选择或取消选择权限将为每个项目添加或删除该权限。使用此选项将调整所有项目的权限,而不仅仅是如果您已筛选特定项目名称时显示的项目。

    Reset robot account permissions

    单击 选择所有项目 以将系统机器人账户与表中显示的所有项目关联。如果您按项目名称筛选,则此选项将仅选择筛选后的项目。

  9. 单击 完成

  10. 在确认窗口中,单击 导出到文件 以下载密钥作为 JSON 文件,或单击剪贴板图标将其内容复制到剪贴板。

    Copy system robot account token

    Harbor 不存储机器人账户密钥,因此您必须下载密钥或将内容复制并粘贴到文本文件中。创建机器人账户后,无法从 Harbor 获取密钥。

    新的机器人账户在机器人账户列表中显示为 <prefix>account_name。阅读更多关于 机器人账户前缀 的信息。

管理系统机器人账户

您可以编辑、停用或删除系统机器人账户。

  1. 从管理员 机器人账户 页面,选中要更新的机器人账户旁边的复选框。
  2. 选择 操作,然后选择 编辑停用删除

deactivate or delete a robot account

刷新系统机器人账户密钥

您可以在创建机器人账户后刷新其密钥,以防您需要新的密钥。

  1. 从管理员 机器人账户 页面,选中要更新的机器人账户旁边的复选框。

  2. 选择 操作,然后选择 刷新密钥

  3. 默认情况下,Harbor 将随机生成一个新密钥,或者您可以选择启用手动重置密钥并输入 新密钥,然后输入 确认密钥。或者,您可以通过单击眼睛图标查看密钥。

    Refresh system robot account secret

  4. 单击 刷新。如果您随机创建了密钥,请下载密钥 JSON 文件或复制并粘贴其内容。

配置机器人账户的过期期限

默认情况下,机器人账户在 30 天后过期。您可以通过修改机器人账户令牌的过期期限来为机器人账户设置更长或更短的寿命。过期期限适用于所有项目中的所有机器人账户。

  1. 使用具有 Harbor 系统管理员权限的账户登录到 Harbor 界面。

  2. 转到 配置 并选择 系统设置

  3. 机器人令牌过期(天) 行中,修改机器人账户令牌过期后的天数。

    Set robot account token expiry

配置机器人账户前缀

默认情况下,机器人账户名称使用 robot$ 前缀。Harbor 使用此前缀来区分机器人账户和用户账户。系统机器人账户的全名是前缀和您在创建机器人账户时提供的名称。例如,如果您创建一个名为 test 的新机器人系统账户,则全名为 robot$test

相同的前缀用于所有机器人账户,包括系统和项目机器人账户。当您更新此值时,它将应用于所有现有和未来的系统和项目机器人账户,但 Harbor v2.1 及更早版本中创建的机器人账户将继续使用前缀 robot$

  1. 使用具有 Harbor 系统管理员权限的账户登录到 Harbor 界面。

  2. 转到 配置 并选择 系统设置

  3. 机器人名称前缀 行中,修改前缀。

    Set robot account prefix

使用系统机器人账户进行身份验证

要在自动化流程(例如脚本)中使用机器人账户,请使用 docker login 并提供机器人账户的凭据。

docker login <harbor_address>
Username: <prefix><account_name>
Password: <secret>

权限参考

下表解释了机器人账户在具有指定权限时可以执行的操作。

系统权限

权限(操作 + 资源) 能力
列出审计日志 (audit-log) 1. GET /audit-logs
读取目录 (catalog) 1. GET /v2/_catalog
读取垃圾回收 (garbage-collection) 1. GET /system/gc/{gc_id}/log
2. GET /system/gc/schedule
列出垃圾回收 (garbage-collection) 1. GET /system/gc
创建垃圾回收 (garbage-collection) 1. POST /system/gc/schedule
停止垃圾回收 (garbage-collection) 1. PUT /system/gc/{gc_id}
更新垃圾回收 (garbage-collection) 1. PUT /system/gc/schedule
列出 Job Service 监控器 (jobservice-monitor) 1. GET /jobservice/pools
2. GET /jobservice/pools/{pool_id}/workers
3. GET /jobservice/jobs/{job_id}/log
4. GET /jobservice/queues
停止 Job Service 监控器 (jobservice-monitor) 1. PUT /jobservice/jobs/{job_id}
2. PUT /jobservice/queues/{job_type}
读取标签 (label) 1. GET /labels/{global_label_id}
创建标签 (label) 1. POST /labels?scope=g
更新标签 (label) 1. PUT /labels/{global_label_id}
删除标签 (label) 1. DELETE /labels/{global_label_id}
读取预热实例 (preheat-instance) 1. POST /preheat/instances/ping
2. GET /p2p/preheat/instances/{preheat_instance_name}
列出预热实例 (preheat-instance) 1. GET /p2p/preheat/providers
2. GET /p2p/preheat/instances
创建预热实例 (preheat-instance) 1. POST /p2p/preheat/instances
更新预热实例 (preheat-instance) 1. PUT /p2p/preheat/instances/{preheat_instance_name}
删除预热实例 (preheat-instance) 1. DELETE /p2p/preheat/instances/{preheat_instance_name}
列出项目 (project) 1. GET /projects
创建项目 (project) 1. POST /projects
读取清除审计 (purge-audit) 1. GET /system/purgeaudit/{purge_id}/log
2. GET /system/purgeaudit/schedule
3. GET /system/purgeaudit/{purge_id}
列出清除审计 (purge-audit) 1. GET /system/purgeaudit
创建清除审计 (purge-audit) 1. POST /system/purgeaudit/schedule
停止清除审计 (purge-audit) 1. PUT /system/purgeaudit/{purge_id}
更新清除审计 (purge-audit) 1. PUT system/purgeaudit/schedule
读取注册中心 (registry) 1. POST /registries/ping
2. GET /registries/{id}
3. GET /registries/{id}/info
列出注册中心 (registry) 1. GET /registries
创建注册中心 (registry) 1. POST /registries
更新注册中心 (registry) 1. PUT /registries/{id}
删除注册中心 (registry) 1. DELETE /registries/{id}
读取复制 (replication) 1. GET /replication/executions/{id}
2. GET /replication/executions/{id}/tasks/{task_id}/log
列出复制 (replication) 1. GET /replication/executions
2. GET /replication/executions/{id}/tasks
创建复制 (replication) 1. POST /replication/executions
2. PUT /replication/executions/{id}
列出复制适配器 (replication-adapter) 1. GET /replication/adapters
2. GET /replication/adapterinfos
读取复制策略 (replication-policy) 1. GET /replication/policies/{id}
列出复制策略 (replication-policy) 1. GET /replication/policies
创建复制策略 (replication-policy) 1. POST /replication/policies
更新复制策略 (replication-policy) 1. PUT /replication/policies/{id}
删除复制策略 (replication-policy) 1. DELETE /replication/policies/{id}
读取全部扫描 (scan-all) 1. GET /scans/all/metrics
2. GET /scans/schedule/metrics
创建全部扫描 (scan-all) 1. POST /system/scanAll/schedule
停止全部扫描 (scan-all) 1. POST /system/scanAll/stop
更新全部扫描 (scan-all) 1. PUT /system/scanAll/schedule
读取扫描器 (scanner) 1. POST /scanners/ping
2. GET /scanners/{registration_id}
3. GET /scanners/{registration_id}/metadata
列出扫描器 (scanner) 1. GET /scanners
创建扫描器 (scanner) 1. POST /scanners
更新扫描器 (scanner) 1. PUT /scanners/{registration_id}
删除扫描器 (scanner) 1. DELETE /scanners/{registration_id}
读取安全中心 (security-hub) 1. GET /security/summary
列出安全中心 (security-hub) 1. GET /security/vul
读取系统卷 (system-volumes) 1. GET /systeminfo/volumes
列出机器人账户 1. GET /robots
创建机器人账户 1. POST /robots
读取机器人账户 1. GET /robots/{robot_id}
更新机器人账户 1. PUT /robots/{robot_id}
删除机器人账户 1. DELETE /robots/{robot_id}
创建用户 1. POST /users
读取用户 1. GET /users/{user_id}
更新用户 1. PUT /users/{user_id}
删除用户 1. DELETE /users/{user_id}
创建 LDAP 用户 1. POST /ldap/users/import
列出 LDAP 用户 1. GET /ldap/users/search
创建导出 CVE 作业 1. POST /export/cve
读取导出 CVE 执行 1. GET /export/cve/download/{execution_id}
2. GET /export/cve/execution/{execution_id}
更新配额 1. PUT /quotas/{id}
创建用户组 1. POST /usergroups
读取用户组 1. GET /usergroups/{group_id}
更新用户组 1. PUT /usergroups/{group_id}
列出用户组 1. GET /usergroups
删除用户组 1. DELETE /usergroups/{group_id}

项目权限

权限(操作 + 资源) 能力
列出附件 (accessory) 1. GET /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/accessories
读取制品 (artifact) 1. GET /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}
列出制品 (artifact) 1. GET /projects/{project_name}/repositories/{repository_name}/artifacts
创建制品 (artifact) 1. POST /projects/{project_name}/repositories/{repository_name}/artifacts
删除制品 (artifact) 1. DELETE /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}
读取制品附加信息 (artifact-addition) 1. GET /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/additions/vulnerabilities
2. GET /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/additions/{addition}
创建制品标签 (artifact-label) 1. POST /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/labels
删除制品标签 (artifact-label) 1. DELETE /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/labels/{label_id}
列出不可变标签 (immutable-tag) 1. GET /projects/{project_name_or_id}/immutabletagrules
创建不可变标签 (immutable-tag) 1. POST /projects/{project_name_or_id}/immutabletagrules
更新不可变标签 (immutable-tag) 1. PUT /projects/{project_name_or_id}/immutabletagrules/{immutable_rule_id}
删除不可变标签 (immutable-tag) 1. DELETE /projects/{project_name_or_id}/immutabletagrules/{immutable_rule_id}
读取标签 (label) 1. GET /labels/{project_label_id}
列出标签 (label) 1. GET /labels?scope=p&project_id={project_id}
创建标签 (label) 1. POST /labels?scope=p&project_id={project_id}
更新标签 (label) 1. PUT /labels/{project_label_id}
删除标签 (label) 1. DELETE /labels/{project_label_id}
列出日志 (log) 1. GET /projects/{project_name}/logs
读取项目元数据 (metadata) 1. GET /projects/{project_name_or_id}/metadatas/{meta_name}
列出项目元数据 (metadata) 1. GET /projects/{project_name_or_id}/metadatas
创建项目元数据 (metadata) 1. POST /projects/{project_name_or_id}/metadatas
更新项目元数据 (metadata) 1. PUT /projects/{project_name_or_id}/metadatas/{meta_name}
删除项目元数据 (metadata) 1. DELETE /projects/{project_name_or_id}/metadatas/{meta_name}
读取通知策略 (notification-policy) 1. GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}
2. GET /projects/{project_name_or_id}/webhook/lasttrigger
3. GET /projects/{project_name_or_id}/webhook/events
4. GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}/executions
5. GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}/executions/{execution_id}/tasks
6. GET /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}/executions/{execution_id}/tasks/{task_id}/log
列出通知策略 (notification-policy) 1. GET /projects/{project_name_or_id}/webhook/policies
2. GET /projects/{project_name_or_id}/webhook/jobs
创建通知策略 (notification-policy) 1. POST /projects/{project_name_or_id}/webhook/policies
更新通知策略 (notification-policy) 1. PUT /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}
删除通知策略 (notification-policy) 1. DELETE /projects/{project_name_or_id}/webhook/policies/{webhook_policy_id}
读取预热策略 (preheat-policy) 1. GET /projects/{project_name}/preheat/policies/{preheat_policy_name}
2. POST /projects/{project_name}/preheat/policies/{preheat_policy_name}
3. GET /projects/{project_name}/preheat/policies/{preheat_policy_name}/executions/{execution_id}
4. GET /projects/{project_name}/preheat/policies/{preheat_policy_name}/executions/{execution_id}/tasks/{task_id}/logs
列出预热策略 (preheat-policy) 1. GET /projects/{project_name}/preheat/policies
2. GET /projects/{project_name}/preheat/providers
创建预热策略 (preheat-policy) 1. POST /projects/{project_name}/preheat/policies
更新预热策略 (preheat-policy) 1. PUT /projects/{project_name}/preheat/policies/{preheat_policy_name}
2. PATCH /projects/{project_name}/preheat/policies/{preheat_policy_name}/executions/{execution_id}
删除预热策略 (preheat-policy) 1. DELETE /projects/{project_name}/preheat/policies/{preheat_policy_name}
读取项目 (project) 1. GET /projects/{project_name_or_id}
更新项目 (project) 1. PUT /projects/{project_name_or_id}
删除项目 (project) 1. DELETE /projects/{project_name_or_id}
2. GET /projects/{project_name_or_id}/_deletable
读取仓库 (repository) 1. GET /projects/{project_name}/repositories/{repository_name}
列出仓库 (repository) 1. GET /projects/{project_name}/repositories
更新仓库 (repository) 1. PUT /projects/{project_name}/repositories/{repository_name}
删除仓库 (repository) 1. DELETE /projects/{project_name}/repositories/{repository_name}
拉取仓库 (repository) 1. 从项目中拉取制品
推送仓库 (repository) 1. 将制品推送到项目中
读取扫描 (scan) 1. GET /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/scan/{report_id}/log
创建扫描 (scan) 1. POST /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/scan
停止扫描 (scan) 1. POST /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/scan/stop
读取扫描器 (scanner) 1. GET /projects/{project_name_or_id}/scanner
创建扫描器 (scanner) 1. PUT /projects/{project_name_or_id}/scanner
2. GET /projects/{project_name_or_id}/scanner/candidates
列出标签 (tag) 1. GET /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/tags
创建标签 (tag) 1. POST /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/tags
删除标签 (tag) 1. DELETE /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/tags/{tag_name}
读取标签保留策略 (tag-retention) 1. GET /retentions/{id}
2. GET /retentions/{id}/executions/{eid}/tasks/{tid}
列出标签保留策略 (tag-retention) 1. GET /retentions/{id}/executions
2. GET /retentions/{id}/executions/{eid}/tasks
创建标签保留策略 (tag-retention) 1. POST /retentions
更新标签保留策略 (tag-retention) 1. PUT /retentions/{id}
2. POST /retentions/{id}/executions
3 PATCH /retentions/{id}/executions/{eid}
删除标签保留策略 (tag-retention) 1. DELETE /retentions/{id}
列出机器人账户 1. GET /robots
创建机器人账户 1. POST /robots
读取机器人账户 1. GET /robots/{robot_id}
更新机器人账户 1. PUT /robots/{robot_id}
删除机器人账户 1. DELETE /robots/{robot_id}
添加项目成员 1. POST /projects/{project_name_or_id}/members
读取项目成员 1. GET /projects/{project_name_or_id}/members/{mid}
更新项目成员 1. PUT /projects/{project_name_or_id}/members/{mid}
删除项目成员 1. DELETE /projects/{project_name_or_id}/members/{mid}
除了配置相关的权限以及不超过创建者的权限外,在 Harbor v2.12.0 之后的系统级和项目级机器人账户可以拥有所有权限。公共 API 不包含在以上表格中,因为任何人都可以访问它们。