在GitLab存储SSH私钥的仓库变量

12

使用GitLab CI,我想将生产代码推送到远程Web主机。

为了连接SSH,我正在将密钥对的私钥存储在我的GitLab仓库的变量中。我还将公钥复制到服务器的authorized keys中。这是我的.gitlab-ci.yml的一部分。

image: ubuntu

before_script:
  # Setup SSH credentials and known host
  - which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
  - mkdir -p ~/.ssh
  - echo "$SSH_PRIVATE" | tr -d '\r' > ~/.ssh/id_rsa
  - chmod 700 ~/.ssh/id_rsa
  - eval "$(ssh-agent -s)"
  - ssh-add ~/.ssh/id_rsa
  - echo "$SSH_KNOWN_HOSTS"
  - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts

这种方法是可行的,但我对其安全性有所质疑。我的私钥能否通过这种方式得到保障?还有其他方法可以达到我想要的结果吗?

编辑:我特别在质疑生产环境中此方法的安全性。

2个回答

1
官方示例在gitlab-examples/ssh-private-key中。
.gitlab-ci.yml使用一个自定义环境变量SSH_PRIVATE_KEY,如"如何使用GitLab CI/CD简化您的智能家居配置/为SSH访问准备服务器(和GitLab)"中所述。
只要该变量被屏蔽, 这应该就足够安全了。

sneaky评论中建议创建一个预处理文件:

cat id_rsa | base64 -w0 insert into script-part of your job in .gitlab-ci.yml:

mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" | \
  base64 -d > ${SSH_KEY_FILE} && chmod 0600 ${SSH_KEY_FILE}

4
如果包含换行符,你无法对包含私钥的变量进行遮蔽。 - Clockwork
2
@Clockwork 确实如此。但需要进行预处理和后处理,就像 https://dev59.com/N1UM5IYBdhLWcg3wAsjv#54675024 中所述。 - VonC
1
创建预处理文件:cat id_rsa | base64 -w0 将以下代码插入到 .gitlab-ci.yml 中的脚本部分: mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" | base64 -d > ${SSH_KEY_FILE} && chmod 0600 ${SSH_KEY_FILE} - sneaky
1
@sneaky 谢谢你的建议。我已经将你的评论包含在答案中,以增加其可见性。 - VonC
@RickMoritz 你是指这篇文章吗?点击这里 - undefined
显示剩余2条评论

0

我已经通过在源上编码值,然后在运行时解码来绕过此问题。

在我的 Makefile 中:

KEY=$(shell base64 -w 0 private-key-file)

在 .gitlab-ci.yml 文件中:

- echo $SSH_PRIVATE_KEY | base64 -d |tr -d '\r' | ssh-add -

然后我调用 gitlab-runner

gitlab-runner exec docker ${build_target} --env 'SSH_PRIVATE_KEY=${KEY}'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接