SSH学习
简介
SSH或Secure Shell是一种远程管理协议,允许用户通过Internet控制和修改远程服务器。该服务是作为未加密Telnet的安全替代品创建的,它使用加密技术确保与远程服务器之间的所有通信都以加密的方式进行。它提供了一种机制,用于验证远程用户,将输入从客户机传输到主机,并将输出转发回客户机。
本SSH教程将介绍SSH如何工作的基础知识,以及协议用于提供安全的远程访问方法的底层技术。它将覆盖不同的层和使用的加密类型,以及每个层的用途。
SSH如何工作
SSH命令由3个不同的部分组成:
ssh {user}@{host}
SSH密钥命令指示系统希望打开加密的安全Shell连接。{user}表示要访问的帐户。例如,您可能希望访问根用户,它基本上是系统管理员修改系统上任何内容的完全权限的同义词。{host}表示要访问的计算机。这可以是IP地址(例如244.235.23.19)或域名(例如www.xyzdomain.com)。
当您点击回车时,系统会提示您输入所请求帐户的密码。当你输入密码时,屏幕上什么也不会显示,但实际上你的密码正在被传输。输入完成后,再次按回车。如果您的密码正确,您将看到一个远程终端窗口。
如果您想了解更多SSH命令,请在这里找到它们。
了解不同的加密技术
SSH相对于其前辈的显著优势是使用加密来确保主机和客户机之间的信息安全传输。主机是指您试图访问的远程服务器,而客户端是您用来访问主机的计算机。SSH使用了三种不同的加密技术:
- 对称加密
- 不对称加密
- 散列
对称加密
对称加密是一种加密形式,客户机和主机都使用密钥对消息进行加密和解密。实际上,任何拥有密钥的人都可以解密传输的消息。
对称加密通常称为共享密钥加密或共享秘密加密。通常只使用一个键,或者有时使用一对键,其中一个键可以使用另一个键轻松计算。
对称密钥用于在SSH会话期间加密整个通信。客户端和服务器都使用约定的方法派生密钥,并且生成的密钥从不向任何第三方公开。创建对称密钥的过程是通过密钥交换算法实现的,这个算法之所以特别安全,是因为这个密钥从来没有在客户机和主机之间传输过。相反,两台计算机共享公共数据片段,然后对其进行操作,独立计算密钥。即使另一台机器捕获公开共享的数据,它也无法计算密钥,因为密钥交换算法尚不清楚
但是,必须注意,秘密令牌是特定于每个SSH会话的,并且是在客户机身份验证之前生成的。一旦密钥生成,在两台机器之间移动的所有数据包都必须由私钥加密。这包括用户输入到控制台的密码,因此凭证总是受到保护,不受网络数据包嗅探器的攻击。
存在各种对称加密密码,包括但不限于AES(高级加密标准)、CAST128、Blowfish等。在建立安全连接之前,客户机和主机通过发布支持的密码列表(按优先级排序)来决定使用哪个密码。来自客户机的最喜欢的密码支持出现在主机列表中的密码被用作双向密码。
例如,如果两台Ubuntu 14.04 LTS机器通过SSH相互通信,它们将使用aes128-ctr作为默认密码。
非对称加密
与对称加密不同,非对称加密使用两个独立的密钥进行加密和解密。这两个密钥称为公钥和私钥。这两个键一起形成一个公私密钥对。
顾名思义,公钥是公开分发的,并与所有各方共享。虽然它在功能上与私钥密切相关,但私钥不能从公钥进行数学计算。这两个密钥之间的关系非常复杂:由一台机器的公钥加密的消息只能由同一台机器的私钥解密。这种单向关系意味着公钥不能解密它自己的消息,也不能解密由私钥加密的任何内容。
私钥必须保持私有,即要保护连接,任何第三方都不能知道它。整个连接的优点在于,私有密匙从未被公开,因为它是唯一能够解密使用自己的公钥加密的消息的组件。因此,任何有能力解密公开签名消息的一方都必须拥有相应的私钥。
与一般的理解不同,非对称加密并不用于加密整个SSH会话。它只在对称加密的密钥交换算法中使用。在启动安全连接之前,双方生成临时公私密钥对,并共享各自的私钥以生成共享密钥。
一旦建立了安全的对称通信,服务器就使用客户机公钥来生成和挑战它,并将其传输给客户机进行身份验证。如果客户机能够成功解密消息,则意味着它持有连接所需的私钥。然后开始SSH会话。
hash
单向散列是用于安全Shell连接的另一种加密形式。单向哈希函数与上述两种加密形式的不同之处在于,它们永远不会被解密。它们为每个输入生成一个固定长度的惟一值,该值不显示可以利用的明确趋势。这使得它们几乎不可能逆转。
从给定的输入生成密码散列很容易,但从该散列生成输入则不可能。这意味着,如果客户机持有正确的输入,则可以生成加密图形散列并比较其值,以验证是否拥有正确的输入。
SSH使用散列来验证消息的真实性。这是使用HMACs或基于散列的消息身份验证代码完成的。这确保接收到的命令不会以任何方式被篡改。
在选择对称加密算法的同时,还选择了合适的消息认证算法。这与选择密码的方式类似,如对称加密部分中所述。
传输的每个消息必须包含一个MAC,它使用对称密钥、包序列号和消息内容进行计算。它作为通信包的结束部分发送到对称加密的数据之外。
SSH如何使用这些加密技术
SSH的工作方式是利用客户机-服务器模型来允许对两个远程系统进行身份验证,并对在它们之间传递的数据进行加密。
默认情况下,SSH操作TCP端口22(如果需要可以更改)。主机(服务器)监听端口22(或任何其他SSH分配的端口)上的传入连接。它通过验证客户机并在验证成功时打开正确的shell环境来组织安全连接。
客户机必须通过启动与服务器的TCP握手来启动SSH连接,确保安全的对称连接,验证服务器显示的标识是否与以前的记录(通常记录在RSA密钥存储文件中)匹配,并提供验证连接所需的用户凭证。
建立连接有两个阶段:首先,两个系统必须就加密标准达成一致,以保护未来的通信;其次,用户必须对自己进行身份验证。如果凭证匹配,则授予用户访问权限。
会话加密谈判
当客户机试图通过TCP连接到服务器时,服务器将显示它所支持的加密协议和各自的版本。如果客户端具有类似的匹配协议对和版本,则达成协议,并使用接受的协议启动连接。服务器还使用非对称公钥,客户机可以使用该公钥来验证主机的真实性。
一旦确定了这一点,双方就会使用所谓的Diffie-Hellman密钥交换算法来创建对称密钥。该算法允许客户机和服务器都获得一个共享加密密钥,该密钥将用于加密整个通信会话。
下面是算法在非常基础的层面上的工作原理:
- 客户机和服务器都同意一个非常大的素数,这当然没有任何共同的因子。这个素数值也称为种子值。
- 接下来,双方同意使用一种通用加密机制,通过以特定的算法方式操作种子值生成另一组值。这些机制也称为加密生成器,对种子执行大型操作。这种生成器的一个例子是AES(高级加密标准)。
- 两边独立生成另一个质数。这用作交互的秘密私钥。
- 这个新生成的私钥使用共享编号和加密算法(例如AES)来计算分发到另一台计算机的公钥。
- 然后双方使用他们的个人私钥、另一台机器的共享公钥和原始素数来创建最终的共享密钥。此密钥由两台计算机独立计算,但将在两侧创建相同的加密密钥。
- 既然双方都有一个共享密钥,那么就可以对称地加密整个SSH会话。可以使用相同的密钥加密和解密消息(请参阅:对称加密部分)。
既然已经建立了安全的对称加密会话,就必须对用户进行身份验证。
验证用户
在授予用户访问服务器的权限之前,最后一个阶段是对其凭证进行身份验证。为此,大多数SSH用户使用密码。要求用户输入用户名,然后输入密码。这些凭证安全地通过对称加密的通道,因此不会被第三方捕获。
虽然密码是加密的,但仍然不建议在安全连接中使用密码。这是因为许多机器人可以简单地暴力破解简单的或默认的密码,并获得访问您的帐户。相反,推荐的替代方案是SSH密钥对。这是一组非对称密钥,用于对用户进行身份验证,而不需要输入任何密码。SSH密钥对是非对称密钥,这意味着两个关联的密钥提供不同的功能
公钥用于加密只能用私钥解密的数据。公钥可以自由共享,因为尽管它可以为私钥加密,但是没有从公钥派生私钥的方法。
如上一节所述,对称加密建立之后,使用SSH密钥对进行身份验证就开始了。过程是这样的:
- 客户机首先向服务器发送它想要验证的密钥对的ID。
- 服务器检查客户机试图登录的帐户的authorized_keys文件以获取密钥ID。
- 如果在文件中找到具有匹配ID的公钥,服务器将生成一个随机数,并使用该公钥加密该数字。
- 服务器将此加密消息发送给客户机。
- 如果客户机实际拥有关联的私钥,它将能够使用该私钥解密消息,从而显示原始数字。
- 客户机将解密的数字与用于加密通信的共享会话密钥组合,并计算该值的MD5哈希值。
- 然后,客户机将这个MD5散列发送回服务器,作为加密数字消息的答案。
- 服务器使用相同的共享会话密钥和发送给客户机的原始编号来自行计算MD5值。它将自己的计算与客户机发回的计算进行比较。如果这两个值匹配,则证明客户机拥有私钥,并且客户机经过身份验证。
如您所见,密钥的不对称允许服务器使用公钥加密发送给客户机的消息。然后,客户机可以通过正确解密消息来证明它持有私钥。使用的两种加密类型(对称共享密钥和非对称公私密钥)都能够在此模型中利用各自的特定优势。
结论
深入了解SSH的底层工作方式可以帮助用户理解这项技术的安全方面。大多数人认为这个过程是极其复杂和不可理解的,但它比大多数人认为的要简单得多。如果您想知道计算机计算散列和验证用户需要多长时间,那么,不到一秒钟就可以完成。事实上,在Internet上传输数据所花费的时间是最多的。
希望这篇SSH教程能够帮助您了解如何将不同的技术组合在一起来创建一个健壮的系统,其中每种机制都可以发挥非常重要的作用。而且,现在您知道了为什么SSH一出现Telnet就成为了过去。
SSH学习的更多相关文章
- SSH学习笔记
Struts2登录模块处理流程: 浏览器发送请求http://localhost/appname/login.action,到web应用服务器: 容器接收到该请求,根据web.xml的配置,服务器将请 ...
- SSH学习之路(一).Net开发与Java Web开发
摘要:一直再使用.net mvc5开发,期间学习过java web相关的知识,现如今想要进阶一下便开始学习ssh框架. 1..net web开发 对于微软的东西,开发者考虑的东西不需要太多,你新建一个 ...
- 【SSH学习笔记】用Struts2实现简单的用户登录
准备阶段 在使用学习Struts2的时候首先要下载相应的架包 Struts2资源下载 这里建议下载第一个,在struts-2.5.14.1-all.zip里有很多实用的东西,不仅有架包还有官方为开发者 ...
- 【SSH学习笔记】浅谈SSH框架
说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...
- [SSH] SSH学习笔记 - 远程登录
1.SSH登陆/登出命令 $ ssh <hostname> #登入 $ exit #登出 known_hosts 每个用户都有自己的known_hosts文件,路径:(username)/ ...
- ssh学习小记
ssh 为Secure SHell 的缩写.OpenSSH: ssh协议的开源实现. SSH协议版本 v1: 基于CRC-32做MAC,不安全:man-in-middle v2:双方主机协议选择安全 ...
- SSH 学习笔记
零.背景 在看 pm2 的 deploy 功能的时候,对 ssh 的不熟悉导致错误频出,包括之前对 github 的配置也用到了 SSH,所以找个机会整理一下. 一.介绍 SSH 是每一台 Linux ...
- SSH学习之四 OpenSSH安全
OpenSSH是Linux/Unix下一款加密通讯软件.同一时候也是我们用来远程控制Linux/Unixserver重要的必装软件. 对于各版本号的Linux及Unix发行版而言,O ...
- SSH 学习记录及在SSH模式下使用XShell连接服务器
传统的网络服务程序,如rsh.FTP.POP和Telnet其本质上都是不安全的:因为它们在网络上用明文传送数据.用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击 ...
随机推荐
- Cordova打包vue项目生成Apk (解决cordova build android抛出的zip问题)
最近对vue前端框架情有独钟.但研究了一下怎么把vue项目打包成android apk来玩玩. 首先讲一下创建vue2.x项目.其实在之前的文章中都有写过,有兴趣的同学可以去看看.http://www ...
- CSS _text-align:justify;实现两端对齐
参考:https://segmentfault.com/q/1010000007136263 法一:text-align-last:justify: html <div> <p cl ...
- 微信小程序统计分析
在微信公众平台社区看到一个不错的东西,小博统计:https://www.wxappdev.com/:用于微信小程序统计分析.
- 把.zip文件转化为.tar.gz文件
工作中正好用到上传tar.gz文件,没有现成的转换工具,就写了方法转换 #encoding: utf-8import osimport tarfileimport zipfileimport osim ...
- Java-IO 字节流的使用和效率比较
打算做一个系列,前面讲了基本的字符流的用法,这篇博客介绍一下字节流的基本用法: 一.基本使用: 基本字节流: FileInputStream FileOutputStream BufferedIn ...
- 关于Django字段类型中 blank和null的区别
blank 设置为True时,字段可以为空.设置为False时,字段是必须填写的.字符型字段CharField和TextField是用空字符串来存储空值的. 如果为True,字段允许为空,默认不允许. ...
- rz快速上传文件到ssh服务器
[root@k8s01 ~]# rz --helprz version 0.12.20Usage: rz [options] [filename.if.xmodem]Receive files wit ...
- FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据
如何使用FFmpeg抽取音视频的音频数据,代码如下: void adts_header(char *szAdtsHeader, int dataLen); // 使用FFmpeg从视频中抽取音频 vo ...
- [Swift]LeetCode156.二叉树的上下颠倒 $ Binary Tree Upside Down
Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that ...
- Python面试真题答案或案例
Python面试真题答案或案例如下: 请等待. #coding=utf-8 #1.一行代码实现1--100之和 print(sum(range(1,101))) #2.如何在一个函数内部修改全局变量 ...