前言

公司主要使用 Go 语言做项目,有一些 Gitlab 私有仓库需要引用,在做 CI 时,要自行配置权限以获取代码。

最近发现各个项目组在做 CI 遇到仓库权限问题时的解决方式不尽相同,有用 Project Token 的,有用 Deploy Keys 的。

了解一下。

使用

原理就两种,一是 SSH 方式拉取代码,二是 http 方式。

SSH 方式

本机生成 SSH Key,将公钥从 Gitlab 页面添加进去,注意选择下过期时间即可。

如何生成 Key?打开终端输入:

# ED25519
ssh-keygen -t ed25519 -C "<comment>"
# 2048-bit RSA
ssh-keygen -t rsa -b 2048 -C "<comment>"

任选其一即可,照着提示,一步步输入回车,就可以看到在你指定的文件夹下生成了两个文件,一个公钥一个私钥文件,例:

ed25519 # 私钥
ed25519.pub # 公钥

克隆仓库,使用 SSH 链接即可

git clone ssh://git@gitlab.com/<namespace>/<project_name>.git

http 方式

打开 Gitlab 网页,新增 Token,注意选择 Token 权限范围,只是拉取代码,read_repository 即可。生成后的 Token 值要自己保存好,因为只能看到一次。

clone 仓库

git clone https://<name>:<token>@gitlab.com/<namespace>/<project_name>.git

每次都要输入 name, token 比较麻烦,可以全局配置 git

git config --global url."https://<name>:<token>@gitlab.com".insteadOf "https://gitlab.com"

不同权限介绍

Gitlab 上有几个入口

  1. Personal Access Tokens
  2. Personal SSH Keys
  3. Group Access Tokens
  4. Group Deploy Tokens
  5. Repository Access Tokens
  6. Repository Deploy Tokens
  7. Repository Deploy Keys

1. Personal Access Tokens

用户个人的 Token,创建时可以选择多种权限,一般建议 token 的权限给小点,够用就行,例如:需要拉取代码,只给 read_repository 权限即可。

入口: User Settings -> Access Tokens

请添加图片描述

2. Personal SSH Keys

SSH 密钥主要用于身份验证,以允许用户通过 SSH 协议访问 Git 仓库。不同于个人访问 TokenSSH 密钥并没有直接的权限范围概念,而是通过用户的 GitLab 账户权限和项目的访问级别来控制访问。

SSH 密钥本身的作用是加密通信的一部分,用来证明你是谁,而具体的仓库访问权限则由 GitLab 的用户和项目设置来决定。

入口: User Settings -> SSH Keys

请添加图片描述

3. Group Access Tokens

同个人的 Token 的使用方式一致,只是其作用域只在当前组内生效。

入口: Group Settings -> Access Tokens

请添加图片描述

4. Group Deploy Tokens

看名字就知道是专门为部署使用的,个人理解跟 Group Access Tokens 差不太多,只是其权限范围少了很多,只有 read_repository, read_registry, write_registry 权限,不能访问 Gitlab API 来执行特定操作。

入口: Group Settings -> Repository -> Deploy Tokens

请添加图片描述

5. Repository Access Tokens

Token 使用方式一致,只是权限范围更小了,其作用域只在当项目内生效。

入口: Project Settings -> Access Tokens

请添加图片描述

6. Repository Deploy Tokens

Group Deploy Tokens 相似,只是权限范围更小了,其作用域只在当项目内生效。

入口: Project Settings -> Repository -> Deploy Tokens

请添加图片描述

7. Repository Deploy Keys

SSH 使用方式一致。部署机器上生成 SSH 密钥对,新增 Deploy Key,将公钥放入即可。

入口: Project Settings -> Repository -> Deploy Keys

请添加图片描述

个人理解:Deploy Key 就相当于一台机器,项目若是允许机器获取代码,在本项目中把它添加进来即可。

Deploy Keys 一个比较特殊的点:在该项目中生成的 Deploy Key,可以被其他项目添加,即使不在组内也可以。

请添加图片描述

CI Docker 镜像中 Go 拉取私有仓库的代码

主要是配置拉取代码的权限,两种方式:

  1. 使用 token
RUN git config --global url."https://$name:$token@gitlab.com".insteadOf "https://gitlab.com"

RUN go env -w GOPRIVATE=gitlab.com && go mod tidy
  1. 使用 ssh key
# ssh key 安全考虑,一般放在环境变量中传入
RUN mkdir ~/.ssh && echo $id_rsa > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
# 处理错误:Host key verification failed.
RUN echo "Host *\n\tStrictHostKeyChecking no\n\tCheckHostIP no\n" > ~/.ssh/config

RUN git config --global url."ssh://git@gitlab.com".insteadOf "https://gitlab.com"

RUN go env -w GOPRIVATE=gitlab.com && go mod tidy

其他

GPG(GNU Privacy Guard) Keys 密钥主要用于签名和验证 Git 提交,而不是直接用于拉取代码。GPG 密钥的主要作用是确保提交的完整性和来源的真实性,而不是作为访问控制机制。

总结

本篇介绍了 Gitlab 的几种认证方式,其入口虽然不同,但原理基本一致,就两种方式:SSHToken

使用 Token 时需注意权限最小化(尽量为 Token 分配最小必要的权限,避免不必要的安全风险)。

不管使用哪种方式,定期审查很重要,需要定期审查 令牌/Key 的使用情况,确保它们仍然符合需求,并及时撤销不再需要的令牌。

最后简单介绍了一下在做 CIDocker 镜像中如何用 Go 拉取私有仓库的代码,环境配好即可。需要注意 TokenSSH Key 不要以明文方式输入,通常使用环境变量。

参考

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