SSH服务的相关介绍

概述

本文主要介绍SSH服务的相关信息。

详细信息

SSH服务在进行数据传输前,会先进行密钥交换和协商确认。完成后再对后续数据进行加密传输,以提高安全性。以下先对SSH服务所采用的非对称加密技术进行简要介绍,然后对SSH连接过程中的相关交互,及关联文件进行说明。

SSH连接交互过程简介

非对称加密算法

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

  • SSH服务是基于非对称加密(public-key cryptography,也称公开密钥加密)算法实现数据加密传输的。非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
  • 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。另一方面,甲方可以使用自己的私钥对机密信息进行签名后再发送给乙方,乙方再用甲方的公钥对甲方发送回来的数据进行验签。

SSH连接交互过程

SSH服务建立连接时的相关交互过程,主要三个阶段,如下图所示。

服务端准备阶段

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

说明:SSH连接相关配置文件说明如下。

-rw-r--r-- 1 root root 581843 Jul 22 17:39 moduli               #用于DH-GEX算法
-rw-r--r-- 1 root root 2276 Jul 22 17:39 ssh_config #SSH客户端配置文件
-rw------- 1 root root 3797 Jul 22 17:39 sshd_config #SSH服务配置文件
-rw------- 1 root root 668 Jul 22 17:39 ssh_host_dsa_key #DSA算法私钥(默认自动创建)
-rw-r--r-- 1 root root 618 Jul 22 17:39 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-r----- 1 root ssh_keys 1679 Jul 22 17:39 ssh_host_rsa_key #SSH服务V2版RSA算法私钥(默认自动创建)
-rw-r--r-- 1 root root 410 Jul 22 17:39 ssh_host_rsa_key.pub #SSH服务V2版RSA算法公钥(默认自动创建)
非对称加密协商阶段

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

  1. 客户端向服务端发送连接请求,相关信息通过明文发送。
  2. 服务端返回公钥信息,是根据客户端所使用的服务协议版本及算法设置。比如,默认情况下,客户端通过SSHV2版协议,基于 RSA算法建立连接,则服务端将ssh_host_rsa_key.pub文件中的内容返回客户端。相关信息通过明文发送。
  3. 客户端对服务端公钥信息进行比对和确认,客户端接收到服务端公钥信息后,会进行如下比对,并让用户对相关信息进行确认。
    • 如果是首次连接服务端,客户端会收到类似如下信息,让用户确认公钥指纹的有效性。
      说明:公钥指纹:由于公钥一般较长(采用RSA算法时长达 1024 位)。所以为了简便起见,通过对其MD5计算,生成一个128位的字符串用于信息对比。
      The authenticity of host '1.1.1.1 (1.1.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文件中。
    • 如果服务端因重装系统等因素导致公钥指纹出现变化,则会直接导致连接失败报错Host key verification failed,则需要删除已保存的条目后再重新连接。 相关操作可以参阅如下文档。
    • 如果之前已经成功连接,而且公钥指纹对比一致,则会继续下一步操作。  
  4. 客户端生成临时密钥对,服务端公钥校验及确认后,客户端会生成一对临时密钥用于客户端加密。该密钥对不会存储到文件,而是记录在内存中。每次连接都会重新生成临时密钥对。
  5. 客户端发送公钥信息,客户端向服务端,发送前述生成的临时密钥对中的公钥信息。相关信息通过明文发送。
  6. 至此,服务端及客户端都拥有对方的公钥和自身的私钥,完成非对称加密协商阶段。
后续数据交互过程阶段

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

  • 如果服务端需要发送数据给客户端,类似流程如下。
    • 服务端使用所持有的客户端公钥,对需要传输的数据进行加密,再发送给客户端。
    • 客户端收到信息后,使用所持有的自身私钥解密后获取数据。
  • 如果客户端需要发送数据给服务端,类似流程如下。
    • 客户端使用所持有的服务端公钥,对需要传输的数据进行加密,再发送给服务端。
    • 服务端收到信息后,使用所持有的自身私钥解密后获取数据。

SSH基于密钥交换的自动登录原理简介及配置说明

