远程登陆服务
远程登陆服务的基本概念
远程登录服务通过网络提供访问远程计算机的功能,用户可以像本地登录计算机一样,执行操作、管理系统和运行应用程序。用户使用客户端软件通过网络连接到运行远程登录服务的服务器,输入登录凭据(如用户名和密码),获得访问权限
远程登陆服务的功能
- 远程控制与管理:管理员远程进行系统维护、软件更新、性能监控等操作,无需物理接触设备
- 命令行操作:通过远程登录命令行界面,用户可以执行命令、管理文件、安装软件、调试程序等
- 文件传输与管理:远程登录服务通常提供文件传输功能,允许用户在本地计算机与远程服务器之间上传、下载和管理文件
- 跨平台支持:远程登录服务通常支持不同操作系统之间的交互
- 算力共享:远程登录服务支持用户访问和利用远程计算机的算力资源,进行复杂计算、数据分析、模型训练等
远程登陆协议的简介及发展
远程登陆协议可以根据不同的标准进行分类,主要根据连接协议、安全性、平台兼容性、功能及网络拓扑类型分类。
本文主要从连接协议的角度进行介绍,首先基于连接协议可以分为基于文本和图形界面两种,本文着重介绍基于文本远程登陆的协议。
基于连接协议分类
基于文本的远程登录
文本远程登陆主要用于命令行访问,适合远程管理和配置服务器等操作
- 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 简介与发展历史
- 诞生与发展:
Telnet于1969年发布,是早期的网络协议之一,设计用于提供远程终端连接,在1970年代和1980年代,Telnet广泛应用于互联网的早期阶段,尤其是在科研和教育领域,用于管理远程服务器、交换数据、测试网络连接等。 - 安全问题:
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
#登录白名单(默认没有这个配置,需要自己手动添加),允许远程登录的用户。如果名单中没有的用户,则提示拒绝登录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