Linux 下使用 SSH 免密登陆的不一样姿式

1、背景概述

ssh 这个命令算做是学习 Linux 时最基础的命令之一了。以前使用 ssh 时,都是经过用户名 + 密码的形式进行登陆的。以前写 TransFile-Shell 小工具[[1]](https://gitee.com/lwx19960428...,曾经经过服务端配置客户端公钥的方式进行免密登陆,这两天给朋友解决问题时,接触到 Jenkins 执行远程脚本的功能,涉及到了 SSH-Agent 作代理请求的功能,如今把几种方式都做为笔记写下来。html

2、SSH 介绍

根据百度百科介绍:SSH 是创建在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登陆会话和其余网络服务提供安全性的协议。利用 SSH 协议能够有效防止远程管理过程当中的信息泄露问题[[2]](https://baike.baidu.com/item/...linux

从客户端来看,SSH 有两种形式的安全验证方式:git

  • 基于口令(密码)的验证方式
  • 基于密钥的验证方式

口令验证因没法保证正在链接的服务器就是真正想要的服务器,因此可能存在服务端被冒充(中间人攻击)的方式。而密钥验证则是依赖客户端服务端之间的公私钥加解密方式,故不存在中间人攻击(中间人没有任何一端的私钥),但同时整个过程须要相对较长的时间。shell

具体的 ssh 相关资料可参照后续的参考连接进行了解。segmentfault

3、实验环境

进行下述实验步骤前,请确认服务器已开启 SSH 服务,且相关端口的网络策略已经开通。安全

角色 主机名 IP 地址 系统
客户机 A local-vmware-01 192.168.36.129 CentOS 7.4
客户机 B local-vmware-03 192.168.36.133 CentOS 7.4
服务机 local-vmware-02 192.168.36.132 Ubuntu 18.04 LTS

4、服务端配置公钥信任来实现免密登陆

未配置公私钥对时,客户机 A 经过 SSH 登录时,登录提示须要密码。bash

ssh dcos@192.168.36.132

img1

为了免密,一路回车,生成 SSH 要用的公私钥对,此步骤在客户机 A 执行。根据提示,生成出来的公私钥文件位于 ~/.ssh 目录下,其中 id_rsa 为私钥,id_rsa.pub 为公钥。服务器

ssh-keygen -t rsa

img2

将客户机 A 的公钥内容复制出来,粘贴至服务机的 ~/.ssh/authorized_keys 文件中。网络

# local-vmware-01 上执行
cat ~/.ssh/id_rsa.pub

# local-vmware-02 上执行
# 若是不存在 ~/.ssh 此目录,则须要先行手动建立,建立完注意同时赋权 700
mkdir ~/.ssh && chmod 700 ~/.ssh
# 文件不存在,则 Vim 将自动建立该文件;如已存在,注意与以前记录间增长换行
vi ~/.ssh/authorized_keys
# 同时,此文件须要赋权 600 权限,不容许其余用户修改
chmod 600 ~/.ssh/authorized_keys

再次经过 SSH 登陆,再也不须要密码便可从新登陆,使用 scp 命令等也是同样,再也不须要输入密码。至此,经过添加客户机公钥信任来实现免密登陆已经完成。ssh

img3

5、客户端经过私钥身份信息实现登陆

上述方式能够很方便的经过公私钥的配置进行 SSH 的免密登陆,但当咱们没法拿到客户机的公钥时,就须要经过 ssh-agent 进行代理登陆。

什么都不作配置,在客户机 B 上经过 SSH 访问,提示须要输入密码。

img4

由于客户机 A 已配置好了公钥信任,接下来咱们将在客户机 B 上经过 ssh-agent 的形式来进行代理登陆。

将客户机 A 的 id_rsa 私钥文件上传到客户机 B 中,同时设置其权限为 600,以上传到家目录为例。

# local-vmware-03 上执行
chmod 600 ~/id_rsa

(一)经过 ssh-agent 形式进行代理登陆

经过以下命令启动 ssh-agent 服务、增长身份密钥、登陆认证等步骤,可不用密码登录服务机。

# 启动ssh-agent服务
ssh-agent
# 启动ssh-agent bash服务
ssh-agent bash --login -i
# 增长私钥文件
ssh-add ~/id_rsa
# 从新SSH进行登陆,再也不须要输入密码
ssh dcos@192.168.36.132

img5

(二)经过 ssh -i 形式进行代理登陆

以前的 ssh 命令登陆至关因而增长了默认的 -i ~/.ssh/id_rsa 参数,当一台 Linux 机器生成了多个 ssh 密钥时,就须要经过 -i 参数的形式来指定使用哪一个私钥文件参与到 ssh 链接的过程。同理,这种形式则是至关于自定义了 id_rsa 文件的位置,并未有太大的亮点。

# local-vmware-03 上执行
ssh -i ~/id_rsa dcos@192.168.36.132

img6

6、踩坑记录

在 Jenkins 中配置 ssh-agent 时,每一步都配置的没有问题,直接在 Jenkins 服务器上用 ssh-agent 工具也能够登陆,可是每次构建时都提示 Host key verification failed. 的报错。

通过分析,得出结论,是因为第一次登陆时须要输入 yes / no 致使的认证失败。要想解决此问题,可经过在链接命令上增长 -o "StrictHostKeyChecking no" 来解决此问题[[3]](https://blog.csdn.net/ITzhang...

ssh -o "StrictHostKeyChecking no" dcos@192.168.36.132

img7

7、总结

经过上述几种免密登陆方式的配置,咱们能够 Get 到如下几个知识点:

  • SSH 认证与身份文件牢牢相关,不一样的服务器使用同一份私钥文件是能够的。
  • 私钥文件极其重要,必定要保管好本身的私钥文件。
  • 遇到坑的时候,多查一些资料,以及相关的 Linux man 文档,总会爬出来的。

8、参考资料

[1] https://gitee.com/lwx19960428...

[2] https://baike.baidu.com/item/...

[3] https://blog.csdn.net/ITzhang...

[4] https://wangchujiang.com/linu...

相关文章
相关标签/搜索