SSH原理以及使用方式

How to use ssh to connect server?

最近和朋友讨论到了如何使用ssh连接服务器,一时兴起,感觉自己也确实只会用其中一些简单的命令,所以就抽空整理了下该篇文章,该文章参考了许多网上的资源,最后以我自认为比较简单明了的方式作出此文,时间原因,后面会补充一个过程图。

一、ssh是什么?

SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital、 UNIX、Irix,以及其他平台,都可运行SSH。

二、ssh可以做什么?

传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道" 。

三、ssh的原理

3.1 验证方式

从客户端的角度来说,ssh提供两种级别的安全验证,分别是基于口令的安全验证和基于密钥的安全验证。

  • 基于口令的安全验证

    ​ 口令,也就是一般来讲我们说的密码,只要知道服务ip、账号以及密码,就可以登录远程主机。所有的传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

  • 基于密钥的安全验证

    ​ 需要依靠密钥,也就是你必须为自己创建一对密钥,并把公用密钥(公钥)放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下(.ssh)寻找你的公用密钥,然后把它和你发送过来的公用密钥进行比较。如果两个密匙一致,服务器就用公用密钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密钥解密再把它发送给服务器。

    用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种方式不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙),但是整个登录的过程可能需要10秒。

3.2 验证过程

ssh的登录过程分为5个阶段

1、版本号协商阶段

2、密钥和算法协商阶段

3、认证阶段

4、会话请求阶段

5、会话交互阶段

主要就如下三个阶段:

  • 1、版本号协商阶段

    • 服务端打开端口22,等待客户连接。
    • 客户端向服务端发起TCP连接,连接建立后,服务端向客户端发送第一个报文,包括版本标志字符串,格式为“协议版本号 次协议版本号 软件版本号”。
    • 客户端收到报文后,解析协议版本号,如果服务端的协议版本号比自己的低,且客户端能支持服务端的低版本,就使用服务端的协议号,否则使用自己的协议版本号。
    • 客户端回复服务端一个报文,包含了客户端决定使用的协议版本号。
    • 服务端比较客户端发过来的版本号,决定是否能同客户端交互。
    • 如果协商成功,就进入密钥和算法协商阶段。否则服务端断开TCP连接。
  • 2、密钥和算法协商阶段

    • 服务端和客户端分别发送算法协商报文给对方,报文中包含自己支持的公钥算法列表、加密算法列表、消息验证码算法列表、压缩算法列表等。
    • 服务端和客户端根据对方和自己支持的算法得出最终使用的算法。
    • 服务端和客户端利用DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话ID。
      • c公 客户端公钥
      • c密 客户端密钥
      • s公 服务端公钥
      • s密 服务端密钥
    • 在版本号协商阶段完成后:
      • 服务端将 s公 发送给客户端。
      • 服务端生成会话ID ,设为 id ,发送给客户端。
      • 客户端生成会话密钥,设为 key ,并计算 res = (id 异或 key)。
      • 客户端将 res 用 s公 进行加密,将结果发送给服务端。
      • 服务端用 s密 进行解密,得到 res。
      • 服务器计算 res 异或 id,得到 key。
      • 至此服务端和客户端都知道了会话密钥和会话ID,以后的数据传输都使用这个会话密钥进行加密和解密。
  • 3、认证阶段

    • 基于账号和口令的验证方式:

      • 客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、口令,将结果发送给服务器。

      • 服务端使用获得的会话密钥解密报文,得到账号和口令。

      • 服务端对这个账号和口令进行判断,如果失败,向客户端发送认证失败报文,其中包含了可以再次认证的方法列表。

      • 客户端从认证方法列表中选择一种方法进行再次认证。

      • 这个过程反复进行,直到认证成功或者认证次数达到上限,服务端关闭本次TCP连接。

    • 基于公钥和私钥的验证方式:

      • 使用ssh-keygen程序生成公钥 id_dsa.pub 和私钥 id_dsa,一般是在客户端上生成,然后把 id_dsa.pub 通过某种方式发送给服务端。

      • 服务端放在将要远程登录过来的那个账号的目录的.ssh目录下面。

      • 客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、id_dsa.pub,将结果发送给服务端。

      • 服务端使用会话密钥解密报文,得到账号、id_dsa.pub。

      • 服务端在这个账号的目录的.ssh目录下找对应的公钥,如果没有找到,发送失败消息给客户端,如果找到,比较客户发送过来的这个公钥和找到的公钥,如果内容相同,服务端生成一个随机的字符串,简称“质询”,然后使用找到的公钥加密这个质询,然后使用会话密钥再次加密。

      • 服务端把这个双重加密的数据发送给客户端。

      • 客户端使用会话密钥解密报文,然后使用id_dsa再次解密数据,得到质询。

      • 客户端使用会话密钥加密质询,发送给服务端。

      • 服务端使用会话密钥解密报文,得到质询,判断是不是自己生成的那个质询,如果不相同,发送失败消息给客户端,如果相同,认证通过。

四、ssh的命令使用

4.1 简单的基于口令的验证

ssh user@remote [-p port]

4.2 简单的基于密钥的验证

ssh -i secretkey user@remote [-p port]

4.3 配置别名来认证

​ 如果服务器比较多的时候,我们就可以配置别名来连接服务器。

在客户端下的  ~/.ssh/config 文件中追加下服务器相关内容,
* 格式:
    Host serverName
            HostName remote-ip
            [IdentityFile secrePath]
            User    userName
            Port port
* 解释:
        Host 服务器别名
            HostName 远程ip地址
            [IdentityFile 密钥文件地址(如果使用密钥来验证的话)]
            User    账号名称
            Port 端口号
* 例如:
    Host centos
          HostName xxx.xxx.xxx.xxx
          User user
          Port port
保存之后就可以直接使用 ssh centos来登录。

注:如果没有config文件的话可以新建一个。

你可能感兴趣的:(SSH原理以及使用方式)