将 SSH 私钥存储在 GitLab 存储库变量中

Jus*_*aas 12 ssh gitlab

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

为了使用 SSH 连接,我将密钥对的私钥存储在我的 GitLab 存储库的变量中。我还将公钥复制到服务器的授权密钥中。这是我的(一部分).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
Run Code Online (Sandbox Code Playgroud)

这个方法可行,但我质疑它的安全性。这样我的私钥安全吗?我还能如何实现我正在寻找的结果?

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

Von*_*onC 2

官方示例位于gitlab-examples/ssh-private-key

.gitlab-ci.yml使用自定义环境变量,如“ 如何使用 GitLab CI/CD 简化智能家居配置/准备服务器(和 GitLab)以进行 SSH 访问SSH_PRIVATE_KEY”中所述。

只要该变量被屏蔽,这应该足够安全。


偷偷摸摸地在评论中建议创建一个预处理文件:

cat id_rsa | base64 -w0script-part将您的工作插入.gitlab-ci.yml

mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" | \
  base64 -d > ${SSH_KEY_FILE} && chmod 0600 ${SSH_KEY_FILE}
Run Code Online (Sandbox Code Playgroud)

  • 如果包含私钥的变量包含换行符,则无法对其进行屏蔽。 (5认同)
  • @发条确实如此。并非没有预处理和后处理,如 /sf/answers/3827251711/ 中所示。 (2认同)
  • 创建预处理文件:`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}` (2认同)