SSH远程登录

什么是SSH?

SSH(Secure Shell Protocol)是一个是一种加密的网络传输协议,是一个Protocol,它有具体实现,比如开源的openSSH。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接,可在不安全的网络中为网络服务提供安全的传输环境,SSH最常见的用途是远程登录系统。

连接的整个过程

  1. 建立连接 SSH是基于TCP/IP协议的,所以最开始的时候要先进行TCP3次握手
  2. 版本协商 SSH目前有SSH-1和SSH-2两个版本,加密方式不同,需要预先协商使用的版本
  3. 算法协商 协商使用哪种加密算法,如 RSA,ED25519
  4. 密钥交换 使用DH密钥交换算法(Diffie–Hellman key exchange)生成共享密钥。过程如下

    首先客户端生成公钥pk1,私钥sk1,然后将pk1发送给服务端

    服务端生成服务端自己的公钥pk2,私钥sk2,然后服务端使用pk2,sk2,pk1生成了共享密钥ss1

    接着服务端不会直接发送ss1给客户端,而是发送pk2给客户端,也就是也将自己的公钥发送给对方

    客户端收到pk2后,使用pk1,sk1,pk2生成了共享密钥ss2,DH算法证明,ss1和ss2是一样的share secret

    那么这个时候就可以使用由非对称加密得到的共享密钥,同时也是会话密钥(Session Key),这个密钥就可以作为后续通信的对称密钥了。注意以上的过程中的客户端服务端生成的公钥私钥都为临时密钥
  5. 身份认证 可以使用密码认证,也可以使用密钥认证。

    密码认证不安全,可能会被截取破解。

    若使用密钥认证,首先服务端得有客户端复制而来的公钥,接下来有如下过程
    首先客户端发出连接request,服务端收到request后生成随机数R,使用公钥生成密文并发送给客户端

    客户端收到密文后使用私钥解密得到随机数R,接着使用Session Key对R进行哈希得到数据摘要Digest1并发送给服务端

    服务端收到Digest1,同时服务端使用Session Key对R进行哈希得到Digest2,如果Digest1=Digest2,验证通过
    整个过程相比于密码登录,更为安全
  6. 会话请求 在身份认证成功后,客户端向服务器发送会话请求。此时,客户端会使用会Session Key用于对后续传输的数据进行加密。
  7. 信息通讯 会话建立后,就可以进行通信。由于只有客户端和服务器能够解密和理解这些信息,即使在不安全的网络环境中,数据仍然可以保持机密。

ssh远程登录

使用命令ssh <user>@<host>

比如,以root用户登录ip为1.1.1.1的主机

1
ssh root@1.1.1.1

ssh登录端口默认22,还可以指定端口,使用-p参数
比如,以git用户登录ip为2.2.2.2的主机

1
ssh git@2.2.2.2 -p 22

如果没用密钥认证,接下去会让你输入密码

密钥认证免密登录

  1. 客户端生成公钥和私钥,使用命令ssh-keygen

    常用可选参数如下:

    参数 作用
    -t type,指定加密算法
    -C comment,备注信息
    -f filename,指定密钥储存文件的文件名
    -N new_passphrase,指定新的密码
    -q quiet,静默模式,不显示输出

    比如,使用命令

    1
    ssh-keygen -t ed25519

    这时会在~/.ssh/下生成两个文件id_ed25519id_ed25519.pub,分别储存着私钥和公钥

  2. 接着使用命令ssh-copy-id <user>@<host>将公钥复制到服务端
    比如

    ssh-copy-id root@1.1.1.1
    

    将会把公钥复制到服务端的~/.ssh/authorized_keys

    后续再使用ssh登录时就不用再输入密码