SSH技术介绍和Xshell公钥远程登陆

SSH简介

传统的网络服务程序,比如FTPPOPTelnet,本质上都是不安全的,因为它们在网络上用明文传送数据、用户账号和用户口令,很容易受到中间人攻击方式的攻击,攻击者会冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。

为了满足安全性的需求,IETF的网络工作小组制定了Secure Shell(缩写为SSH),这是一项创建在应用层传输层基础上的安全协议,为计算机上的Shell提供安全的传输和使用环境。

SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄漏问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。

本文将会重点讨论SSH中用到的加密算法和建立安全连接的过程。

(为了把题目中的Xshell写出来,具体ssh介绍放在最后面了)

使用密钥登录分为3步:

1、生成密钥(公钥与私钥);

2、放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中;

3、配置ssh客户端使用密钥登录。

1.1 生成密钥(公钥与私钥)

打开Xshell,在菜单栏点击“工具”,在弹出的菜单中选择“(新建用户密钥生成向导)”,弹出“新建用户秘钥生成向导”对话框,在“秘钥类型”项选择“RSA”公钥加密算法,“秘钥长度”选择任意密钥长度,长度越长,安全性越高,点击“下一步”,等待密钥生成

继续下一步,在“秘钥名称”中输入Key的文件名称,我这里为“id_rsa_2048(2)”;在“加密密码”处输入一个密码比如12345678用于加密私钥,并再次输入密码确认,点击“下一步”,密钥生成完毕(Public key Format选择SSH2-OpenSSH格式),这里显示的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到文件,如下图。

点击“保存为文件”按钮,将公钥(Public key)保存到磁盘,文件名为“xxxxxxx”,备用。最后点击“完成”即可。

公钥保存完后,接下来为私钥文件。点击“导出”,导出为私钥文件,用来打开刚才的公钥。请妥善保管。

点击“保存”后,会弹出一个框,输入刚才设置的密码12345678.在点击“确定”即可。

1.2 放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中

上面的步骤只是生成了公钥和私钥的过程,接下来就是要将刚才生成的公钥放到要管理的服务器上。

使用到Xshell登录到服务器,进入到“/root/.ssh/”目录,使用Xfile将公钥传到服务器上。

然后运行如下命令,将公钥(Public Key)导入到“authorized_keys”文件:

