远程登陆服务

远程登陆服务的基本概念

远程登录服务通过网络提供访问远程计算机的功能,用户可以像本地登录计算机一样,执行操作、管理系统和运行应用程序。用户使用客户端软件通过网络连接到运行远程登录服务的服务器,输入登录凭据(如用户名和密码),获得访问权限

远程登陆服务的功能

  1. 远程控制与管理:管理员远程进行系统维护、软件更新、性能监控等操作,无需物理接触设备
  2. 命令行操作:通过远程登录命令行界面,用户可以执行命令、管理文件、安装软件、调试程序等
  3. 文件传输与管理:远程登录服务通常提供文件传输功能,允许用户在本地计算机与远程服务器之间上传、下载和管理文件
  4. 跨平台支持:远程登录服务通常支持不同操作系统之间的交互
  5. 算力共享:远程登录服务支持用户访问和利用远程计算机的算力资源,进行复杂计算、数据分析、模型训练等

远程登陆协议的简介及发展

远程登陆协议可以根据不同的标准进行分类,主要根据连接协议、安全性、平台兼容性、功能及网络拓扑类型分类。

本文主要从连接协议的角度进行介绍,首先基于连接协议可以分为基于文本和图形界面两种,本文着重介绍基于文本远程登陆的协议。

基于连接协议分类

基于文本的远程登录

文本远程登陆主要用于命令行访问,适合远程管理和配置服务器等操作

  • SSH (Secure Shell):最常用的安全远程登录协议,提供加密的通信,用于通过命令行管理远程服务器。
  • Telnet:早期的远程登录协议,不加密通信,存在较大的安全风险,逐渐被SSH取代。

基于图形界面的远程登录

允许用户通过图形化界面远程访问和控制服务器或计算机,主要有以下几种协议

  • VNC (Virtual Network Computing):跨平台的远程桌面共享协议,允许远程查看并控制Linux桌面。
  • RDP (Remote Desktop Protocol):由微软开发,通常用于Windows系统,但可以通过xrdp在Linux系统中使用。
  • X11 Forwarding:通过SSH协议将Linux远程主机的图形应用程序在本地显示。
  • NoMachine (NX):高效的图形化远程登录工具,适合低带宽场景下的流畅远程桌面操作。
  • TeamViewer:跨平台的远程控制软件,通过互联网提供远程桌面访问

Telnet 简介与发展历史

  1. 诞生与发展
    Telnet于1969年发布,是早期的网络协议之一,设计用于提供远程终端连接,在1970年代和1980年代,Telnet广泛应用于互联网的早期阶段,尤其是在科研和教育领域,用于管理远程服务器、交换数据、测试网络连接等。
  2. 安全问题
    Telnet的最大缺陷是它不提供任何加密机制,所有的数据(包括用户名和密码)都是以明文形式在网络上传输的,这使其在网络攻击中容易遭受窃听和中间人攻击。

SSH(Secure Shell)简介与发展历史:

1. SSH 1.0 诞生(1995年)

  • 背景:在20世纪90年代,互联网逐渐普及,但早期的远程访问协议(如Telnet和FTP)都是以明文形式传输数据,容易被网络攻击者窃听和篡改。为了增强远程登录和数据传输的安全性,芬兰计算机科学家 Tatu Ylönen 开发了 SSH 协议。主要解决了Telnet、RSH等协议的安全问题。

2. SSH 2.0 引入(1996年)

  • SSH 1.0 的问题:尽管 SSH 1.0 解决了明文传输的问题,但在实际使用中,1.0 版本被发现存在一些安全漏洞和设计缺陷,主要与密钥交换和算法选择有关。
  • SSH 2.0 发布:1996年,SSH-2 版本被推出,作为对 SSH-1 的改进版,提供了更安全的密钥交换机制、更好的加密算法支持、数据完整性校验。