此处先简要介绍基于密钥交换的SSH自动登录的原理,然后对配置方法进行说明。

原理简介

SSH证书认证登录的基础是一对唯一匹配密钥:私钥(private key)和公钥(public key)。公钥用于对数据进行加密,而且只能用于加密。而私钥只能对使用所匹配的公钥,所加密过的数据进行解密。私钥需要用户单独妥善保管。SSH客户端使用私钥向服务器证明自已的身份。而公钥是公开的,可以按需将其配置到目标服务器上自己的相应账号中。在进行SSH登录认证时,进行私钥和公钥协商。如果匹配,则身份得以证明,认证成功,允许登录。否则,将会继续使用密码验证等其它方式进行登录校验。SSH证书验证登录配置及登录协商过程,如下图所示。

生成证书
  1. 客户端生成密钥对。
  2. 将公钥信息写入目标服务器、目标账户的配置文件。该操作隐含表示了客户端拥有对目标服务器的控制权。
协商交互过程
  1. 客户端向目标服务器发送登录请求。在SSH服务启用了证书验证登录方式后,会优先通过证书验证方式进行登录验证。 
  2. 目标服务器根据SSH服务配置,在用户对应目录及文件中读取到有效的公钥信息。
  3. 目标服务器生成一串随机数,然后使用相应的公钥对其加密。
  4. 目标服务器将加密后的密文发回客户端。
  5. 客户端使用默认目录或-i参数指定的私钥尝试解密。
  6. 如果解密失败,则会继续尝试密码验证等其它方式进行登录校验。如果解密成功,则将解密后的原文信息重新发送给目标服务器。意思类似于:“看,这是这段话的原文。我能读懂发过来的密文,我拥有服务器的控制权,请让我登录。”
  7. 目标服务器对客户端返回的信息进行比对。如果比对成功,则表示认证成功,客户端可以登录。如果对比失败,则表示认证失败,则会继续尝试密码验证等其它方式进行登录校验。

自动登录配置

生成密钥对

SSH协议V1只使用RSA算法,而SSH协议V2对RSA算法和DSA算法都支持。目前所有OpenSSH版本都应该对两种算法都支持。两种算法的密钥的生成指令和使用方法相同,本文仅以RSA算法为例进行相关说明。生成密钥对的时候,可以按需决定是否设置密码。但需要注意的是,如果设置了密码,还需结合SSH-Agent代理和SSH-Add配置才能实现自动登录。同时,相关配置只对SSH-Agent启动的相应Shell生效,用户退出后重新登录时还需重新配置。所以,为简便起见,本文以常见的、不配置密码的情况进行说明。可以在任意支持环境下生成密钥对。Windows和Linux环境下,配置分别说明如下。

Windows环境下生成密钥对

在Windows环境下,通常借助各种应用软件来创建和管理密钥对。以常见的PuTTYgen为例,创建密钥对步骤参考如下。

  1. 启动 PuTTYgen。本示例中的PuTTYgen版本为0.68。
  2. Parameters > Type of key to generate 中,选中 RSA,其中 Number of bits in a generated key 的值不需要设置,软件会根据导入的私钥信息自动更新。
    ECS _ SSH Key Pair _ 导入私钥参数
  3. 单击 Load。PuTTYgen默认仅显示扩展名为.ppk的文件。要找到您的.pem文件,请选择显示所有类型的文件。
    ECS _ SSH Key Pair _ 打开待导入的私钥文件
  4. 选择您从阿里云下载的.pem格式的私钥文件,然后单击 打开
    ECS _ SSH Key Pair _ 载入pem文件
  5. 单击 OK(确定)关闭确认对话框。
  6. 单击 Save private key,PuTTYgen会显示一条关于在没有口令的情况下保存密钥的警告,单击 是(Y)
    ECS _ SSH Key Pair _ 保存私钥
  7. 指定与密钥对相同的私钥名称,保存。PuTTYgen会自动为文件添加.ppk扩展名。
Linux环境下生成密钥对

