SSH

SSH原理

SSH简介

  • SSH称为安全外壳协议,是一种用于在不安全网络上进行安全远程登录和实现其他安全网络服务的协议。
  • SSH协议由三个组件构成:SSH传输层协议,SSH用户认证协议,SSH连接协议.。
    在这里插入图片描述

SSH传输层协议

  • SSH传输层协议是一个安全传输协议。SSH传输层通常建立在TCP/IP连接上,但也可以在任何其他可靠的数据流上建立。
  • SSH传输层协议协商了所有的密钥交换算法,公钥算法,对称加密算法,消息认证算法等。
    在这里插入图片描述

SSH用户认证协议

  • SSH用户认证协议为服务器提供客户端的用户鉴别。它运行在传输层协议上。
  • SSH用户认证协议提供两种认证方法:口令认证和公钥认证。
    • 口令认证:客户端通过用户名和密码登录到服务器,完成用户认证。
    • 公钥认证:服务器通过公钥解密客户端的数字签名,完成用户认证。
      在这里插入图片描述

SSH工作原理

在整个通讯过程中,为实现SSH的安全连接,服务器端与客户端要经历如下五个阶段。

版本协商阶段(传输层协议)

版本协商阶段:SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本。
在这里插入图片描述

  • 服务端打开端口22,等待客户连接。客户端向服务端发起TCP连接,双方完成握手并建立连接。
  • 客户端向服务端发送第一个报文,包括版本标志字符串,格式为“协议版本号 次协议版本号 软件版本号”。
  • 服务器收到报文后,解析协议版本号,如果客户端的协议版本号比自己的低,且服务端能支持客户端的低版本,就使用客户端的协议号,否则使用自己的版本号。

算法协商阶段(传输层协议)

算法协商阶段:SSH支持多种加密算法,双方根据本段与对端支持的算法,协商出最终使用的加密算法。
在这里插入图片描述

  • 算法协商过程:从客户端的算法列表取出第一个算法,服务器在自身的算法列表中查找,若匹配上相同的算法,则协商成功,继续协商下一种算法;否则继续从客户端的该种算法列表中取出下一个算法,在服务器端的算法列表中匹配,直到匹配成功。

密钥交换阶段

密钥交换阶段:通过密钥交换算法生成会话密钥,此后双方的会话均通过会话密钥加密。
在这里插入图片描述
密钥交换过程:

  • 客户端和服务器首先约定两个公开的质数p和g。
  • 客户端和服务器各自随机产生一个数Xc,Xs,作为自己的私钥。
  • 各自计算出自己的公钥Yc,Ys。
  • 根据公私钥计算出加密用的会话密钥。

注意:

  • 具体的密钥交换算法为DH算法,在密钥交换过程中私钥Xc,Xs始终是保密不传播的。
  • 该阶段产生的公私钥仅用于产生会话密钥,与后续用户认证无关。密钥交换阶段完成后,后续所有报文交互均为会话密钥加密过的报文。

用户认证阶段(用户认证协议)

用户认证阶段:SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证。

  • 口令认证。
    在这里插入图片描述
  • 公钥认证。
    在这里插入图片描述

会话交互阶段(连接协议)

会话交互阶段:认证通过后,服务器端和客户端进行信息的交互。
在这里插入图片描述

  • 通道类型包括:会话通道,x11通道,转发的TCP-IP通道,非转发的(直连的)TCP-IP通道。

Paramiko简介

Paramiko是Python实现SSHv2协议的模块,它支持口令认证和公钥认证。它可以实现安全的远程命令执行、文件传输等功能。

Paramiko组件架构

