SSH工作原理详解

一、简介

SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,目前SSH协议已经被全世界广泛使用,大多数设备都支持SSH功能。

二、默认端口

  • 当SSH应用于STelnet,SFTP以及SCP时,使用的默认SSH端口都是22。
  • 当SSH应用于NETCONF时,可以指定SSH端口是22或者830。
  • SSH端口支持修改,更改后当前所有的连接都会断开,SSH服务器开始侦听新的端口。

三、为什么要用SSH

  • SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。
  • SSH和telnet、ftp等协议主要的区别在于安全性

常见的加密方式

  • 对称加密(也称为秘钥加密),指加密解密使用同一套秘钥
    Client
    在这里插入图片描述
    Server
    在这里插入图片描述
    在这里插入图片描述

1、对称加密的加密强度高,很难破解
2、但是在实际应用过程中不得不面临一个棘手的问题:如何安全的保存密钥呢?尤其是考虑到数量庞大的Client端,很难保证密钥不被泄露。
3、一旦一个Client端的密钥被窃据,那么整个系统的安全性也就不复存在。

  • 非对称加密,非对称加密有两个密钥:“公钥”和“私钥”

两个密钥的特性:公钥加密后的密文,只能通过对应的私钥进行解密。而通过公钥推理出私钥的可能性微乎其微。

登录流程
在这里插入图片描述

在这里插入图片描述

1、远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。
2、Client使用这个公钥,将密码进行加密。
3、Client将加密的密码发送给Server端。
4、远程Server用自己的私钥,解密登录密码,然后验证其合法性。
5、若验证结果,给Client相应的响应。

私钥是Server端独有,这就保证了Client的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性。

但是上述流程中Client端如何保证接受到的公钥就是目标Server端的?如果一个攻击者中途拦截Client的登录请求,向其发送自己的公钥,Client端用攻击者的公钥进行数据加密。攻击者接收到加密信息后再用自己的私钥进行解密,不就窃取了Client的登录信息了吗?这就是所谓的中间人攻击
在这里插入图片描述
SSH的加密方式

  • 基于口令的认证
    1、通过Client端自己对公钥进行确认。通常在第一次登录的时候,系统会出现下面提示信息
The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
# 无法确认主机ssh-server.example.com(12.18.429.21)的真实性,不过知道它的公钥指纹,是否继续连接?

2、输入yes后

Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts. 
Password: (enter password) 
# 该host已被确认,并被追加到文件known_hosts中,然后就需要输入密码,一般默认为空
  • 基于公钥的认证
    在这里插入图片描述
    1、Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
    2、Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey®
    ,然后将加密后信息发送给Client。
    3、Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
    4、Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
    5、Server端会最后比较Digest1和Digest2是否相同,完成认证过程。

在这里插入图片描述

四、SSH实践

  • SSH服务器在指定的端口侦听客户端的连接请求,在客户端向服务器发起连接请求后,双方建立一个TCP连接。
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

ssh-keygen是用于生产密钥的工具。

-t:指定生成密钥类型(rsa、dsa、ecdsa等)
-P:指定passphrase,用于确保私钥的安全
-f:指定存放密钥的文件(公钥文件默认和私钥同目录下,不同的是,存放公钥的文件名需要加上后缀.pub)

在这里插入图片描述
1、id_rsa:保存私钥
2、id_rsa.pub:保存公钥
3、authorized_keys:保存已授权的客户端公钥
4、known_hosts:保存已认证的远程主机ID,存储是已认证的远程主机host key,每个SSH Server都有一个secret, unique ID, called a host key。

登录操作

# 以用户名user,登录远程主机host
$ ssh user@host
 
# 本地用户和远程用户相同,则用户名可省去
$ ssh host
 
# SSH默认端口22,可以用参数p修改端口
$ ssh -p 2017 user@host

known_hosts起到的作用,这个文件主要是通过Client和Server的双向认证,从而避免中间人(man-in-the-middle attack)攻击,每次Client向Server发起连接的时候,不仅仅Server要验证Client的合法性,Client同样也需要验证Server的身份,SSH client就是通过known_hosts中的host key来验证Server的身份的。

猜你喜欢

转载自blog.csdn.net/weixin_43587784/article/details/129621516
今日推荐