Help us learn about your current experience with the documentation. Take the survey.

外部授权控制

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab Self-Managed, GitLab Dedicated

在高度管控的环境中,可能需要由外部服务根据项目分类和用户权限来控制访问策略。GitLab 提供了一种方式,让您通过自定义服务检查项目授权。

配置并启用外部服务后,当访问项目时,GitLab 会向该服务发送包含用户信息和项目分类标签的请求。若服务返回已知响应,结果将被缓存六小时。

启用外部授权后,GitLab 会进一步阻止渲染跨项目数据的页面和功能,包括:

  • 仪表盘下的多数页面(活动、里程碑、代码片段、指派给我的合并请求、指派给我的议题、待办事项列表)。
  • 特定群组下的页面(活动、贡献分析、议题、议题看板、标签、里程碑、合并请求)。
  • 全局搜索和群组搜索将被禁用。

此举旨在避免对外部授权服务发起过多并发请求。

无论访问被允许或拒绝,相关操作都会记录在 external-policy-access-control.log 日志文件中。关于 GitLab 保留的日志详情,请参阅 Linux 软件包文档

使用自签名证书进行 TLS 身份验证时,需确保 CA 证书受 OpenSSL 安装信任。若通过 Linux 软件包安装 GitLab,请参考 Linux 软件包文档 安装自定义 CA。也可通过 openssl version -d 命令查询自定义证书的安装位置。

配置

管理员可按以下步骤启用外部授权服务:

  1. 在左侧边栏底部,选择 管理员区域
  2. 选择 设置 > 通用
  3. 展开 外部授权
  4. 填写相关字段。
  5. 选择 保存更改

允许部署令牌和部署密钥使用外部授权

您可配置实例,允许通过 部署令牌部署密钥 进行 Git 操作时使用外部授权。

前置条件:

  • 必须使用未配置服务 URL 的分类标签进行外部授权。

允许部署令牌和密钥使用授权的步骤:

  1. 在左侧边栏底部,选择 管理员区域
  2. 选择 设置 > 通用
  3. 展开 外部授权,并执行以下操作:
    • 将服务 URL 字段留空。
    • 勾选 允许部署令牌和部署密钥使用外部授权
  4. 选择 保存更改

启用外部授权后,部署令牌将无法访问容器或软件包仓库。若您使用部署令牌访问这些仓库,此功能会导致令牌失效。如需使用令牌访问容器或软件包仓库,请禁用外部授权。

GitLab 如何连接外部授权服务

GitLab 发起访问请求时,会向外部服务发送包含以下内容的 JSON POST 请求:

{
  "user_identifier": "[email protected]",
  "project_classification_label": "project-label",
  "user_ldap_dn": "CN=Jane Doe,CN=admin,DC=acme",  // 可选字段
  "identities": [
    { "provider": "ldap", "extern_uid": "CN=Jane Doe,CN=admin,DC=acme" },
    { "provider": "bitbucket", "extern_uid": "2435223452345" }
  ]
}

user_ldap_dn 为可选字段,仅在用户通过 LDAP 登录时发送。

identities 包含与用户关联的所有身份信息。若用户无关联身份,此字段为空数组。

当外部授权服务返回状态码 200 时,用户获得访问权限;返回状态码 401 或 403 时,访问被拒绝。无论何种情况,请求结果均缓存六小时。

拒绝访问时,可在 JSON 响应体中可选添加 reason 字段:

{
  "reason": "您无权访问此项目。"
}

除 200、401、403 外的任何状态码也会拒绝用户访问,但响应不会被缓存。

若服务超时(500 毫秒后),将显示消息“外部策略服务器无响应”。

分类标签

您可在项目的 设置 > 通用 > 通用项目设置 页面“分类标签”框中使用自定义标签。若项目未指定分类标签,则使用 全局设置 中定义的默认标签。

所有项目页面的右上角会显示该标签。

项目页面右上角显示带开锁图标的红色覆盖标签。