SSH基础知识以及配置免密登录(gitlab-runner为例)

ssh 基础知识

参考 https://www.jianshu.com/p/33461b619d53

gitlab-runner配置实战

ssh要配置当前操作用户的
比如当前是gitlab-runner在执行,ssh hello@abc
虽然是hello用户要登录到abc服务器,但是免密依然要配置的是gitlab-runner的id_rsa.pub

举个更详细的例子

在这里插入图片描述

现在是gitlab-runner在执行ssh root@xx.xx.xx.216,没有权限。

假设gitlab-runner在xx.xx.xx.123的机器上

操作如下

登录xx.xx.xx.123,进入/home/gitlab-runner/.ssh目录(因为这里是gitlab-runner用户要执行ssh,所以要进入gitlab-runner的主目录)

查看id_rsa.pub

在这里插入图片描述

然后登录xx.xx.xx.216,进入root用户的主目录/root/.ssh

复制xx.xx.xx.123服务器上的/home/gitlab-runner/.ssh/id_rsa.pub的内容
追加到xx.xx.xx.216的/root/.ssh/authorized_keys里面

注意事项

网上有一些示例都会说重新生成就是执行下面的命令

1.在主机A生产密钥对: ssh-keygen -t rsa, 会在.ssh目录下产生密钥文件
2.拷贝主机A的公钥到主机B: scp id_rsa.pub
3.将主机A的公钥加到主机B的授权列表.ssh/authorized_keys(若不存在,手动创建): cat id_rsa.pub >> authorized_keys

流程是没问题的,但是有两个很危险的操作

首先第一步,如果主机A上已经配置过ssh了,就不要在执行ssh-keygen -t rsa命令了,这个会重新生成ssh下面的文件,使得之前A配置在其他服务器上的免密失效,这里我们需要的是A主机上的当前用户的id_rsa.pub,如果有我们直接用

其次第二步,拷贝主机A的公钥到主机B: scp id_rsa.pub,这个问题会覆盖B主机原来的id_rsa.pub,所以这里尽量不要复制到B主机原来ssh目录下,我建议手动复制A主键的id_rsa.pub的值

第二步不可取,那么第三步的操作应该是修改B主机目录下的.ssh/authorized_keys,直接vim authorized_keys 然后编辑,在最后面添加

authorized_keys像下面的样子(添加了两台主机免密登录)

在这里插入图片描述

注意

