前言
公司主要使用 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
上有几个入口
- Personal Access Tokens
- Personal SSH Keys
- Group Access Tokens
- Group Deploy Tokens
- Repository Access Tokens
- Repository Deploy Tokens
- Repository Deploy Keys
1. Personal Access Tokens
用户个人的 Token
,创建时可以选择多种权限,一般建议 token
的权限给小点,够用就行,例如:需要拉取代码,只给 read_repository
权限即可。
入口: User Settings -> Access Tokens
2. Personal SSH Keys
SSH
密钥主要用于身份验证,以允许用户通过 SSH
协议访问 Git
仓库。不同于个人访问 Token
,SSH
密钥并没有直接的权限范围概念,而是通过用户的 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
拉取私有仓库的代码
主要是配置拉取代码的权限,两种方式:
- 使用 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
- 使用 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
的几种认证方式,其入口虽然不同,但原理基本一致,就两种方式:SSH
和 Token
。
使用 Token
时需注意权限最小化(尽量为 Token
分配最小必要的权限,避免不必要的安全风险)。
不管使用哪种方式,定期审查很重要,需要定期审查 令牌/Key 的使用情况,确保它们仍然符合需求,并及时撤销不再需要的令牌。
最后简单介绍了一下在做 CI
时 Docker
镜像中如何用 Go
拉取私有仓库的代码,环境配好即可。需要注意 Token
和 SSH Key
不要以明文方式输入,通常使用环境变量。