使用 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
这个方法可行,但我质疑它的安全性。这样我的私钥安全吗?我还能如何实现我正在寻找的结果?
编辑:我特别质疑这种方法在生产环境中的安全性。
官方示例位于 gitlab-examples/ssh-private-key
.gitlab-ci.yml
使用自定义环境变量SSH_PRIVATE_KEY
,如“如何使用 GitLab CI/CD 简化智能家居配置/准备服务器(和 GitLab)以进行 SSH 访问”中所述。
只要变量被屏蔽,这应该足够安全。
插入到cat id_rsa | base64 -w0
中您工作的script-part
:.gitlab-ci.yml
mkdir -p ~/.ssh && echo "$SSH_PRIVATE_KEY" | \ base64 -d > ${SSH_KEY_FILE} && chmod 0600 ${SSH_KEY_FILE}
我已经能够通过在源上编码值然后动态解码来绕过这个问题。
在我的 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}'
image: ubuntu:latest # 替换为你想要的 Docker 镜像
阶段:
执行脚本: 阶段:执行脚本 脚本: - ssh -i "${PRIVATE_KEY}" "${USERNAME}@${HOSTNAME}" "sh /home/demo/print-perfecto/script.sh"
在gitlab中添加变量:
SSH_PRIVATE - ssh-keygen -> cp public-key to paste auth-key -> cp private file then paste in variables.
HOSTNAME - ip address
USERNAME - username
SSH_KNOWS_HOST - type in local or server -> (ssh-keyscan -H you-ip) - few line output comes - take all output cp and save in variables.