Telnet --SSH

Learn the basics

First, what is SSH?

    简单说,SSH是一种网络协议,用于计算机之间的加密登录,是一种比较流行的登录应用程序——安全外壳(Secure Shell,SSH),与TELNET一样。SSH利用TCP作为底层传输协议,不过它比TELNET更安全,提供更多的服务。

    如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

    最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

    需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。

Second, the composition

SSH is an application layer protocol consists of four parts

1 SSH transport layer protocol (SSH-TRANS)

    因为TCP不是安全的运输层协议,所以SSH首先使用在TCP之上能够构建安全通道的协议。这个新的层是一个独立的协议,称为SSH-TRANS。当这个协议的软件实现被调用后,它的客户程序和服务器程序先利用TCP协议建立起一条不安全的准连接。然后它们相互交换几个安全参数,并在TCP纸上建立一条安全的信道。它提供的服务有
  • Confidential or encrypted message exchange
  • Data integrity, which means that it guarantees between the client and server exchange messages will not be modified intruder
  • Authentication server, which means that customers can now be assured that this server is not fake
  • Difficulty packet compression, can improve the efficiency of the system and thus increase the attack

2 SSH authentication protocol (SSH-AUTH)

    当客户和服务器之间的安全信道以建立,且客户对服务器鉴别之后,SSH就要调用另一个软件,它能够让服务器来鉴别客户。

3 SSH connection protocol (SSH-CONN)

    当安全的信道以建立,且服务器和客户相互鉴别后,SSH就可以调用实现了第三个协议的软件,这第三个协议就是SSH-CONN。SSH-CONN协议提供的众多服务之一就是进行复用。SSH-CONN利用前两个协议建立的安全信道,让客户在该信道上创建多个逻辑信道。

4 SSH application

    在连接阶段完成后,SSH允许几个应用程序一起使用该连接。每个应用程序如前所述地建立一条逻辑通道,然后就可以享用安全信道带来的方便和好处。换言之,远程登录只是利用了SSH-CONN协议的众多服务之一,其他一些应用,比如说文件传送应用,也可以使用其中的一条逻辑信道来完成自己的任务。

Third, port forwarding

    在SSH协议所提供的众多具有吸引力的服务之中,有一项服务时端口转发。我们可以利用SSH中空闲的安全信道来接入那些不提供安全服务的应用程序。像TELNET和SMTP这样的应用也可以通过这个端口转发机制来使用SSH的服务。SSH的端口转发机制会在属于其他协议的报文所经过的路途上创建一条隧道。正因为如此,有时这个机制被称为SSH隧道技术。下图为端口转发的概念。

    TELNET客户和TELNET服务器之间的连接虽然直接但缺少安全性,通过端口转发我们可以改变这种情况。TELNET客户可以利用本地站点的SSH客户,以便与运行在站点上的的TELNET服务器之间建立一条安全连接。任何从TELNET客户到TELNET服务器的请求都要经过SSH客户和服务器提供的隧道进行传输。任何从TELNET服务器到TELNET客户的响应也要经过由SSH客户和服务器提供的隧道进行传输。

Fourth, the packet format

  • Length: definition packet, but excluding the length field itself and the filling
  • Filling: In order to increase safety, make it more difficult to attack
  • Type: This defines the type of packet used for the SSH protocol
  • Data: This field is a variable length, the length of the available data length field value minus five bytes calculated to give
  • CRC: error detection

Advanced knowledge about

Asymmetric cryptography

SSH service based on asymmetric encryption (public-key cryptography, also known as public-key encryption) transmission technology for data encryption. This technique generates one pair of mathematically related keys, one for encrypting data, but can only be used for encryption and another for decryption only. Data using the encryption key, the decryption key can only be decrypted with the corresponding. Moreover, only know that one of the keys, the other can not be calculated. Therefore, if disclosed a pair of keys in, and will not jeopardize another secret nature. The public key is typically referred to as a public key (public key), called the private key not disclosed (private key).

If the public key is decrypted, the scenario for the client to verify the integrity of the private key held by the party published data or files, accuracy to prevent data tampering. Corresponding key is called a digital signature (digital certificates). If the public encryption key, the scene for the owner of the private client to upload data, called public key encryption. Based on this scenario SSH service.

Compared with symmetric-key encryption, asymmetric encryption is advantageous in that common shared key does not exist. Because without the private key for decryption transmitted to any user, it can be avoided or tampered key is hijacked. Encrypted with the public key of hijacked or tampered with even if there is no its matching private key, can not decrypt the data. So, we intercepted the public is of no use.

当前,SSH主要采用 RSA 算法(协议 V2 默认算法)和DSA 算法(协议 V1 仅支持该算法)来实现非对称加密技术。