[[email protected] ~]# cd .ssh/
[[email protected] .ssh]# ls
authorized_keys known_hosts
[[email protected] .ssh]# rz -E
rz waiting to receive.
[[email protected] .ssh]# ls
authorized_keys known_hosts laomao.pub
[[email protected] .ssh]# cp authorized_keys authorized_keys.bak
[[email protected] .ssh]# cat laomao.pub >authorized_keys
[[email protected] .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAYEAybjy7/DVWxXm4lcXFA+x0bgBMi+aQ6zIzyBfFSKJEMhAhs/MxbKHOl1c1GwzPSAKLAHoR8UZSQO7QQcYKqeb8cNWR8f9NGNBCJs+e6Fpl7BvNPKfNrixnq+gT5VIz77u2RXU74JBOuwsgaEHtCU5DQhIfvAoUe64qCBuY5J6JHJV3bBlMXnqxrJQO4+4hH0dHyVzc5wmP0ngnah/6za64hk3Nd1tdER7na701geZTR5N4OqeCep+TtPcbT4RKQ1qJ5L67ET5x3uYGEKZDK4tOL2kluePd2XHRQg1qcXl87f7HkZiLIicgLU8/rB+LyUOJzywTVHvmTWTPDS1u6RmAQSLh/4VU0vEks7bIj7xTCaKjuO6UgHvxPZL1BQWj8tY6fzerdndVM5bORkAHgZ67ZJK6X+Zui4fHTkxSQ/gvzOgBylhSL3Tyc1PRlVO8L7bl9r36x7hlACHr0BrqpenrkxdMmrR4i4RoOrYaijXoPhvg5uWH+rSeUbZDDEw7S/F[[email protected] .ssh]#
[[email protected] .ssh]# chmod 600 authorized_keys
[[email protected] .ssh]#

1.3 配置ssh客户端使用密钥登录

打开Xshell,点击“新建”按钮,弹出“New Session Properties”对话框,在“连接”栏目中,输入刚刚配置好公钥(Public Key)的IP地址和端口,如下图所示:

在用户身份认证的窗口输入认证方法为“public key”

从用户秘钥出选择刚生成的私钥文件,并在下面的密码框中输入刚才设置的密码123456(可以和系统登陆密码不一样)

现在就可以使用公钥登陆了,浏览选择用户秘钥位置,然后输入上面刚刚设置的密码“123456”,点击“确定”,即可登陆。经过了上面的ssh秘钥配置后,我们就可以通过在Publish over SSH插件中使用秘钥来管理服务器了。注意,服务器上存放的是上面生成的公钥,Jenkins上存放的是生成的私钥文件。

使用到的技术

为了保证信息传输的安全性,SSH使用了对称加密、非对称加密和散列等技术。

对称加密

对称密钥加密又称为对称加密、私钥加密、共享密钥加密,是密码学中一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。

SSH使用对称密钥加密整个连接过程中传输的信息。值得注意的是,用户自己创建的public/private密钥对仅仅用于验证,不会用在加密连接上。对称加密允许对密码进行身份验证,以防止第三方窥探。

共享密钥通过密钥交换算法生成,它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。客户端和服务端都参与了这个过程,过程的细节将在后面阐述。

生成的密钥将用来加密这次会话过程中客户端和服务端传输的数据。这个过程会在验证客户身份之前完成。

SSH支持多种对称密钥算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客户端和服务端可以配置采用算法的列表。客户端列表中第一个能被服务端支持的算法将被采用。

比如在Ubuntu 14.04上,客户端和服务端默认的配置如下:aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,[email protected],[email protected],[email protected],aes128-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour。 也就是说,如果两台Ubuntu 14.04采用默认配置,它们总是会采用aes128-ctr算法来加密连接。

非对称加密

在非对称加密方法中,需要一对密钥,一个是私钥,一个是公钥。这两个密钥数学相关。用公钥加密后所得的信息,只能用私钥才能解密。如果知道了其中一个,并不能计算另外一个。因此,如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。

SSH在一些地方使用了非对称加密。

在密钥交换过程中使用到了非对称加密。在这个阶段,客户端和服务端生成临时密钥对,并且交换公钥来生成共享密钥。

在身份验证的过程中也使用了非对称加密。SSH密钥对用来向服务端验证客户端身份。客户端创建一对密钥,然后将公钥上传到远程服务器上,写入文件~/.ssh/authorized_keys。

在创建共享密钥后,客户端必须向服务端证明身份。服务端会使用文件中的公钥加密一段信息,并将加密后的信息发送给客户端。如果客户端可以能够破解这段信息,那么就能够证明自己拥有相关的私钥。之后服务端会为客户端设置shell环境。

散列

散列是电脑科学中一种对资料的处理方法,它通过某种特定的算法将要检索的项与涌来检索的索引关联起来,生成一种便于搜索的数据结构(散列表)。它也常用做一种资讯安全的方法,由一串资料中经过散列算法计算出来的资料指纹,来识别档案和资料是否有被篡改。

SSH主要使用了散列消息认证码(Keyed-hash message authentication code,缩写为HMAC),来确认消息没有被篡改。

上面提到的对称加密协商过程中,会使用消息认证码(MAC)算法。这个算法会从客户端支持的算法中选出。

在密钥协商完成后,所有的消息都必须携带MAC,用于通信双方验证消息的一致性。MAC值由共享密钥,消息的分组序列和实际消息内容计算得到。

在对称加密区域之外,MAC本身作为分组的最后部分被发送。研究者通常建议先机密数据,然后计算MAC

SSH工作流程

SSH协议采用客户端-服务端模型对两方进行身份验证,并对它们之间的数据进行加密。

服务端在指定端口监听连接请求。它负责协商安全连接,认证连接方,并为客户端生成正确的shell环境。

客户端负责协商安全连接,验证服务器的身份是否与以前记录的信息相匹配,并提供凭证进行身份验证。

SSH会话分为两个阶段。第一个是同意和建立加密来保护未来的沟通。第二个阶段是对用户进行身份验证,并发现是否应该授予对服务器的访问权限。

会话加密协商

当客户端发起请求后,服务端返回支持的协议版本。如果客户端可以匹配其中一个协议版本,则连接继续。服务端会提供它的公共主机密钥,客户端可以用这个密钥来验证服务端是否合法。

此时,通信双方采用迪菲-赫尔曼算法来协商会话密钥。

该算法的大致过程如下:

  1. 双方协定共享一个大素数。

  2. 双方协定一个加密算法。
  3. 双方各自生成一个素数,并保密。这个素数将作为私钥。
  4. 双方使用协定的算法,由各自的私钥和共享的素数计算得到公钥。
  5. 双方交换生成的公钥。
  6. 双方使用各自的私钥,另外一方的公钥和共享的素数,计算得到一个共享密钥。双方计算得到的共享密钥应该是一样的。
  7. 使用共享密钥加密后面的会话。

用于其余连接的共享密钥加密被称为二进制数据包协议。上述过程允许双方平等地参与生成共享密钥。

生成的密钥是对称密钥,这意味着用于加密消息的密钥也可以用于解密。其目的是将后面的通信包装在不能被外部人员解密的加密隧道中。

在生成会话密钥后,就开始进行用户身份验证。

验证用户身份

根据服务器接受的方式,有几种不同的方法可用于身份验证。

最简单的方法是密码验证,其中服务器要求客户端输入尝试登陆账号的密码。密码是通过协商加密发送的。

虽然密码被加密,但由于密码的复杂性受到限制,因此通常不建议使用此方法。与其他身份验证的方法相比,自动脚本相对容易攻破正常长度的密码。

最为推荐的选择是使用SSH密钥对。SSH密钥对是非对称密钥。

公钥用于加密只能用私钥解密的数据。公钥可以自由共享,因为没有从公钥中导出私钥的方法。

验证流程如下:

  1. 客户端首先向服务端发送密钥对的ID。

  2. 服务端检查文件authorized_keys寻找该ID的公钥。
  3. 如果找到,服务端生成一个随机数,并使用公钥加密这个数。
  4. 服务端将加密后的信息发送给客户端。
  5. 如果客户端拥有对应的私钥,那么就能使用私钥解密消息,得到服务端生成的随机数。
  6. 客户端使用解密后的数和会话使用的共享密钥得到一个值,然后计算这个值的MD5散列值。
  7. 客户端将这个MD5散列值发送回服务端。
  8. 服务端用会话共享密钥和生成的随机值计算得到自己的MD5散列值。然后比较客户端传回的值和自身生成的值。如果匹配,则证明客户端拥有私钥,客户端验证通过。

可以看到,密钥的不对称性允许服务端使用公钥加密消息给客户端。然后,客户端可以通过正确解密消息来证明它拥有私钥。

原文地址:https://www.cnblogs.com/linmeng97blogwzhh/p/9531423.html

时间: 2024-10-30 01:07:56

SSH技术介绍和Xshell公钥远程登陆的相关文章

Linux修改SSH端口,并禁止Root远程登陆

1.更改ssh远程登录端口: #vi /etc/ssh/ssh_config将port改为你想要的端口,例如8888.默认是#port 22,把#号删掉改为 port 8888即可. 还要更改以下文件,更改方法同上:#vi /etc/ssh/sshd_config 2.增加一个普通权限的用户: #useradd 新用户#passwd 新用户 3.禁止ROOT远程SSH登录: #vi /etc/ssh/sshd_config将PermitRootLogin yes一行改为:PermitRootLo

ssh实现远程登陆以及使用技巧

SSH简介 SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.常用于远程登录,以及用户之间进行资料拷贝. 利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.SSH 最初是 UNIX 系统上的一个程序,后来又迅速扩展到其他操作平台.SSH 在正确使用时可弥补网络中的漏洞.SSH 客户端适用于多

(转)Linux SSH配置和禁止Root远程登陆设置

原文 一.修改vi /etc/ssh/sshd_config 文件 1.修改默认端口:默认Port为22,并且已经注释掉了:修改是把注释去掉,并修改成其它的端口. 2.禁止root用户远程登陆:修改PermitRootLogin,默认为yes且注释掉了:修改是把注释去掉,并改成no. 3.PermitEmptyPasswords   no不允许空密码用户login 二.ssh的公钥认证配置: 修改vi /etc/ssh/sshd_config 文件 RSAAuthentication yes  

SSH 远程登陆

2019-03-10 20:41:39 一.什么是SSH 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露. 最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑.1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置. 需要指出的是,

使用 Python ssh 远程登陆服务器的最佳方案

首发自公.众.号:Python编程时光 在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果. 在 shell 环境中,我们是这样子做的. $ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l" 然后你会发现,你的输出有很多你并不需要,但是又不去不掉的一些信息(也许有方法,请留言交流),类似这样

SSH:远程登陆

SSH用于计算机之间的加密登录的前提是公钥为真,所以存在中间人攻击中间人攻击:与https协议不同,SSH协议的公钥是没有CA公证的,当对公钥的请求被中间截获时,中间人可以发出伪造公钥干坏事而不被识破 为了避免中间人攻击,SSH有两种应对方法,口令登录和公钥登录(这里只介绍如何保证公钥为真,至于之后的登陆验证方法很多)口令登录:私钥于远程主机中,本地对公钥发出请求,当然我们无法保证接实际收到的公钥来自何方,因此在连接过程中会出现警告,当我们确认公钥可信任后,该公钥将会备录在本地,下次对该公钥的接

windows使用xshell免密码登陆远程Linux服务器教程

windows使用xshell免密码登陆远程Linux服务器教程 1.使用xshell自带工具生成私钥 步骤: 2.在linux服务器端生成密钥 1.生成服务器端密钥命令 #ssh-keygen (保存位置默认,全部回车即可.) 3.复制本地密钥到远程linux服务器端 1.复制本地密钥到远程linux服务器端 2.把本地密钥命名为authorized_keys #cat 本地密钥 >> authorized_keys 3.放在~/.ssh/下且权限为600. #chmod 600 autho

使用RSA公钥实现无密码远程登陆另一台机器

在Linux 系统下,可以使用ssh客户端远程登陆到另一台Linux系统的机器,正常情况下每次在输入远程登陆命令后,都会强制要求输入远程机器的用户登陆密码,就很烦,如果将本地用户的公钥传给远程用户就可以不需要输入登录密码即可登陆,具体做法如下: 首先假定有两个用户:本地用户python和远程登陆用户seeker,要实现用户python通过ssh客户端无密码连接seeker,首先需要生成seeker用户的RSA公钥和私钥,具体做法如下: 在python用户打开终端输入命令: python@pyth

Linux-Deepin 下开启SSH远程登陆

#### 关于deepin系统安装ssh后,root超级用户登录报错的完美解决方案! 最近刚刚接触到deepin,觉得,wow,除了mac,还有这么好看的非win系统,而且第测出那个Linux,宽容度很高,非常适合我这种比较喜欢折腾的人,于是下载了deepin15版本并将其当作虚拟机成功安装了,安装以后,发现没有root用户?好吧,基本Linux发行版安装好以后都这样,于是给root用户添加密码: <p>sudo passwd root</p> 首先会提示输入当前用户的密码,然后会