3. OpenSSH 的发展(1999年)

  • OpenSSH 出现:1999年,SSH 协议的初始开发者 Tatu Ylönen 将 SSH 的商业版权出售给了一家商业公司,并推出了商业版的 SSH 软件。为了应对此变化, OpenBSD 项目 推出了 OpenSSH,一个开源、免费且不受商业限制的 SSH 出现。
  • 开源贡献:OpenSSH 项目迅速成为主流的 SSH 实现版本,被广泛采用。OpenSSH 在功能、稳定性和安全性方面不断发展和改进,至今仍是 Linux、macOS 以及众多其他操作系统的默认 SSH 软件包。

4. SSH 现状与发展

  • SSH 成为标准:随着互联网安全需求的不断提高,SSH 已成为远程登录、文件传输、隧道加密等场景下的标准协议。OpenSSH 被广泛使用,同时还有其他实现,如 Tectia SSH(商业版)。
  • 功能扩展:SSH 不仅用于远程登录,还广泛用于 文件传输(SCP、SFTP)端口转发(SSH 隧道)VPN(基于SSH的加密隧道) 等场景。
  • 持续安全改进:随着安全需求的变化,SSH 不断改进加密算法、密钥交换协议,并添加了双因子认证等新功能。

验证Telnet明文传输

在这里插入图片描述
在这里插入图片描述

验证SSH密文传输

在这里插入图片描述

SSH详解

SSH工作过程:

SSH 工作过程主要的五个阶段

过程说明
版本号协商阶段客户端与服务器首先交换 SSH 协议版本号,确保双方支持同一版本的协议。SSH目前包括SSH1和SSH2两个版本,但目前几乎全部使用 SSH-2,因为 SSH-1 已经被认为不安全。
密钥和算法协商阶段SSH 支持多种加密算法和密钥交换算法,双方通过交换支持的算法列表,协商出加密、压缩、消息认证码(MAC)算法,以及密钥交换算法
认证阶段客户端向服务器端发起用户认证请求,服务器对客户端进行认证。常见的认证方法包括密码认证和公钥认证
会话请求阶段认证通过后,客户端向服务器发送会话请求,服务器处理并确认请求。这一步可以包括打开远程 shell、执行单个命令或开启文件传输会话
交互会话阶段会话请求被接受后,双方开始加密通信,客户端和服务器进行数据交互,如远程执行命令、文件传输或隧道通信

SSH工作全过程图解

https://download.huawei.com/mdl/image/download?uuid=0d8cb52df1644d66b4ece2d15764c4b8

SSH工作流程

SSH 主要工作过程整合表格与交互流程解析