连接交互过程

SSH 服务建立连接时的相关交互过程,如下 图所示

连接过程中的相关交互步骤,详细说明如下。

1.服务端准备阶段

2.非对称加密协商

3.后续数据交互过程


服务端准备阶段

服务端在每次启动 SSH 服务时,都会自动检查/etc/ssh/目录下相关密钥文件的有效性。如果相关文件检查发现异常,则会导致服务启动失败,并抛出相应错误信息。 如果文件相关不存在,则会自动重新创建。

默认创建的相关文件及用途说明如下

ll /etc/ssh/
-rw-------. 1 root root 125811 Aug 13  2015 moduli          → 用于 DH-GEX 算法
-rw-r--r--. 1 root root   2047 Aug 13  2015 ssh_config          → SSH 客户端配置文件
-rw-------. 1 root root   3879 Aug 13  2015 sshd_config         → SSH 服务配置文件
-rw-------. 1 root root    672 May 20 14:22 ssh_host_dsa_key        → DSA 算法私钥
-rw-r--r--. 1 root root    590 May 20 14:22 ssh_host_dsa_key.pub            → DSA 算法公钥
-rw-------. 1 root root    963 May 20 14:22 ssh_host_key            → SSH V1 版RSA 算法私钥
-rw-r--r--. 1 root root    627 May 20 14:22 ssh_host_key.pub        → SSH V1 版 RSA 算法公钥
-rw-------. 1 root root   1675 May 20 14:22 ssh_host_rsa_key        → SSH V2 版 RSA 算法私钥
-rw-r--r--. 1 root root    382 May 20 14:22 ssh_host_rsa_key.pub            → SSH V2 版 RSA 算法公钥

非对称加密协商

服务端 SSH 服务正常运行后,客户端连接时,进行如下交互:

1:客户端向服务端发送连接请求。

客户端通过 SSH 工具连接服务端。相关信息通过明文发送。

2:服务端返回公钥信息: 根据客户端所使用的服务协议版本及算法设置,返回相应公钥信息。比如,默认情况下,客户端通过 SSH V2 版协议,基于 RSA 算法建立连接,则服务端将 ssh_host_rsa_key.pub文件中的内容返回客户端。相关信息通过明文发送。