在Linux环境下,通常使用系统自带的SSH-Keygen软件来创建和管理密钥对,创建密钥对步骤参考如下。

  1. 以任意具有SSH-Keygen执行权限的用户登录服务器。
  2. 执行以下命令,基于RSA算法创建密钥对。
    ssh-keygen -t rsa
    系统显示类似如下。

    创建密钥各步骤说明,参考如下。
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): #默认保存路径和文件名,可以按需修改。
    Enter passphrase (empty for no passphrase): #如前面所述,不设置密码,回车确认即可。
    Enter same passphrase again: #不设置密码,回车确认即可。
    Your identification has been saved in /root/.ssh/id_rsa. #创建的私钥文件。
    Your public key has been saved in /root/.ssh/id_rsa.pub. #创建的公钥文件。
    The key fingerprint is:
    17:b8:0e:76:cb:57:21:3b:f2:bb:8b:a2:42:2b:54:be root@iZ233gr74jvZ
    The key's randomart image is:
    +--[ RSA 2048]----+
    | |
    | . |
    | . o . |
    | . . + . |
    | o o S + . |
    | ... . = = o |
    |.. .. + o |
    |. oE . o . |
    | . ... .. +o |
    +-----------------+
    说明:
    • 如果.ssh目录不存在,程序会自动创建。
    • 生成的密钥对是默认保存在当前用户家目录下的.ssh目录,文件名默认为id_rsa(私钥)和id_rsa.pub(公钥)。用户可以按需设置保存路径和文件名。
密钥配置

生成密钥对后,进行如下处理。

私钥的处理

私钥用于信息校验,请确保安全。可以将私钥上传到其它源服务器上,或者直接参阅前述说明创建新的密钥对。

公钥的处理
  1. 公钥信息需要写入目标服务器、目标用户的配置文件中,默认配置文件为对应用户家目录下的.ssh子目录的authorized_keys文件中,如下所示。
    ~/.ssh/authorized_keys
  2. 在客户端执行以下命令,传递公钥到目标服务器的指定用户下。
    cat ~/.ssh/id_rsa.pub | ssh [$Name]@[$Host] 'cat >> ~/.ssh/authorized_keys'
    说明
    • [$Name]用户名。
    • [$Host]目标服务器主机名或IP地址。
参数与权限检查确认

要顺利完成自动登录,还需对SSH服务相关参数及关联文件、文件夹的权限进行确认或调整。

说明:如果对相关参数做了修改,需要重启SSH服务生效。

  • SSH服务参数设置。
    • SSH服务默认开启了证书认证支持。编辑SSH服务配置文件(默认为/etc/ssh/sshd_config),确保以下参数没有设置为no。否则需将参数值修改为yes,或者注释(在最开头添加#号)该参数配置。
      RSAAuthentication
      PubkeyAuthentication
    • 如果修改了默认的公钥存放路径或文件名称,确认以下参数的值与新公钥路径或文件名称一致。
      AuthorizedKeysFile
  • 相关权限设置。
    • SSH服务证书验证方式登录,对相关目录和文件的权限都有要求,权限配置异常可能会导致登录失败。
    • 在指定用户下执行以下命令,修改.ssh目录,只有所有者才有权写入。
      chmod 700 ~/.ssh
    • 在指定用户下执行以下命令,修改authorized_keys文件的权限配置,使其它用户对authorized_keys文件没有修改权限。
      chmod 600 ~/.ssh/authorized_keys
    • 在指定用户下,依次执行以下命令,修改authorized_keys文件的权限配置,使其他用户无任何权限,并对.ssh目录添加immutable位权限,防止文件被修改。
      chmod 400 ~/.ssh/authorized_keys
      chattr +i ~/.ssh/authorized_keys
      chattr +i ~/.ssh
Windows环境自动登录

登录步骤您可以参见以下文档。

Linux环境自动登录
  1. Linux环境下,在客户端直接通过SSH免密码登录。
    ssh [$Name]@[$Host]
  2. 如果修改了私钥路径或文件名,则需要通过-i参数进行指定。
    ssh -i [$Path] [$Name]@[$Host]
    说明:[$Path]为私钥绝对路径加文件名。列如/root/.ssh/my_rsa,即为my_rsa密钥。

相关文档

适用于

  • 云服务器ECS