操作步骤说明
建立连接阶段1. 客户端:发起连接请求到服务器(TCP 端口 22)。- 客户端发起连接,指定目标服务器的IP和SSH端口(默认为22)。 - 连接建立成功后,双方会首先交换各自支持的SSH协议版本,通常为SSH-2.0
版本号协商阶段2.服务器:向客户端发送一个包括版本标志字符串的报文- 格式为SSH-<主协议版本号>.<次协议版本号>.<软件版本号>,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用
3.客户端:收到服务端报文所支持的版本,根据自身情况,决定并回复所使用的版本- 通常为SSH-2.0,或选择双方较低的版本(高版本支持低版本)
4.服务器:判断自身是否支持,客户端决定使用的版本- 以此判断版本协商是否成功,若失败则断开TCP连接
算法协商阶段5.双方互相发送自己所支持的算法- SSH过程需要多种算法,包括公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等等
6.双方依次协商各类算法- 所有算法匹配完成,进入下一阶段,若某类算法协商失败,则算法协商失败,断开TCP连接
密钥协商阶段7.双方选择相同算法,并开始密钥交换。- 客户端从服务器的加密算法列表中选择共同支持的算法,双方开始密钥交换过程。
8. 双方:通过 Diffie-Hellman 计算共享密钥,双方计算出相同的共享密钥后,SSH协议进一步生成会话密钥- 使用Diffie-Hellman(或ECDH)协议,双方各自生成私钥和公钥,并通过交换公钥生成共享密钥,共享密钥相同生成会话密钥。会话密钥实际用于加密后续的会话。会话密钥的生成标志明文传输停止,之前的内容均为明文传输
认证阶段9. 客户端:发送自己的用户名和公钥,表明想要使用公钥认证- 若使用密码认证,则发送用户名,等待服务器的密码请求后,发送密码(已加密),服务器比较本地存储的用户名与密码进行验证,(可能存在服务器资源泄露问题,因此不如密钥认证安全)
10. 服务器:查看该公钥是否存在于它的authorized_keys文件中- (或其他配置中的授权密钥列表)如果匹配,服务器会生成一个挑战消息,并使用它来验证客户端的身份
11. 客户端使用私钥签名- 客户端使用与公钥对应的私钥对服务器的挑战消息进行签名,然后将签名结果发送给服务器
12. 服务器验证签名- 服务器使用客户端的公钥来验证这个签名。如果签名正确,说明客户端拥有与公钥匹配的私钥,认证通过
会话请求阶段13. 客户端:发送会话请求- 客户端告诉服务器它的操作意图,并根据双方的协商和服务器的配置确定接下来的通信形式
14.服务器:响应会话请求- 服务器根据情况接受或拒绝请求,或调整客户端要求分配的资源
交互会话阶段15. 双方:开始传输数据(如命令执行、文件传输)。- 双方在加密通道上开始安全地进行数据交互。 - 可以执行远程命令、文件传输(SFTP/SCP)或端口转发。
连接关闭阶段16. 客户端/服务器:主动关闭连接。- 当会话结束时,客户端或服务器主动发起关闭连接的请求,双方释放会话资源,断开连接。

密钥交换具体过程图解

通过巧妙且复杂的数学计算,实现无需通过不安全环境传递共享密钥,使双方获得会话密钥

https://download.huawei.com/mdl/image/download?uuid=780f1828d0844efa8017d840bf48d107

SSH密钥交换

注意:流程补充

在版本协商完成后,客户端会对服务器进行一个验证

客户端验证服务器

  • 在版本协商之后,服务器发送自己的公钥给客户端。
  • 客户端检查这个公钥是否与之前存储的(在~/.ssh/known_hosts中)一致。如果是首次连接,客户端会提示用户是否信任服务器的公钥。
  • 如果验证成功,客户端继续连接;否则连接被终止

SSH配置文件分析

包含其他配置文件