3:客户端对服务端公钥信息进行比对和确认: 客户端接收到服务端公钥信息后,会进行如下比对,并让用户对相关信息进行确认。

  • 如果是首次连接服务端,客户端会收到类似如下信息,让用户确认公钥指纹的有效性:
  • The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
    RSA key fingerprint is c2:49:d9:43:74:d5:ed:bc:28:9b:d2:7b:63:94:cf:bc.
    Are you sure you want to continue connecting (yes/no)?

    如果用户输入 no ,则连接中断并报错(Host key verification failed)。

  • 如果用户输入 yes,则会将相应的公钥信息,保存到当前用户家目录下.ssh 目录内的known_hosts文件中。 比如
  • cat ~/.ssh/known_hosts
    
    IP 明文显示:
    192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3sdlboGEgY9buZpkPuygPw0NxAvmxYd0mc3fo2MgP+JqgFC9/9ZXOgDXKJrjE2HKBieJZSPKGncIh+zLxTvmykeJQBXv7i1GiUjW+H3VY69Ge3AdGfCd+XF+Cvi1e+j18zhHnjSzvIBoNpT5cBWWNbw7mNHCwTb0sHAVUkWR4Ck/LM5/rQ09A+m6BLfZJL8CRNGxKTbyINi6o812S+Cy64WqDs1nTpIXp2Bkcpjclb36bFSs9Z/tWNuJl7A//7HNtxMgFGBnE07Ykvvy8s06DUmkyFy8GcXGBpnfdg9utLodfQLFQnKflCQZ110BpQaCWlWPjU9dc4w3XLJ/XQOP4w==
    
    IP 做了加密处理:
    |1|3efXAZ4sNHcUcHamBy4gDriblc8=|8idBhLq9aLl2sfh4KswMsk4sPFI= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwS4DE3hok8RCkxYlTxsexNrNa62e05UGSkoP7ie26DDWjG1Aoc74cCsE4is9p7lEfFUYYlAzeYhPqE/yGf5YxRZUOU2IeFI4cEqo8YZr7edVYpgAq2f2J0zMwk1syenD12lmUPkYA4mMB6it3jxXR5k+H0HZh9YA7mRXkiTjlkAMWirBcnUvtKYRv9LRIr3ikUiPy2gfZO291Ae9zuTsWwEtHQxIpiBgk3vwF2gCUFlX9y//IsMjdQq5prk7x3BjXhUorqgJO1gt1VHW8Xxx9Oe50YF1hi9DuE6VXwyh4xfHTmauRQybwsYafdA3HxrA2od6x9l19D9EH7xHAjDa5w==
  • 如果服务端因重装系统等因素导致公钥指纹出现变化,则会直接导致连接失败(报错Host key verification failed),则需要删除已保存的条目后再重新连接
  • 如果之前已经成功连接,而且公钥指纹对比一致,则会继续下一步操作。 
  • 4:客户端生成临时密钥对: 服务端公钥校验及确认后,客户端会生成一对临时密钥用于客户端加密。该密钥对不会存储到文件,而是记录在内存中。每次连接都会重新生成临时密钥对。

    5:客户端发送公钥信息: 客户端向服务端,发送前述生成的临时密钥对中的公钥信息。相关信息通过明文发送。

    至此,服务端及客户端都拥有对方的公钥和自身的私钥,所以称为非对称加密。

    后续数据交互过程

    后续登录校验及正常的数据传输,都会通过双向加密方式进行。相关交互说明如下:

    1:如果服务端需要发送数据给客户端:

    (1)服务端使用所持有的客户端公钥,对需要传输的数据进行加密,再发送给客户端。

    (2)客户端收到信息后,使用所持有的自身私钥解密后获取数据。

    2:反之,如果客户端需要发送数据给服务端,也是类似的流程:

    (1)客户端使用所持有的服务端公钥,对需要传输的数据进行加密,再发送给服务端。

    (2)服务端收到信息后,使用所持有的自身私钥解密后获取数据。

    实战演练

    服务器安装SSH
    安装: yum isntall openssh-server
    启动: service sshd start
    设置开机运行: chkconfig sshd on
    查看进程: ps -ef | grep ssh

    centos在安装的时候已经默认将客户端和服务端都安装好,可以你之前安装的过程,或者使用yum install openssh-sclients查看

    客户端安装SSH

    在客户端安装有三种:xshell、putty、secureCRT

    xshell下载链接: http://dlsw.baidu.com/sw-search-sp/soft/7b/15201/Xshell_5.0.0.37_setup.1459931786.exe

    在windows下的xshell中 使用

    ssh [email protected] # 连接到服务器(用户名 + 账号)

    如果不成功, 我们尝试ping一下其ip地址,看看能不能访问这个ip地址

    回到服务器端,使用ifconfig命令,你可能会发现ip地址变了

    解释:重启电脑或者重启虚拟机这个ip地址会发生改变的,因为我们是使用桥接方式的

    ssh config

    config为了方便我们批量管理多个ssh

    config存放在 ~/.ssh/config

    config配置语法

    SSH config关键字

      关键字         解释  
      Host        别名  
    HostName     主机名  
      Port        端口  
      User       用户名  

    IdentityFile 密钥文件路径

    创建一个SSH连接

    在家目录下新建一个文件

    cd ~/.ssh/
    touch config
    vim config

    写入内容

    此时可以通过Host名称wlk登录,不需要写入ip和端口等等信息了

    只需要别名就可以连接成功了

    如果是多个用户我们可以 在写个这样的 内容 host “wuliekun” 后面一样的,那么也可以连接成功


    SSH安全免密码登录:ssh key

    ssh key 使用非对称加密方法生成公钥和私钥

    私钥存放在本地~/.ssh目录

    公钥可以对外公开,放在服务器的~/.ssh/authorized_keys

    Windows平台生成ssh key

    点击xshell菜单栏中工具下的用户秘钥管理者



    然后将其保存放在桌面上

    Linux平台生成ssh key

    ssh-keygen -t rsa
    ssh-keygen -t dsa

    进入到家目录下的/.ssh

    ssh-keygen

    我们使用ls -al在/.ssh目录下看看有没有新增这些文件

    如何使用秘钥

  • 新建会话
  • 用户身份验证
  • 连接
  • 发现连接出错

    原因:公钥可以对外公开,放在服务器的~/.ssh/authorized_keys

    而目录下却没有这个authorized_keys.

    所以需要创建一个

  • 创建authorized_keys
  • touch authorized_keys
    vim authorized_keys

    将windows下的公钥写入到authorized_keys中

    ok了

    SSH安全端口

    1:端口安全是指尽量避免服务器的远程连接端被不法分子知道,为此而改变默认服务端口号的操作

    2:如何改变ssh服务端口

  • 修改/etc/ssh/sshd_config配置
  • vim /etc/ssh/sshd-config
  • 修改文件
  • 重新启动服务
  • service sshd restart

    Guess you like

    Origin www.cnblogs.com/kttme/p/11946404.html