Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)

前言

公司主要使用 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 链接即可

shell 复制代码
git clone ssh://git@gitlab.com/<namespace>/<project_name>.git

http 方式

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

clone 仓库

shell 复制代码
git clone https://<name>:<token>@gitlab.com/<namespace>/<project_name>.git

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

shell 复制代码
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
shell 复制代码
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
shell 复制代码
# 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 不要以明文方式输入,通常使用环境变量。

参考

相关推荐
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
xixingzhe218 小时前
gitlab角色、权限
gitlab
Source、20 小时前
gitlab和jenkins连接
运维·gitlab·jenkins
27669582921 天前
阿里1688 阿里滑块 231滑块 x5sec分析
java·python·go·验证码·1688·阿里滑块·231滑块
公西雒2 天前
关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题
ci/cd·docker·gitlab·qemu·dotnet
Moment2 天前
在 NodeJs 中如何通过子进程与 Golang 进行 IPC 通信 🙄🙄🙄
前端·后端·go
todoitbo2 天前
gitlab-runner中搭建nvm、nrm以及优化maven打包
java·gitlab·maven
唐僧洗头爱飘柔95273 天前
(Go基础)变量与常量?字面量与变量的较量!
开发语言·后端·golang·go·go语言初上手
cqbzcsq3 天前
Nginx简易配置将内网网站ssh转发到外网
运维·nginx·ssh
黑心萝卜三条杠3 天前
【Go语言】深入理解Go语言:并发、内存管理和垃圾回收
google·程序员·go