Include /etc/ssh/sshd_config.d/*.conf

这行配置指示SSH服务器从 /etc/ssh/sshd_config.d/ 目录下加载所有 .conf 文件。这种分离的配置文件结构便于管理多种设置。

端口与网络相关设置

#Port 22#AddressFamily any#ListenAddress 0.0.0.0#ListenAddress ::
  • Port 22: SSH服务器监听的端口号,默认是22。可以更改为其他端口以提高安全性。
  • AddressFamily: 定义使用的IP协议族,any表示支持IPv4和IPv6。
  • ListenAddress: 服务器监听的IP地址,0.0.0.0 表示监听所有IPv4地址,::表示监听所有IPv6地址。

HostKey配置

#HostKey /etc/ssh/ssh_host_rsa_key#HostKey /etc/ssh/ssh_host_ecdsa_key#HostKey /etc/ssh/ssh_host_ed25519_key
  • HostKey: 指定SSH服务器用于加密通信的主机密钥文件。通常有多种加密算法,如RSA、ECDSA、Ed25519,服务器根据这些文件来验证自身的身份。

密钥交换与加密设置

# Ciphers and keying#RekeyLimit default none
  • RekeyLimit: 控制多长时间或多少数据量后,重新生成会话密钥。默认情况下禁用。

日志记录

#SyslogFacility AUTH#LogLevel INFO
  • SyslogFacility: 定义SSH服务器的日志信息记录到系统日志的哪个部分。AUTH表示认证相关的日志。默认保存于/var/log/secure。
  • LogLevel: 设置日志的详细程度。INFO是默认级别,可以改为 DEBUG 以获得更多调试信息。

认证相关设置

#LoginGraceTime 2m#PermitRootLogin prohibit-password#StrictModes yes#MaxAuthTries 6#PubkeyAuthentication yes#MaxSessions 10
  • LoginGraceTime: 允许用户登录的时间限制,默认2分钟。
  • PermitRootLogin: 控制是否允许root用户登录。prohibit-password表示禁止通过密码登录,但允许其他方式(如公钥认证)。
  • StrictModes yes :是否让sshd去检查用户主目录或相关文件的权限数据。
  • MaxAuthTries: 登录认证失败的最大尝试次数,超过此值后SSH连接会断开。
  • PubkeyAuthentication: 是否允许使用公钥认证。
  • MaxSessions :允许的最大会话数。

授权文件

AuthorizedKeysFile      .ssh/authorized_keys
  • AuthorizedKeysFile: 指定用于存储用户公钥的文件,默认是用户家目录下的 .ssh/authorized_keys 文件。

密码与认证方式

#PasswordAuthentication yes#PermitEmptyPasswords no#KbdInteractiveAuthentication yes
  • PasswordAuthentication: 是否允许密码认证。设置为 no 可禁用密码认证,提高安全性。
  • PermitEmptyPasswords: 禁止使用空密码。
  • KbdInteractiveAuthentication: 是否启用键盘交互式认证。

PAM(Pluggable Authentication Modules)配置

#UsePAM no
  • UsePAM: 是否启用PAM模块,PAM是Linux系统的可插拔认证模块,用于处理认证和账户管理。大多数Linux系统建议启用PAM。

X11转发

#X11Forwarding no#X11UseLocalhost yes
  • X11Forwarding: 是否允许X11图形界面转发,允许用户通过SSH连接在本地显示远程服务器上的图形界面。
  • X11UseLocalhost: 限制X11转发仅在本地主机上使用。

客户端保持活动与断开连接

#ClientAliveInterval 0#ClientAliveCountMax 3
  • ClientAliveInterval: 指定服务器在不接收到客户端消息时发送心跳包的间隔时间,默认值为0表示禁用。
  • ClientAliveCountMax: 在未接收到客户端响应后,服务器允许发送的心跳包次数。超过此次数后,服务器将断开连接。

TCP保持活动

#TCPKeepAlive yes
  • TCPKeepAlive: 启用后,服务器会定期检查与客户端的连接是否仍然有效。如果连接断开,服务器会及时终止该连接。

Chroot目录

#ChrootDirectory none
  • ChrootDirectory: 指定将用户限制在特定目录下(chroot jail)。这个配置可以限制用户访问系统其他部分。

子系统

Subsystem       sftp    /usr/libexec/openssh/sftp-server
  • Subsystem: 定义SSH的子系统,如 sftp,用于文件传输。这里指定了SFTP服务器的路径。

用户特定设置

#Match User anoncvs#       X11Forwarding no#       AllowTcpForwarding no#       PermitTTY no#       ForceCommand cvs server
  • Match User: 为特定用户定义个性化设置。在此例中,用户 anoncvs 被禁止使用X11转发、TCP转发、TTY,并强制运行 cvs server 命令。

其他设置

#PermitTunnel no#PermitUserEnvironment no#Compression delayed#MaxStartups 10:30:100
  • PermitTunnel: 是否允许SSH隧道。
  • PermitUserEnvironment: 是否允许用户定义环境变量文件。
  • Compression: SSH会话的压缩策略,delayed 表示连接建立后再启用压缩。
  • MaxStartups: 限制并发的未认证连接数。

用户管理

AllowUsers user1 user2
#登录白名单(默认没有这个配置,需要自己手动添加),允许远程登录的用户。如果名单中没有的用户,则提示拒绝登录