scp: /data/*: Permission denied
ERROR: Job failed: exit status 1

这个问题是由于scp到的那个服务器上要被替换的文件之前是另外一个账户创建的,通过scp账户没有权限覆盖,只需要登录到要scp的服务器,删除相应的文件即可

还有一种报错

Host key verification failed.

在这里插入图片描述

这个问题是第一次ssh登录的时候需要把server的主机加入client的known_hosts里,这个过程需要手动输入yes来操作,而在runner执行过程中无法进行交互式操作,所以报错,这个只需要手动在主机上ssh登录一下就可了。

在这里插入图片描述

<think>好的,我现在需要帮用户在CentOS 7上配置GitLab RunnerSSH,而且GitLab和发布服务器在同一台机器上。首先,我得理清楚整个流程。用户可能已经安装了GitLabGitLab Runner,但需要配置SSH以便Runner能通过SSH连接到同一台服务器进行部署或其他操作。 首先,我需要确认用户的环境。根据引用[4],用户已经安装了Docker,可能使用Docker运行的GitLab Runner。引用[2]提到使用特定版本的Runner用户可能已经按照步骤安装并注册了Runner。现在需要配置SSH,可能需要生成SSH钥,配置RunnerSSH访问,以及确保Runner容器能访问宿主机的SSH服务。 第一步,生成SSH钥对。通常在宿主机上生成,然后将公钥添加到服务器的authorized_keys中。但用户的环境是同一台服务器,所以Runner容器需要能通过SSH访问宿主机本身。这里可能需要将宿主机的SSH服务配置好,允许钥登录,并且将私钥提供给Runner容器。 第二步,配置GitLab RunnerSSH访问。因为Runner可能运行在Docker容器中,需要将SSH私钥挂载到容器内。或者,在Runner的执行环境中配置SSH如,在.gitlab-ci.yml中使用ssh命令时,需要私钥可用。可能需要将私钥作为变量注入到CI/CD环境中,或者挂载到容器中。 第三步,测试SSH连接。确保Runner容器内部可以成功SSH到宿主机,无需码。可能需要调整SSH配置,比如禁用严格的主机钥检查,避第一次连接时的提示。 另外,考虑用户是否已经正确安装了GitLab Runner。根据引用[2],用户可能已经通过Docker安装了Runner,并注册到了GitLab。现在需要的是在Runner的任务中执行SSH命令到同一台宿主机。 可能的步骤包括: 1. 在宿主机生成SSH钥对,将公钥添加到~/.ssh/authorized_keys。 2. 在GitLab的项目设置中添加SSH私钥作为CI/CD变量,比如SSH_PRIVATE_KEY。 3. 配置GitLab Runner的CI任务,在脚本中安装SSH客户端,将私钥写入文件,设置权限,然后执行SSH命令。 4. 处理SSH连接时的known_hosts,避交互式提示。 此外,如果Runner容器需要访问宿主机的SSH服务,可能需要知道宿主机的IP或主机名。由于在同一台机器上,可以使用宿主机的Docker内部IP或者localhost,但要注意容器内的localhost是容器本身,不是宿主机。可能需要用宿主机的实际IP,或者使用host网络模式运行Runner容器,这样容器可以通过localhost访问宿主机。 另外,根据引用[4],用户安装Docker时使用的是阿里云的镜像,这可能会影响网络配置。不过,SSH连接主要关注的是正确的钥和网络可达性。 总结步骤: 1. 生成SSH钥对,添加公钥到宿主机的authorized_keys。 2. 将私钥作为GitLab CI/CD变量。 3. 在.gitlab-ci.yml脚本中配置SSH,处理钥和known_hosts。 4. 确保Runner容器能够连接到宿主机的SSH服务,可能需要使用宿主机的IP而非localhost。 需要验证这些步骤是否正确,以及是否有遗漏的地方。如,是否需要修改sshd_config的配置允许钥登录,或者是否SELinux、防火墙会影响连接。用户的环境是CentOS 7,可能需要检查防火墙规则,开放SSH端口,或者禁用防火墙临时测试。 可能遇到的问题包括权限问题(如.ssh目录权限不正确)、私钥格式问题(比如在CI中生成时需要正确的格式),或者网络配置问题(如容器无法访问宿主机的SSH端口)。 最后,确保整个过程安全,私钥在GitLab中存储为敏感变量,避泄露。</think>### 分步指南:在 CentOS 7 上为同一服务器配置 GitLab Runner SSH #### 1. **生成 SSH 钥对** 在宿主机(即 GitLab 和发布服务器所在的 CentOS 7 系统)上生成钥对: ```bash ssh-keygen -t ed25519 -f ~/.gitlab-runner-ssh -N "" cat ~/.gitlab-runner-ssh.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ``` - 钥文件命名为 `.gitlab-runner-ssh`,公钥添加到 `authorized_keys`[^1]。 #### 2. **配置 GitLab Runner 容器** 若 GitLab Runner 通过 Docker 运行(如引用[2]),需挂载 SSH 钥并配置容器网络: ```bash docker run -d --name gitlab-runner \ --restart always \ --network host \ # 使用 host 网络模式,容器直接访问宿主机网络 -v /opt/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/.gitlab-runner-ssh:/home/gitlab-runner/.ssh/id_ed25519 \ # 挂载私钥 gitlab/gitlab-runner:v16.2.0 ``` - `--network host` 使容器通过 `localhost` 直接访问宿主机 SSH 服务[^2]。 - 挂载私钥到容器内用户的 `.ssh` 目录,确保权限为 `600`。 #### 3. **配置 GitLab CI/CD 变量** 将私钥内容添加到 GitLab 项目的 CI/CD 变量: 1. 复制私钥内容: ```bash cat ~/.gitlab-runner-ssh ``` 2. 在 GitLab 项目设置中,添加变量 `SSH_PRIVATE_KEY`,值为私钥内容(选择 **Masked** 和 **Protected**)。 #### 4. **编写 `.gitlab-ci.yml` 脚本** 在项目仓库中添加以下配置,确保 SSH 连接可用: ```yaml deploy_job: script: - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - echo "Host *" >> ~/.ssh/config - echo " StrictHostKeyChecking no" >> ~/.ssh/config # 禁用主机验证提示 - ssh localhost "echo 'SSH连接成功!'" ``` - 脚本将私钥写入容器内,并配置宽松的 SSH 连接规则(仅限测试环境)[^4]。 #### 5. **验证与调试** - **检查容器内钥权限**: ```bash docker exec -it gitlab-runner ls -al /home/gitlab-runner/.ssh ``` - **手动测试 SSH 连接**: ```bash docker exec -it gitlab-runner ssh localhost ``` - **查看日志**: ```bash docker logs gitlab-runner ``` #### 6. **安全加固(可选)** - **限制 SSH 用户权限**:在宿主机上为 Runner 创建专用用户,而非直接使用 root。 - **启用防火墙规则**:仅允许 `127.0.0.1` 访问 SSH 端口(若 Runner 与宿主机共用网络): ```bash firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="22" accept' firewall-cmd --reload ``` ### 关键问题解决 - **SSH 连接超时**:检查宿主机防火墙或 SELinux 是否阻止连接。临时禁用 SELinux 测试: ```bash setenforce 0 ``` - **钥权限错误**:确保容器内私钥文件权限为 `600`。 - **容器网络问题**:若未使用 `host` 网络模式,需通过宿主机实际 IP(如 `192.168.1.x`)连接,而非 `localhost`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值