在这里插入图片描述

  • Channel类:该类用于创建在SSH Transport上的安全通道,包含执行命令,请求x11会话,发送数据,打开交互式会话等方法。
  • Message类:SSH Message是字节流。该类对字符串、整数、bools和无限精度整数(Python中称为long)的某些组合进行编码。包含向流中写入字节,提取字节等方法。
  • Packetizer类:数据包处理类。包含检查握手,获取Channel ID等方法。
  • Transport类:该类用于在现有套接字或类套接字对象上创建一个Transport会话对象。包含公钥认证,打开Channel通道等方法。
  • SFTPClient类:该类通过一个打开的SSH Transport会话创建SFTP会话通道并执行远程文件操作。包含文件上传,文件下载等方法。
  • SSHClient类:SSHClient类是与SSH服务器会话的高级表示。该类集成了Transport,Channel和SFTPClient类。包含建立连接,打开交互式会话等方法。
  • SSH Agent类:该类用于SSH代理。
  • Host keys类:该类与OpenSSH know——hosts文件相关,用于创建一个host keys对象。
  • Key handling类:该类用于创建对应密钥类型的实例,如RSA密钥,DSS(DAS)密钥。

Paramiko使用流程图

在这里插入图片描述

Transport类及其方法介绍

  • Transport类:一个SSH Transport连接到一个流(通常为套接字),协商加密会话,进行认证。后续可在加密会话上创建通道。多个通道可以在单个会话连接中多路复用。

  • 如下为方法示例:
    tran = paramiko.Transport((‘192.168.56.100’, 22))
    tran.connect(username=‘client’, password=‘test’)

  • Transport类常用的方法:
    1、Transport(sock)建立Transport对象,实例化SSH会话通道。
    2、connect(username=“,password=None,pkey=None)建立SSH会话连接,并使用密码或私钥进行身份认证。
    3、close() 关闭会话。

Key handling类及其方法介绍

  • Key handling类用于创建对应密钥类型的实例,如RSA密钥,DSS(DSA)密钥。这个类包含了密钥的读取,写入等相关方法。
  • 如下为方法示例:
    key=paramiko.RSAkey.from_private_key_file(r’C:\Users\exampleuser.ssh\id_rsa’)
  • Key handling类常用的方法:
    1、RSAKey.from_private_key_file(filename) 从文件读取RSA私钥来创建密钥对象
    2、DSSKey.from_private_key_file(filename) 从文件读取DSS私钥来创建密钥对象

SFTPClient类及其方法介绍

  • SFTPClient类通过一个打开的SSH Transport会话通道创建SFTP会话连接并执行远程文件操作。
  • 如下为一个典型用例:
    在这里插入图片描述
from_transport方法
  • from_transport():从开启的Transport通道创建一个SFTP客户端通道。
  • 如下为方法示例:
    在这里插入图片描述
get方法
  • get():将远程文件从SFTP服务器复制到本地主机的指定路径中,操作引发的任何异常都将被传递。
  • 如下为方法示例:
    在这里插入图片描述
put方法
  • put():将本地文件从本地主机复制到SFTP服务器的指定路径中,操作引发的异常都将被传递。
  • 如下为方法示例:
    在这里插入图片描述

SSHClient类及其方法介绍

  • SSHClient类是与SSH服务器会话的高级表示。这个类已经包装了Transport类、Channel类和SFTPClient类来进行会话通道的建立和鉴权认证。
  • 如下为一个典型用例:
    在这里插入图片描述
connect方法
  • connect():实现远程服务器的连接与认证。
  • 如下为方法示例:
    在这里插入图片描述
set_missing_host_key_policy方法
  • set_missing_host_key_policy():设置连接到没有已知主机密钥的服务器时使用的策略。
  • 如下为方法示例:
    在这里插入图片描述
load_system_host_keys方法
  • load_system_host_keys():从系统文件加载主机密钥,如果没有参数,那么就尝试从用户本地的“known hosts”文件中读取密钥信息。
  • 如下为方法示例:
    在这里插入图片描述
exec_command方法
  • exec_command():在远程服务器执行Linux命令的方法。
  • 如下为方法示例:
    在这里插入图片描述
invoke_shell方法
  • invoke_shell():基于SSH会话连接,启动一个交互式shell会话。
  • 如下为方法示例:
    在这里插入图片描述
open_sftp方法
  • open_sftp():在SSH服务器上创建打开一个SFTP会话。
  • 如下为方法示例:
    sftp=client.open_sftp()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值