本文是笔者查阅网上资料做的总结,关于SSH原理,什么是对称加密和非对称加密,本文不过多介绍。这里介绍一下SHH的工作过程、配制方法,可能出现的问题及解决方法。
说明:本文中涉及的例子,SSH客户端为:本地主机A,SSH服务器为:服务器B
SSH协议采用C-S(客户端-服务器端)架构进行双方的身份验证以及数据的加密。
服务器端组件监听指定的端口,负责安全连接的建立、对连接方的身份认证、以及为通过身份认证的用户建立正确的环境。
客户端负责发起最初的TCP握手、安全连接的建立、验证服务器的身份与之前记录中的一致、并将自己的验证信息提供给服务器。
一个SSH会话的建立过程分为两个阶段。第一阶段,双方沟通并同意建立一个加密连接通道以供后续信息传输用。第二阶段,对请求接入的用户进行身份验证以确定服务器端是否要给该用户开放访问权限。
当客户端发起TCP连接时,服务器端返回信息说明自己支持的协议版本,如果客户端上支持的协议与之匹配,则连接继续。服务器会提供自己的公共主机密钥(public host key)以让客户端确认自己访问的是正确的机器。
然后,双方采用一种Diffie-Hellman算法共同为该会话建立密钥。每一方的一部分私有数据,加上来自对方的一部分公共数据,通过这种算法计算,能够得出完全相同的密钥用于本次会话。
整个会话的通讯内容都使用该密钥进行加密。这个阶段使用的公钥/私钥对与用户验证身份用的SSH密钥是完全无关的。
经典Diffie-Hellman算法的计算步骤如下:
这个共享密钥的加密方式被称为二进制数据包协议(binary packet protocol)。该过程能够让双方平等的参与密钥生成的过程,而不是由单方掌握。这种共享密钥生成的过程是安全的,双方没有交换过任何未经加密的信息。
生成的密钥是对称式密钥,一方用于加密信息的密钥等同于另一方用于解密信息的密钥,而任何第三方由于不持有该密钥,是无法解密双方传递的内容的。
会话加密通道建立后,SSH开始进入用户认证阶段。
下一步,服务器验证用户身份以决定是否准许其访问。验证有不同的方式,选择的验证方式取决于服务器的支持。
最简单的验证是密码验证:服务器要求客户端输入密码,客户端输入的密码经过上述的通道加密传输给服务器。
虽然密码是加密过的,然而该方法仍然不被推荐,因为用户经常为了省事而使用过于简单的密码,而这类密码很容易就能够被自动化脚本破解。
最流行的验证方式是SSH密钥对,这也是当前最推荐的方式。SSH密钥对是非对称密钥,私钥和公钥分别用于不同的功能。
公钥用于加密,而私钥用于解密。公钥可以随意上传、共享,因为公钥的流通并不会危及到私钥的保密性。
SSH密钥对的验证过程起始于上一部分加密通道建立之后,其具体执行步骤如下:
简单来说,服务器端用公钥加密信息,客户端用私钥解密信息以证明自己持有私钥。该过程同时使用了对称加密和非对称加密,两种方式各有自己的功用。
命令如下:
用户名:为要登录的服务器B中已存在的用户账户名
IP地址:为服务器B的IP地址
-p 端口号:用来指定端口号,默认为22
第一次登录时,会提示如下提示:
大概意思是说,你正在访问的主机不能验证它的真实性,它的RSA key(当前访问主机的公钥)指纹是怎样的,你确定要继续连接吗?
输入yes继续,会提示,已永久把当前访问主机的RSA key添加到了已知主机文件(用户目录下,ssh 文件夹中的knwon_hosts文件)中。之后再次 SSH 登录就不再有该提示了。
接着,输入登录账户的密码即可。
SSH 密码登录,需要服务器开启密码验证权限,编辑服务器SSH配置命令如下:
在 sshd_config 文件中,Protocol 2 下面 #PasswordAuthentication yes,将前面的#号去掉,保存退出。
公钥登录,即免密码登录。避免的每次登录都要输入的麻烦,也防止了中间人攻击。是SSH远程登录最常用的登录方式。
提示输入密钥对名称,直接回车,使用默认名称即可;
提示输入密码(使用私钥时,要输入密码),直接回车,不使用密码即可。
首先,登录服务器B,在进行下面的 *** 作。
找到 #PubkeyAuthentication yes,删除 #号,保存退出。
重启 ssh 服务
也可指定验证私钥:
本地主机A,生成密钥对后:
sudo vim /etc/selinux/config
基于SSH协议开发的一款远程管理服务程序通常被称为SSH服务器(SSH Server),它是一种可以在远程计算机上运行的软件,用于提供SSH协议的访问和管理功能。SSH(Secure Shell)是一种安全的网络协议,它可以通过加密通信方式实现远程计算机与客户端之间的安全通信。基于SSH协议开发的远程管理服务程序,可以使用SSH协议连接到远程计算机,并提供以下功能:
1 远程登录:用户可以通过SSH协议连接到远程计算机,并执行命令或 *** 作远程计算机。这种连接方式可以保证通信过程中不被窃听或篡改。
2 文件传输:SSH服务器可以支持SCP(Secure Copy)或SFTP(SSH File Transfer Protocol)文件传输协议,用户可以使用这些协议将文件从本地计算机传输到远程计算机或从远程计算机下载文件到本地计算机。
3 用户管理:SSH服务器可以通过配置访问控制列表(ACL)限制用户访问权限,还可以限制用户对系统的 *** 作权限,并记录所有的用户登录和 *** 作日志。
4 系统管理:SSH服务器可以提供一些系统管理工具,例如远程终端程序、进程监控、系统日志查看等。
一些常见的基于SSH协议开发的远程管理服务程序包括OpenSSH、PuTTY SSH、Tectia SSH等。这些程序通常在Linux、Unix和Windows等平台上都可以运行。
在 《ssh工具,开发者必须有所了解》 这篇文章中,概念性介绍了ssh知识,可对大多数人来说,会使用ssh工具才更有用,比如对我来说,成功登录ssh服务器后,才有动力继续了解其他ssh功能。
ssh登录通常有两种方式,分别是口令验证和密钥对验证,口令登录非常简单,运行 ssh root@localhost,然后输入正确口令后就能成功登录。
可你知道背后的细节吗?这也是我写这篇文章的目的,ssh协议和tls协议一样,都组合了很多密码学算法,用于解决网络安全问题,掌握ssh协议的原理对于理解密码学很有帮助,密码学算法有很多,比如AES对称密钥算法,公开密钥算法(DH密钥协商算法,RSA非对称加密算法),MAC算法,Hash算法,如果你大概了解这些算法,理解ssh协议会相对简单一点,否则可能会比较吃力。
了解ssh协议另外一个好处就是,遇到问题的时候就不会慌乱,也能够更安全的使用ssh。
本文先介绍相对简单的ssh口令登录,在介绍之前,先了解ssh协议的三个子协议:
这三个协议中,最后一个相对复杂,本文主要讲解前二个协议。
ssh口令登录主要分为两个阶段,第一阶段是协商出一个会话密钥,在客户端和服务器端之间构建一条安全的通道。第二个阶段在这条通道上验证客户端登录权限。
ssh服务器默认绑定在22端口,监听客户端的请求,在启动的时候会生成一个密钥对(公钥和私钥),一般是RSA算法密钥对,在第一阶段会将公钥发送给ssh客户端,主要让客户端确认ssh服务器端的身份,除了这个作用,我 目前 没有看到这个密钥对还有其他作用。
为什么说“目前”呢?因为我并没有看 ssh rfc 文档,是通过 wireshark 抓包了解 ssh 协议的,从概念性上 猜测 ssh协议原理。
先上一张图,看看ssh登录产生了那些包,大家可以wireshark抓包,然后过滤出ssh包(不看 tcp 包):
其中红线就是ssh登录的第一阶段,该阶段一般输入 ssh root@localhost 就能产生。
另外蓝色就是ssh登录的第二阶段,输入口令后就会产生这些包。
接下去我们先介绍第一个阶段发生了什么:
1:客户端首先发送一个连接请求(序号4),告诉服务器端它目前支持的ssh版本号。
2:服务器端也响应ssh版本号,双方一般协商出的版本号是 ssh v2
3:客户端初始化连接(序号9),进行密钥交换,告诉客户端其支持的各类算法,如下图:
4:然后服务器端也告诉客户端其支持的各类算法(序号10),最后协商出一致的算法,并发送服务器公开密钥对的公钥。
5:如果第一次ssh登录,ssh客户端会提示用户确认服务器公开密钥对公钥的指纹(即公钥的md5值),当然这个在网络包中是体现不出来的。
如果你第一次ssh登录,会出现下图:
如果你确认该指纹就是你想连接ssh服务器的,那么就会将公钥保存到 ~/ssh/known_hosts 文件中,下一次你再登录的时候,ssh客户端发现指纹和ssh服务器发送的指纹是一致的,就不会再让你确认了。
指纹非常重要,后面我会再说。
6:客户端接下去就是要发送 DH 算法密钥对的公钥了(序号13),注意这个密钥对和服务器公开密钥对不是一回事
不管是客户端还是服务器端,各自保留自己的 DH 密钥对的私钥,并将自己的 DH 密钥对的公钥发送给对方,这样双方就会协商出最终的会话密钥(用于对称加密)。
DH 算法就不多描述了,有兴趣可以看看我的书《深入浅出>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)