新的CI作业权限模型

在GitLab 8.12中引入。

GitLab 8.12完全重新设计了工作权限系统。你可以找到所有的讨论和所有我们的关注时,选择当前的问题的方法# 18994


作业权限应该与触发作业的用户的权限紧密集成。

这样做的原因是:

  • 我们已经有了一个权限系统:用户的组和项目成员。
  • 我们已经完全知道谁在触发一个任务(使用)git推,使用web UI,执行触发器)。
  • 我们已经知道用户被允许做什么。
  • 我们对由用户触发的作业使用用户权限。
  • 它为进一步加强用户权限提供了很多可能性,比如只允许特定用户访问运行程序或使用安全的变量和环境。
  • 您的作业可以访问您作为用户可以访问的所有内容,这既简单又方便。
  • 现在使用的是短期唯一令牌,允许在作业期间访问并最大限度地提高安全性。

使用新的行为,任何由用户触发的作业也会被标记为其权限。当用户执行git推或者通过web UI更改文件,通常会创建一个新的管道。该管道将被标记为由推送器创建(本地推送或通过UI),并且在此管道中创建的任何作业都将具有推送器的权限。

这使我们能够很容易地评估所有项目的访问权限Git子或者正在使用推动者也可以访问的容器映像。该权限仅授予作业正在运行的时间。作业完成后,访问被撤销。

用户类型

值得注意的是,我们有几种类型的用户:

  • 管理员:由管理员创建的CI作业不能访问所有的GitLab项目,而只能访问管理员所属的项目和项目的容器映像。这意味着,如果一个项目是公共的或内部用户无论如何都可以访问,但如果一个项目是私有的,管理员必须是它的成员,才能通过另一个项目的作业访问它。

  • 外部用户:由创建的CI作业外部用户将只能访问用户至少具有报告器访问权限的项目。默认情况下,这将排除访问所有内部项目的可能性。

这使我们能够使CI和权限系统更值得信赖。让我们考虑以下场景:

  1. 你是一家公司的雇员。您的公司有许多托管在私有存储库中的内部工具,并且您有多个使用这些存储库的CI作业。

  2. 你邀请了一个新人外部用户。由该用户创建的CI作业没有访问内部存储库的权限,因为该用户也没有从GitLab内部访问的权限。作为雇员,您必须为该用户授予显式访问权限。这使我们能够防止意外的数据泄漏。

工作牌

为每个作业生成一个唯一的作业令牌,它允许用户访问创建该作业的用户通常可以访问的所有项目。

我们试图确保这个令牌不会泄露:

  1. 保护所有API端点不公开作业令牌。
  2. 在作业日志中屏蔽作业令牌。
  3. 允许使用作业令牌只有作业正在运行时。

然而,这带来了一个关于跑步者安全的问题。为了确保这个令牌不会泄漏,你还应该确保以最安全的方式配置你的runner,避免以下情况:

  1. Docker的任何用法享有特权的如果机器被重复使用,Mode是有风险的。
  2. 使用壳牌执行器,因为作业在同一台机器上运行。

通过使用不安全的GitLab Runner配置,您允许恶意开发人员窃取其他作业的令牌。

管道触发器

自9.0年管道触发器支持新的权限模型。新的触发器模拟它们关联的用户,包括它们对项目的访问和它们的项目权限。要迁移触发器以使用新的权限模型,请使用获得所有权

在GitLab 8.12之前

在GitLab 8.12之前的版本中,所有的CI作业都会使用CI Runner的令牌来签出项目源。

项目的运行者令牌是一个令牌,您可以在项目的设置>管道而且只能访问那个项目。它可以用于注册分配给项目的新的特定runner,并检出项目源。它也可以与该项目的GitLab容器注册表一起使用,允许从CI作业中提取和推送Docker映像。


GitLab将创建一个特殊的checkout URL,如下所示:

https://gitlab-ci-token: < project-runners-token > / gitlab.com/gitlab-org/gitlab-ce.git

然后用户也可以在他们的CI作业中使用它,所有与Docker相关的命令都可以与GitLab容器注册表进行交互。例如:

docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com

使用单个令牌有多重安全隐患:

  • 任何对可以运行CI作业的项目具有开发访问权限的人都可以读取令牌,从而允许开发人员为该项目注册任何特定的Runner。
  • 令牌将只允许访问项目的源,禁止访问任何其他项目。
  • 该令牌没有过期,并且是多用途的:用于签出源,用于注册特定的运行程序,以及用于访问具有读写权限的项目容器注册表。

所有这些导致了在GitLab 8.12中引入的作业的新权限模型。

使用新的CI作业权限模型

使用新的作业权限模型,现在有一种简单的方法可以访问项目中所有依赖的源代码。这样,我们可以:

  1. 访问项目的依赖存储库
  2. 访问项目的Git子
  3. 访问私有容器映像
  4. 访问项目和子模块的LFS对象

下面您可以看到使用新权限模型所需的先决条件,以及它如何与托管在容器注册表上的Git子模块和私有Docker映像一起工作。

使用新权限模型的先决条件

有了新的权限模型,您的作业有时可能会失败。这很可能是因为您的项目试图访问其他项目的源代码,而您没有适当的权限。在作业日志中查找有关403或禁止访问消息的信息。

简而言之,如果遇到任何问题,您需要这样做。

作为管理员:

  • 500错误你需要更新GitLab主力至少0.8.2。这是自动完成的Omnibus安装,您需要检查手动用于从源代码安装。
  • 500错误检查你是否有另一个web代理坐在NGINX前面(HAProxy, Apache等)。这可能是一个好主意,让GitLab使用内部的NGINX web服务器,而不是完全禁用它。看到这样的评论举个例子。
  • 403错误:您需要确保您的安装具有启用HTTP(S)克隆。对HTTP(S)的支持现在是一种要求通过GitLab CI克隆所有源代码。

作为用户:

  • 确保你是你想要访问的小组或项目的成员。作为管理员,您可以通过模拟用户来验证这一点,并重试失败的作业,以验证一切是否正确。

依赖的库

工作环境变量CI_JOB_TOKEN可用于验证依赖存储库的任何克隆。例如:

git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/myuser/mydependentrepo

它也可以用于系统范围的身份验证(只在docker容器中这样做,它会覆盖~/.netrc):

echo -e "machine gitlab.com\nlogin gitlab-ci-token\npassword ${CI_JOB_TOKEN}" > ~/.netrc

Git子

要使用GitLab CI正确配置子模块,请阅读Git子模块文档

容器注册表

通过更新权限模型,我们还扩展了对私有项目访问容器注册表的支持。

注:

  • 1.8之前的GitLab Runner版本不包含引入的权限更改。这使得图片:指令不与私人项目自动工作,它需要在Runner的主机上手动配置一个预定义的帐户(例如管理员的个人帐户与为此目的明确创建的访问令牌)。这个问题在GitLab Runner 1.8的最新变化中得到了解决,它通过构建数据接收GitLab凭据。
  • 从GitLab 8.12开始,如果有的话2足总在您的帐户中启用,您需要通过一个个人访问令牌而不是你的密码,以便登录到GitLab的容器注册表。

作业可以访问通常可以访问的所有容器映像。唯一的含义是,您可以将作业推送到为其触发的项目的Container Registry。

下面是一个示例用法:

测试:脚本:- docker login -u giitlab -ci-token -p $CI_JOB_TOKEN $CI_REGISTRY . log- docker pull $CI_REGISTRY/group/other-project:latest- docker运行$CI_REGISTRY/group/other-project:latest
Baidu
map