使用SSH密钥与GitLab CI/CD
GitLab目前没有内置支持在构建环境(GitLab Runner运行的地方)中管理SSH密钥。
SSH密钥在以下情况下很有用:
- 您需要签出内部子模块
- 您希望使用包管理器(例如,Bundler)下载私有包。
- 您希望将应用程序部署到您自己的服务器,或者,例如Heroku
- 您希望从构建环境向远程服务器执行SSH命令
- 您希望将文件从构建环境rsync到远程服务器
如果上述任何一种情况让您想起,那么您很可能需要一个SSH密钥。
最受广泛支持的方法是通过扩展您的.gitlab-ci.yml
,这是一个解决方案,适用于任何类型的遗嘱执行人(Docker、shell等)。
它是如何工作的
- 在本地创建一个新的SSH密钥对ssh - keygen
- 将私钥添加为秘密的变量到你的项目
- 运行ssh-agent在作业期间加载私钥。
- 将公钥复制到您想要访问的服务器(通常在
~ / . ssh / authorized_keys
)或添加为a部署的关键如果您正在访问私有的GitLab存储库。
注意:注意:私钥将不会显示在作业跟踪中,除非启用调试跟踪。您可能还需要检查管道的可见性。
使用Docker执行器时的SSH密钥
当您的CI/CD作业在Docker容器内运行(意味着包含环境)并且您希望将代码部署在私有服务器中时,您需要一种访问它的方法。这就是SSH密钥对派上用场的地方。
首先需要创建一个SSH密钥对。有关更多信息,请按照说明进行操作生成SSH密钥。不将密码短语添加到SSH密钥,或
before_script
将提示它。新建一个秘密的变量。作为关键输入名称
SSH_PRIVATE_KEY
在价值字段粘贴您的内容私人您之前创建的密钥。修改您的
.gitlab-ci.yml
与一个before_script
行动。在下面的示例中,假设一个基于Debian的映像。根据您的需要进行编辑:before_script:# #如果没有安装ssh-agent, Docker需要安装它。##(如果使用基于rpm的映像,将apt-get更改为yum)# #-'哪一个ssh-agent||(apt-get更新可能是& &apt-get安装openssh-client可能是)”# ###运行ssh-agent(在构建环境中)# #-Eval $(ssh-agent -s)# #将存储在SSH_PRIVATE_KEY变量中的SSH密钥添加到代理存储中我们正在使用tr来修复行结尾,这使得ed25519键工作##没有额外的base64编码。# # # note_48526556。https://gitlab.com/gitlab-examples/ssh-private-key/issues/1# #-echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null# ###创建SSH目录并赋予它正确的权限# #-Mkdir -p ~/.ssh-Chmod 700 ~/.ssh# ###可选,如果您将使用任何Git命令,设置用户名和##和电子邮件。# ##- git配置——全局用户。电子邮件“user@example.com”#- git config—global User .name“用户名”
注意:注意:的
before_script
可以全局设置,也可以按作业设置。确保私有服务器完成SSH主机密钥校验。
最后一步,添加公共从您在第一步中创建的服务到您希望从构建环境中访问的服务的密钥。如果您正在访问私有的GitLab存储库,则需要将其添加为部署的关键。
就是这样!现在,您可以访问构建环境中的私有服务器或存储库。
使用Shell执行器时的SSH密钥
如果您使用的是Shell执行器而不是Docker,那么设置SSH密钥会更容易。
您可以从安装了GitLab Runner的机器生成SSH密钥,并将该密钥用于在该机器上运行的所有项目。
首先,您需要登录到运行作业的服务器。
然后从终端登录为
gitlab-runner
用户:Sudo - Sudo - lab-runner
按照说明生成SSH密钥对生成SSH密钥。不将密码短语添加到SSH密钥,或
before_script
将提示它。最后一步,添加公共从您先前创建的密钥到您希望从构建环境中访问的服务的密钥。如果您正在访问私有的GitLab存储库,则需要将其添加为部署的关键。
完成后,尝试登录到远程服务器以接受指纹:
ssh example.com
要访问GitLab.com上的存储库,您可以使用git@gitlab.com
。
验证SSH主机密钥
检查私有服务器自己的公钥是一种很好的做法,以确保您不会成为中间人攻击的目标。如果发生任何可疑的事情,您将注意到它,因为作业将失败(如果公钥不匹配,SSH连接将失败)。
要查找服务器的主机密钥,请运行- keyscan
来自可信网络的命令(理想情况下,来自私有服务器本身):
##使用域名- keyscan example.com##或者使用IP- keyscan为1.2.3.4
新建一个秘密的变量与SSH_KNOWN_HOSTS
作为“Key”,并作为“Value”添加的输出- keyscan
。
注意:注意:如果需要连接多台服务器,则需要收集所有服务器主机密钥价值对于变量,每行一个键。
提示:提示:通过使用秘密变量而不是- keyscan
直接在.gitlab-ci.yml
,它的好处是你不必改变.gitlab-ci.yml
如果主机域名因某些原因改变。此外,这些值是由您预定义的,这意味着如果主机密钥突然更改,CI/CD作业将失败,您就会知道服务器或网络出了问题。
既然SSH_KNOWN_HOSTS
变量之外,还创建了的内容.gitlab-ci.yml
以上是你还需要补充的内容:
before_script:# ###假设您创建了SSH_KNOWN_HOSTS变量,取消注释##下面两行。# #-echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts . echo-Chmod 644 ~/.ssh/known_hosts . Chmod 644# #或者,使用ssh-keyscan扫描您的私有服务器的密钥。##将example.com替换为您的私有服务器域名。再重复一遍如果要连接多个服务器,请使用##命令。# ##- ssh-keyscan example.com >> ~/.ssh/known_hosts#- chmod 644 ~/.ssh/known_hosts . sh# #您可以选择禁用主机密钥检查。注意添加这个你很容易受到中间人攻击。##警告:如果与shell一起使用,则只能与Docker执行器一起使用##您将覆盖用户的SSH配置。# ##- '[[] -f /。dockerenv]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
示例项目
我们建立了一个SSH项目示例为了你的方便GitLab.com使用我们的公共资源共享的跑步者。
想黑进去吗?只需分叉它,提交并推送您的更改。过不了多久,就会有一个公众竞选者挑选出这些变化,然后工作就开始了。