为什么学习ssh
学习SSH(Secure Shell)是非常重要的,因为它是一种安全的远程登录协议,用于通过网络安全地访问远程计算机或服务器。以下是学习SSH的一些重要原因:telent 登录服务器,账号密码信息,抓包工具,数据包,明文,账号密码了
- 安全性: SSH提供了加密的通信渠道,可以保护你的登录凭据和数据不被窃听或篡改。相比于传统的Telnet等协议,SSH提供了更高级别的安全性。
- 远程管理: 通过SSH,你可以远程连接到服务器或其他计算机,进行管理、维护和操作,而无需直接物理接触这些设备。这对于管理远程服务器和云实例来说是非常重要的。
- 文件传输: SSH不仅可以用于远程登录,还可以用于安全的文件传输。SCP(Secure Copy Protocol)和SFTP(SSH File Transfer Protocol)都是基于SSH的协议,用于在本地计算机和远程服务器之间安全地传输文件。
- 身份验证: SSH支持多种身份验证方式,包括基于密码的身份验证、基于密钥的身份验证等。使用密钥进行身份验证比基于密码的身份验证更安全,因为它们更难以被破解。
- 远程访问和协作: SSH使得远程团队可以安全地协作和共享资源。无论你身处何处,只要你有合适的SSH凭据,你就可以访问远程计算资源,与团队成员进行协作。
总的来说,学习SSH是提高计算机安全性、有效管理远程服务器和实现远程协作的重要一步。
什么是linux service
Linux service是在Linux操作系统中运行的一种后台进程或程序,通常负责在系统启动时自动启动、停止、重启、管理和监控各种服务、应用程序或守护进程。这些服务可以是网络服务、系统服务、应用程序服务等,用于提供各种功能和服务。
Linux service的特点包括:
- 后台运行: Linux service通常作为后台进程运行,不需要用户干预,可以在系统启动时自动启动并持续运行。
- 系统启动管理: Linux service可以在系统启动时被自动加载和启动,也可以手动启动或停止,通常通过系统启动管理工具(如systemd、SysVinit等)来管理。
- 监控和管理: Linux service通常由系统管理工具监控和管理,可以检查服务的状态、重新启动服务、停止服务等操作,以确保服务的正常运行。
- 提供各种功能: Linux service可以提供各种功能和服务,例如网络服务(如SSH、HTTP、FTP等)、数据库服务(如MySQL、PostgreSQL等)、系统监控服务(如Nagios、Zabbix等)等。
- 配置文件: Linux service通常通过配置文件进行配置,配置文件可以包含服务的启动参数、运行选项、日志输出等信息。
常见的Linux service管理命令包括:
systemctl: 用于管理systemd系统和服务管理器。service: 用于管理SysVinit系统服务。chkconfig: 用于管理SysVinit系统服务的运行级别。initctl: 用于管理Upstart系统服务。
总的来说,Linux service是Linux系统中运行的后台进程或程序,负责提供各种功能和服务,并通过系统管理工具进行监控和管理。
服务架构模型
服务架构模型是一种设计和组织服务的方法论,它通常包括定义服务、服务之间的通信、服务的部署和管理等方面。下面是一种常见的服务架构模型:
- 服务定义:
- 服务边界:确定每个服务的边界和职责,确保每个服务都有清晰的定义和范围。
- 服务接口:定义服务之间的接口,包括输入输出参数、通信协议等,以确保服务之间的互操作性。
- 服务标识:为每个服务分配唯一的标识符,通常使用URL、API端点或其他标识符来唯一标识服务。
- 服务通信:
- 同步通信:服务之间通过请求-响应方式进行同步通信,通常使用HTTP、RPC等协议。
- 异步通信:服务之间通过消息队列或事件总线进行异步通信,以实现解耦和异步处理。
- 服务部署:
- 微服务架构:将系统拆分为多个小型、自治的服务单元,每个服务单元都有自己的数据库和部署环境,通过轻量级通信协议进行通信。
- 服务容器化:使用容器技术(如Docker、Kubernetes等)将服务打包成容器,实现跨平台部署和弹性扩展。
- 服务治理:
- 服务注册与发现:使用服务注册表或服务发现机制,让服务能够自动注册和发现其他服务。
- 负载均衡:通过负载均衡器将请求分发到多个服务实例,以提高系统的可用性和性能。
- 故障处理:实现故障检测、自动恢复和服务降级等机制,以确保系统对故障的容错能力。
- 监控和治理:
- 服务监控:监控服务的运行状态、性能指标和日志,及时发现和解决问题。
- 日志管理:收集、存储和分析服务的日志信息,用于故障诊断和性能优化。
- 安全治理:实施访问控制、身份认证、数据加密等安全措施,保护服务和数据的安全性。
这些组成部分共同构成了一个完整的服务架构模型,帮助组织设计、开发和管理复杂的分布式系统。
B/S架构
B/S架构(Browser/Server Architecture)是一种常见的软件架构模式,通常用于开发Web应用程序。它将应用程序分为两个主要部分:客户端(浏览器)和服务器端。下面是B/S架构的主要特点和组成部分:
- 客户端(Browser):
- 用户界面:客户端通过Web浏览器向用户呈现用户界面,允许用户与应用程序进行交互。
- 动态页面:客户端可以使用HTML、CSS和JavaScript等技术创建动态页面,实现丰富的用户体验。
- 前端逻辑:客户端通常包含一些前端逻辑,用于处理用户输入、响应服务器请求以及与用户交互。
- 服务器端(Server):
- 业务逻辑:服务器端包含应用程序的业务逻辑,负责处理客户端发送的请求,执行相应的业务逻辑并返回结果。
- 数据存储:服务器端通常与数据库或其他数据存储系统集成,用于存储和检索应用程序所需的数据。
- 安全性:服务器端负责确保应用程序的安全性,包括对用户身份验证、访问控制、数据加密等方面的处理。
- 通信协议:
- HTTP/HTTPS:客户端和服务器之间通常使用HTTP或HTTPS协议进行通信。客户端通过发送HTTP请求来请求服务器端的资源或执行操作,服务器端则通过HTTP响应返回结果给客户端。
- 优点:
- 跨平台性:由于B/S架构是基于Web的,因此可以在各种操作系统和设备上运行,包括桌面计算机、移动设备等。
- 易于部署和更新:客户端只需一个浏览器,无需安装额外的软件,因此部署和更新都相对简单。
- 集中管理:所有的业务逻辑和数据都集中在服务器端管理,便于维护和管理。
- 缺点:
- 性能受限:客户端和服务器之间的通信可能会增加延迟,并且服务器端需要处理大量的请求,可能会影响性能。
- 安全性风险:由于客户端和服务器之间的通信是通过公共网络进行的,可能会存在安全性风险,如中间人攻击、数据泄露等。
总的来说,B/S架构是一种常见的Web应用程序架构模式,通过将应用程序分为客户端和服务器端来实现功能,具有跨平台性、易于部署和更新等优点,但也面临性能受限和安全性风险等挑战。

C/S架构

C/S架构(Client/Server Architecture)是一种计算机体系结构模型,它将一个系统划分为两个独立的部分:客户端(Client)和服务器端(Server)。在这种架构中,客户端负责向用户提供界面和交互功能,而服务器端则负责存储和处理数据、执行业务逻辑,并向客户端提供服务。
微信
qq
游戏
都装客户端
ssh服务,腾讯云sshd服务端进程----客户端登录,必须安装ssh命令,客户端软件
mysqld 云上装数据库服务端---客户端也必须安装mysql相关客户端,如命令,如代码,mysql客户端模块
服务端更新,客户端也要同步更新。
以下是C/S架构的一些关键特点:
- 分层结构:C/S架构通常是分层的,客户端和服务器端之间通过网络进行通信。客户端处理用户界面和用户交互,而服务器端负责数据存储和处理。
- 逻辑分离:C/S架构将系统的逻辑功能分布在客户端和服务器端,可以根据需要在两个部分进行独立的开发、测试和部署。
- 中心化管理:服务器端通常是中心化的,负责管理和维护系统中的数据和业务逻辑,以确保数据的一致性和安全性。
- 网络通信:客户端和服务器端通过网络进行通信,客户端向服务器端发送请求,并接收服务器端返回的响应。
- 分布式计算:虽然C/S架构是分层的,但并不一定要求服务器端和客户端在不同的物理设备上运行。在一些场景中,客户端和服务器端可能在同一台计算机上运行,也可以在不同的计算机上运行。
- 性能和可扩展性:C/S架构通常具有良好的性能和可扩展性,服务器端可以根据需要进行扩展,以满足不断增长的用户需求。
经典的C/S架构应用包括数据库管理系统(如MySQL、Oracle)、文件传输协议(如FTP)、邮件客户端等。这种架构模型适用于需要集中管理和处理大量数据的应用场景,例如企业级应用、金融系统等。
什么是linux端口
在计算机网络中,端口是一个逻辑概念,用于标识一台计算机上运行的特定应用程序或服务。
在Linux系统中,端口通常指的是网络通信中使用的端口号。端口号是一个16位的整数,范围从0到65535。端口号分为三类:
- 系统端口:系统端口(Well-known ports)范围从0到1023,这些端口号被标准化,用于一些常见的网络服务和协议,例如:
- 22:SSH(Secure Shell)服务
- 80:HTTP(HyperText Transfer Protocol)服务
- 443:HTTPS(HTTP Secure)服务
- 3306:MySQL数据库服务
- 等等
- 注册端口:注册端口(Registered ports)范围从
40000到49151,这些端口号分配给用户应用程序或服务,但并不被标准化。通常由软件开发者或组织负责分配和使用。java,python,40001测试,不会有冲突 - 动态/私有端口:动态/私有端口(Dynamic/Private ports)范围从49152到65535,用于临时分配给客户端程序,通常在客户端发起网络连接时使用。
- 一般网络链接,都是指
ip:port的互相链接,socket
在Linux系统中,端口号用于识别进程在网络上进行通信的目的地。
网站入口 ip/域名:80/443
通过监听指定的端口号,服务器程序可以接收来自客户端的连接请求,并提供相应的服务。
例如,Web服务器通常监听80端口以提供HTTP服务,SSH服务器通常监听22端口以提供安全Shell访问等。
要查看Linux系统上正在使用的端口号,可以使用诸如netstat、ss、lsof等命令,或者查看/etc/services文件来查找端口号和服务之间的对应关系。
linux常见服务和端口
在Linux系统中,有许多常见的服务与其相应的默认端口号。以下是一些常见的Linux服务及其默认端口号:
- SSH(Secure Shell):
- 端口号:22
- 用途:远程登录和安全Shell访问
- HTTP(HyperText Transfer Protocol):
- 端口号:80
- 用途:Web服务器默认端口,提供Web页面访问服务
- HTTPS(HTTP Secure):
- 端口号:443
- 用途:安全的Web服务器端口,通过SSL/TLS加密通信
- FTP(File Transfer Protocol):
- 端口号:20(数据传输)和21(控制连接)
- 用途:文件传输服务,允许客户端上传和下载文件
- SMTP(Simple Mail Transfer Protocol):
- 端口号:25
- 用途:用于发送电子邮件的邮件传输服务
- POP3(Post Office Protocol version 3):
- 端口号:110
- 用途:用于从邮件服务器接收电子邮件的服务
- IMAP(Internet Message Access Protocol):
- 端口号:143
- 用途:用于从邮件服务器接收电子邮件的服务,支持在多个客户端之间同步邮件状态
- DNS(Domain Name System):
- 端口号:53
- 用途:域名解析服务,将域名转换为IP地址
- MySQL数据库服务:
- 端口号:3306
- 用途:关系型数据库管理系统的默认端口号
- PostgreSQL数据库服务:
- 端口号:5432
- 用途:关系型数据库管理系统的默认端口号
这些是一些常见的Linux服务及其默认端口号,实际上,每个服务都可以配置在不同的端口上,但是这些端口号是它们通常使用的默认端口。
理解SSHD服务
SSHD服务是运行在Linux系统上的SSH(Secure Shell)守护进程,负责提供安全的远程访问和管理功能。以下是对SSHD服务的更详细解释:
- 安全远程访问:SSHD服务允许用户通过SSH协议安全地远程登录到Linux系统。SSH是一种加密的远程登录协议,它可以保护用户的登录凭据和通信内容,防止被窃听和篡改。
- 加密通信:SSHD服务通过使用加密算法(如AES、3DES等)对通信数据进行加密,以确保数据的安全性。这种加密通信方式可以防止中间人攻击和数据泄露。
- 身份验证:SSHD服务支持多种身份验证方式,包括
基于密码的身份验证、基于公钥的身份验证等。用户可以根据需要选择合适的身份验证方式进行登录。 - 远程管理:除了登录到系统,SSHD服务还可以用于远程管理和操作Linux系统。管理员可以通过SSH连接到远程服务器,执行命令、管理文件、配置服务等,而无需直接物理接触服务器。
- 配置和管理:SSHD服务的配置文件通常位于
/etc/ssh/sshd_config,管理员可以通过修改配置文件来配置SSH服务器的行为,例如更改监听端口、限制访问、禁用某些身份验证方式等。 - 日志记录:SSHD服务会记录用户的登录和操作日志,管理员可以通过查看日志文件(通常位于
/var/log/auth.log或/var/log/secure)来跟踪用户的登录和活动。
总的来说,SSHD服务是Linux系统中负责提供安全远程访问和管理功能的重要组件,它通过SSH协议实现加密通信和身份验证,使得用户可以安全地远程登录和管理Linux系统。
SSH用的什么加密算法
SSH(Secure Shell)使用了非对称加密算法。在SSH通信过程中,使用了公钥加密和私钥解密的方式来确保通信的安全性。这种加密方式使得SSH具有以下特点:
- 身份验证:SSH使用公钥加密和私钥解密的方式进行身份验证。客户端在连接时会向服务器发送公钥,而服务器则会使用已存储的相应私钥进行解密验证,以确认客户端的身份。
- 会话加密:一旦身份验证成功,SSH会话将使用对称加密算法(如AES)来加密通信数据。在会话期间,客户端和服务器之间的通信将使用相同的对称密钥进行加密和解密,以确保数据的安全性和保密性。
- 密钥交换:SSH还使用非对称加密算法进行密钥交换。在建立连接时,客户端和服务器会交换密钥,以便之后使用对称加密算法进行加密通信。
综上所述,SSH利用了非对称加密算法进行身份验证和密钥交换,并在建立连接后使用对称加密算法来保护通信数据的安全性。这种结合了非对称加密和对称加密的方式使得SSH成为一种安全可靠的远程登录协议。
什么是加密通信
加密通信是指在网络传输过程中使用加密算法对数据进行加密,以保护数据的隐私和完整性,防止被未授权的第三方窃听、篡改或伪造。加密通信可以在数据传输的每一个阶段对数据进行加密处理,包括数据的传输、存储和处理过程。
加密通信通常涉及以下几个重要的概念:
- 加密算法:加密通信使用加密算法对数据进行加密和解密。常见的加密算法包括对称加密算法(如AES、DES、3DES等)和非对称加密算法(如RSA、DSA、ECC等)。对称加密算法使用同一个密钥对数据进行加密和解密,而非对称加密算法使用一对密钥(公钥和私钥)对数据进行加密和解密。
- 密钥管理:加密通信中的密钥用于加密和解密数据。对称加密算法需要确保加密和解密双方共享同一个密钥,而非对称加密算法使用一对密钥(公钥和私钥),公钥用于加密数据,私钥用于解密数据。密钥管理包括密钥的生成、分发、存储和更新等过程,确保密钥的安全性和合理性。
- 数字签名:数字签名用于验证数据的完整性和真实性。发送方可以使用私钥对数据进行签名,接收方可以使用发送方的公钥验证签名的有效性。数字签名可以防止数据被篡改或伪造。
- 传输层安全协议(TLS):TLS是一种常见的加密通信协议,用于在网络传输过程中对数据进行加密和身份验证。TLS协议可以在传输层提供端到端的加密和认证,确保数据在传输过程中的安全性。
加密通信可以应用于各种场景,例如网页浏览、电子邮件、远程登录、文件传输等,以保护用户的隐私和数据安全。通过使用合适的加密算法和协议,可以有效地防止数据被窃听、篡改或伪造。
对称加密算法
对称加密算法是一种加密技术,它使用相同的密钥(称为对称密钥)对数据进行加密和解密。在对称加密算法中,发送方和接收方必须使用相同的密钥来加密和解密数据。常见的对称加密算法包括:
- AES(Advanced Encryption Standard):AES是一种流行的对称加密算法,被广泛用于保护敏感数据的安全性。它支持不同的密钥长度(128位、192位、256位),具有高效的加密和解密速度,并且在安全性方面表现良好。
- DES(Data Encryption Standard):DES是一种较早的对称加密算法,使用56位密钥对数据进行加密和解密。由于DES的密钥长度较短,易受到暴力破解和密码分析的攻击,因此已经不推荐作为安全加密算法使用。
- 3DES(Triple DES):3DES是对DES算法的改进,它多次对数据进行DES加密,提高了加密的安全性。3DES使用两个密钥或三个密钥(每个密钥56位)进行加密和解密,虽然比单一DES更安全,但由于计算复杂度较高,逐渐被更先进的加密算法所取代。
- RC4(Rivest Cipher 4):RC4是一种流式加密算法,被广泛用于加密通信协议(如TLS/SSL)中。尽管RC4在过去被广泛使用,但由于存在一些安全漏洞,已经不推荐作为安全加密算法使用。
对称加密算法具有加密和解密速度快、计算量小的优点,适合对大量数据进行加密和解密。然而,对称加密算法面临的主要挑战是密钥管理问题,即如何安全地管理和分发密钥,以确保通信的安全性。

1.于超想和一个美女,杰西卡打招呼,但是又怕被女朋友发现,因此于超用了一个加密算法,比如通过一个密钥A来给打招呼的信息加密,得到一个密文数据,其他人是看不懂的,再发给这位外国美女杰西卡。
2.杰西卡收到消息后,必须通过同样的密钥A解密,才能看懂这句话,"交个朋友吧"

对称加密过程
对称加密是一种加密技术,它使用相同的密钥来进行加密和解密。下面是对称加密的基本过程:
- 密钥生成:首先,参与通信的双方需要协商并共享一个相同的密钥。这个密钥可以由通信双方提前协商好并安全地分发,或者通过其他安全的方式生成和交换。
- 加密:发送方使用共享的密钥将明文数据进行加密。加密过程中,明文数据和密钥作为输入,加密算法对明文数据进行处理,生成密文数据。
- 传输:加密后的密文数据通过不安全的通信渠道传输给接收方。
- 解密:接收方使用相同的密钥对接收到的密文数据进行解密。解密过程中,密文数据和密钥作为输入,解密算法对密文数据进行处理,恢复出原始的明文数据。
对称加密的特点是加密和解密使用相同的密钥,因此在数据传输过程中,发送方和接收方都必须共享同一个密钥。此外,对称加密算法通常具有较快的加密和解密速度,适用于对大量数据进行加密和解密的场景。
然而,对称加密算法面临一个重要的挑战,即密钥的安全性和分发问题。由于加密和解密使用相同的密钥,因此必须确保密钥在传输过程中不被窃听或篡改,同时要保证密钥只能被合法的通信双方知晓。密钥管理是对称加密算法的一个关键问题,通常需要借助安全协议和机制来确保密钥的安全性。
非对称加密算法
非对称加密算法是一种密码学技术,它使用一对密钥来进行加密和解密,这对密钥分别称为公钥(public key)和私钥(private key)。这种加密方式也被称为公钥加密算法。
常见的非对称加密算法包括:
- RSA(Rivest-Shamir-Adleman):RSA是一种基于大素数因子分解的加密算法,它广泛应用于安全通信领域,如SSL/TLS协议、SSH协议等。
- DSA(Digital Signature Algorithm):DSA是一种数字签名算法,用于生成和验证数字签名。它通常与哈希函数一起使用来确保数据的完整性和真实性。
- ECC(Elliptic Curve Cryptography):ECC是一种基于椭圆曲线离散对数问题的加密算法,它在相同安全级别下需要更短的密钥长度,因此在资源受限的环境中具有较高的效率。
这些非对称加密算法具有以下特点:
- 加密和解密使用不同的密钥:使用公钥加密的数据只能使用相应的私钥进行解密,反之亦然。因此,公钥可以公开分享给其他用户,而私钥则必须保密保存。
- 数字签名:非对称加密算法通常与数字签名结合使用,用于生成和验证数字签名,以确保数据的完整性和真实性。
- 密钥交换:非对称加密算法还可以用于密钥交换过程,以便双方在通信过程中协商共享对称密钥,用于后续的对称加密通信。
非对称加密算法在网络安全领域中起着至关重要的作用,它们提供了一种安全可靠的方式来保护数据的机密性和完整性。

非对称加密过程
非对称加密是一种使用一对密钥来进行加密和解密的加密技术。其中一把密钥是公开的(公钥),另一把密钥是保密的(私钥)。下面是非对称加密的基本过程:
- 密钥生成:首先,每个通信实体生成一对非对称密钥,包括一个公钥和一个私钥。公钥可以自由分发,而私钥则必须严格保密。
- 加密:发送方使用接收方的公钥对明文数据进行加密。加密过程中,明文数据和接收方的公钥作为输入,加密算法对明文数据进行处理,生成密文数据。
- 传输:加密后的密文数据通过不安全的通信渠道传输给接收方。
- 解密:接收方使用自己的私钥对接收到的密文数据进行解密。解密过程中,密文数据和接收方的私钥作为输入,解密算法对密文数据进行处理,恢复出原始的明文数据。
非对称加密的特点是加密和解密使用不同的密钥,公钥用于加密数据,私钥用于解密数据。由于私钥必须严格保密,因此即使公钥被窃听,也不会导致数据泄露。非对称加密算法通常用于身份验证、密钥协商和数字签名等场景。
然而,非对称加密算法通常比对称加密算法慢得多,因此对于大量数据的加密和解密操作可能会影响性能。因此,在实际应用中,通常会结合对称加密和非对称加密,使用对称加密算法来加密数据,而使用非对称加密算法来加密对称密钥,以确保通信的安全性和效率。
对称、非对称加密的区别
对称加密和非对称加密是两种不同的加密技术,它们在加密和解密过程以及密钥管理方面存在明显的区别。
- 密钥数量:
- 对称加密:使用相同的密钥进行加密和解密,即发送方和接收方共享同一个密钥。
- 非对称加密:使用一对密钥进行加密和解密,其中一个是公钥(公开),另一个是私钥(保密)。
- 加密速度:
- 对称加密:通常加密和解密速度较快,因为只使用一个密钥。
- 非对称加密:通常加密和解密速度较慢,因为使用了复杂的数学算法。
- 密钥管理:
- 对称加密:需要在通信双方之间共享密钥,且密钥必须保密传输。
- 非对称加密:发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。公钥可以公开分享,而私钥必须保密保存。
- 安全性:
- 对称加密:密钥管理是对称加密的主要挑战,因为密钥必须在通信双方之间共享,并确保安全传输。
- 非对称加密:由于使用了一对密钥,非对称加密算法具有更高的安全性,即使公钥被窃听,也不会泄露敏感信息。
- 用途:
- 对称加密:通常用于加密大量数据,如文件传输和数据存储等。
- 非对称加密:通常用于身份验证、密钥协商和数字签名等场景。
综上所述,对称加密和非对称加密各有其优缺点,可以根据具体的应用场景和安全需求选择合适的加密技术。在实际应用中,通常会结合使用对称加密和非对称加密,以兼顾安全性和效率。
首先,运维软件,怎么用,比较简单
ssh远程登录
客户端
ssh -p 22 用户@服务器地址
- 信任指纹
- 输入密码/凭证
登录过程原理,有点难度
SSH登录是哪种加密形式
SSH登录使用了非对称加密形式。
SSH协议在通信的过程中,使用了非对称加密算法来进行身份验证和密钥交换,以确保通信的安全性。
下面是SSH登录过程中非对称加密的应用:
密钥交换:在SSH连接建立过程中,客户端和服务器会交换
密钥信息。这个过程通常使用非对称加密算法来进行,例如RSA算法。在密钥交换的过程中,服务器会将自己的公钥发送给客户端,客户端使用服务器的公钥来加密一个随机生成的密钥,并将其发送给服务器。- 服务器使用自己的私钥来解密这个密钥,从而双方都获得了共享的对称密钥。
身份验证:在密钥交换完成后,客户端会使用公钥加密的方式向服务器发送身份验证信息。服务器使用自己的私钥来解密这些信息,以验证客户端的身份。这个过程通常是使用公钥认证进行的,可以在SSH配置中设置允许的公钥列表。
- 会话加密:一旦身份验证成功,客户端和服务器之间的通信会使用对称加密算法进行加密和解密,以确保通信数据的安全性。SSH协议支持多种对称加密算法,如AES、3DES等。
因此,SSH登录过程中使用了非对称加密算法来进行密钥交换和身份验证,以及对称加密算法来保护会话数据的安全性。这种组合方式使得SSH登录具有较高的安全性,能够有效地保护用户的隐私和数据安全。
SSH认证方式
SSH(Secure Shell)提供了多种身份验证方式,以确保只有授权的用户可以访问系统。以下是SSH认证方式的几种常见方式:
- 密码认证:
- 用户需要提供正确的用户名和密码才能登录到系统。
- 这是最常见的认证方式之一,但安全性较低,容易受到密码猜测和字典攻击的影响。
- 可以通过强制密码复杂度和限制登录尝试次数等方式增强安全性。
禁止root密码直接登录,只能用普通用户登录,要加强密码复杂度
公钥认证:
- 1.用户在
客户端生成一对公钥和私钥。免密登录配置流程 - 将
客户端公钥传输到服务器上的authorized_keys文件中。 - 用户通过
私钥对连接请求进行签名,服务器使用对应的公钥验证签名,从而实现身份认证。 - 这种方式相比密码认证更安全,因为
私钥保存在客户端,不会被传输到服务器上。
- 1.用户在
- 基于密钥的身份验证:
- 类似于公钥认证,但是密钥对的生成和管理更加复杂和安全。
- 可以使用硬件安全模块(HSM)等工具来存储和保护密钥。
- Kerberos认证:
- 使用Kerberos认证服务器来颁发票据(ticket)进行身份验证。
- 通常用于企业内部网络环境中,提供单点登录和强化身份验证。
- 双因素认证:
- 将两种或多种不同类型的身份验证方式结合使用,以提高安全性。
- 例如,结合密码和OTP(一次性密码)认证,或结合密码和硬件令牌认证等。
- 密钥交换认证:
- 在SSH连接建立时,使用DH密钥交换算法来进行密钥协商。
- 它不直接用于身份验证,而是用于生成对称密钥,用于后续的对称加密通信。
以上是SSH常见的几种身份验证方式,可以根据实际需求和安全要求选择合适的认证方式来保护系统的安全。

登录过程
以下是使用SSH命令行工具实施SSH认证的具体过程:
- 密码认证:
ssh username@hostname
在这个命令中,用户使用ssh命令连接到指定的主机。然后系统会提示用户输入密码。如果输入的密码正确,用户就能够成功登录到远程主机。
- 公钥认证:
ssh -i path/to/private_key username@hostname
在这个命令中,用户使用-i参数指定私钥文件的路径,而不是使用密码进行认证。SSH客户端会使用私钥对连接请求进行签名,远程主机会使用事先在authorized_keys文件中设置好的公钥进行验证。如果验证通过,用户就能够登录到远程主机。
这是一个典型的公钥认证的命令示例,但实际过程中,公钥通常在~/.ssh/目录下,私钥在本地客户端的相应目录下。
- 密钥交换认证: 在SSH连接建立的过程中,密钥交换认证是由SSH协议本身完成的,不需要用户手动操作。在建立连接时,客户端和服务器会协商并生成一个共享的对称密钥,用于后续的通信数据加密。
这些是SSH认证过程的基本示例,实际情况可能会根据系统配置和安全策略的不同而有所变化。SSH客户端工具提供了多种选项和参数来支持不同的认证方式和安全配置。
更简单的理解ssh加密通信
SSH(Secure Shell)非对称加密的过程可以用一个简单的类比来理解,这个类比涉及到一个信箱和两把钥匙:一个公钥(public key)和一个私钥(private key)。这两把钥匙是成对出现的,公钥可以被任何人使用,但私钥必须保密。
创建钥匙对(密钥对)
- 制作钥匙对:首先,创建一对密钥,就像制作一把可以打开特定信箱的两把钥匙。其中一把钥匙是公开的(公钥),可以给任何人;另一把钥匙是保密的(私钥),只有信箱的主人可以持有。
使用公钥加密
- 发送方使用公钥加密信息:当别人想要给你发送一封密信时,他们会用你的公钥(就像是公共钥匙)来“锁上”这封信。一旦使用公钥加密,这封信就只能用与之配对的私钥打开了,就像一个使用特定钥匙锁上的信箱。
使用私钥解密
- 接收方使用私钥解密信息:由于只有你拥有私钥,所以只有你能“解锁”这封信,阅读其内容。这就确保了信息的安全性,因为即便别人截获了这封信,没有私钥也无法解读其内容。
验证身份(可选的额外步骤)
- 使用私钥签名,公钥验证签名:此外,发送方还可以使用自己的私钥对信息进行签名,这是一个证明信息确实来自于发送方的方法。接收方可以用发送方的公钥来验证签名是否有效。这个过程确保了信息不仅是安全的,而且还能确认是谁发送的。
通过这个类比,SSH的非对称加密流程就变得更加容易理解了。它通过使用两把钥匙——一把公钥和一把私钥——来确保数据的安全传输和身份验证,从而保护通信不被未授权的第三方访问。
免密登录配置流程-实战
1.客户端生成公私钥
root@yu-ubuntu:~/.ssh# ssh-keygen
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:
SHA256:jeiLEK0aHyQgXCcFS3r1+VEStncY1h+25uyAFjXFX/Y root@yu-ubuntu
The key's randomart image is:
+---[RSA 3072]----+
| =o+ +.+. o. |
|. + = . o = o+ +o|
|oo o o o o..+.*|
|o .. ..oo.. +E|
|. o . . S.. o + |
| o o . o . o |
|. + . . o |
| + o . . . |
|. . . . |
+----[SHA256]-----+
root@yu-ubuntu:~/.ssh#
root@yu-ubuntu:~/.ssh# ls -l
total 8
-rw------- 1 root root 0 Jul 8 2022 authorized_keys # 受信任的公钥(客户端)
-rw------- 1 root root 2602 Apr 9 14:11 id_rsa # 私钥
-rw-r--r-- 1 root root 568 Apr 9 14:11 id_rsa.pub # 公钥
# 2.客户端吧自己的公钥,发给目标主机
目标主机,检查自己的受信任的公钥文件
root@VM-8-7-ubuntu:~/.ssh# ls -a
. .. authorized_keys known_hosts known_hosts.old
root@VM-8-7-ubuntu:~/.ssh#
root@VM-8-7-ubuntu:~/.ssh#
root@VM-8-7-ubuntu:~/.ssh# cat authorized_keys # 存放客户端的公钥(非对称加密生成)
root@VM-8-7-ubuntu:~/.ssh#
root@VM-8-7-ubuntu:~/.ssh#
root@VM-8-7-ubuntu:~/.ssh# cat known_hosts #(本机链接过的其他服务器的公钥)
# 我的本地虚拟机,想要免密登录,腾讯云ubuntu
# 本地虚拟机,吧自己公钥发给腾讯云
# 但是注意,目标服务器接受的公钥,是什么用户的(1.root全程操作 2.普通用户操作)
# 我本地虚拟机,通过ubuntu普通用户,远程登录腾讯云服务器(云机器,ssh安全策略,禁止了root登录)
root@yu-ubuntu:~/.ssh# ls -l
total 8
-rw------- 1 root root 0 Jul 8 2022 authorized_keys
-rw------- 1 root root 2602 Apr 9 14:11 id_rsa
-rw-r--r-- 1 root root 568 Apr 9 14:11 id_rsa.pub
root@yu-ubuntu:~/.ssh#
root@yu-ubuntu:~/.ssh# # 吧客户端的公钥,发给远程主机,ubuntu用户下的.ssh
root@yu-ubuntu:~/.ssh# ssh-copy-id ubuntu@49.232.220.205
# 首次链接新的机器,目标主机的指纹,会被写入本地机器的know_hosts文件
root@yu-ubuntu:~/.ssh# ssh-copy-id ubuntu@49.232.220.205
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '49.232.220.205 (49.232.220.205)' can't be established.
ED25519 key fingerprint is SHA256:1O5xm70JvmT8beHoPphYEgFzFx9/oq34fV0exSICHIU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ubuntu@49.232.220.205's password:
# 当上一步的公钥确认后,你需要输入目标机器的密码,以此有权限,吧你本地生成的 非对称加密的公私钥,发给目标主机
oot@yu-ubuntu:~/.ssh# ssh-copy-id ubuntu@49.232.220.205
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ubuntu@49.232.220.205's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ubuntu@49.232.220.205'"
and check to make sure that only the key(s) you wanted were added.
root@yu-ubuntu:~/.ssh#
# 此时,你客户端的 .pub文件,就写入了目标机器的 authorized_keys
# 验证下结果
# 本地公钥
root@yu-ubuntu:~/.ssh# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDoYtzUUKPwAkqZOaQ/HNLekHGxoW0meX/V8P3i17i5XAdSt3Jo2qxsxjvx1nVE2J9iJZ6XzDKH5WMh/eINNJ8MVI0CIdYF7b+pzLF2x3yzV1/gYAVz/gpGdyrTgkfN4dzi1EkEgmfv4KsdGcsKG7Cj/eqABp5Kgj//qeANk8p4abGzttJcaldVFK/6R+D8ptDxYyRzhgPmkuVYuG4t/P/JA5cxNGL1FAJqEiCO2JLaQESpGE/G5RvWDKvI/OcPCTXNsZuj/XVNVc4A2TWwJIBhjKlECrHpZLcfyZHI8CF5lDTU2JaUaLkBC+DpI8O/egqUjrZI8OoUCo0NpTLhzUa3MjzI9YBt6L4gmDZx0Gxqv6bun4okCDm50StLZVFHtNvbRti0+Eb09Xo8PnQSmBkcIWCq18MCBSDW2DJ7iC3W4HsJYWkC8pzyq3Kf9Ou0igfX3Ee7NSQvjs0rHcwZM5eDuVbgqdzBEvUsbztHyEXs0owg9QNHl++Y4+XZCAHUJ2c= root@yu-ubuntu
# 远程主机公钥查看,注意,以ubuntu用户登录,记录在ubuntu用户家目录的.ssh
ubuntu@VM-8-7-ubuntu:~$ cd .ssh
ubuntu@VM-8-7-ubuntu:~/.ssh$ pwd
/home/ubuntu/.ssh
ubuntu@VM-8-7-ubuntu:~/.ssh$ ls -a
. .. authorized_keys
ubuntu@VM-8-7-ubuntu:~/.ssh$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDoYtzUUKPwAkqZOaQ/HNLekHGxoW0meX/V8P3i17i5XAdSt3Jo2qxsxjvx1nVE2J9iJZ6XzDKH5WMh/eINNJ8MVI0CIdYF7b+pzLF2x3yzV1/gYAVz/gpGdyrTgkfN4dzi1EkEgmfv4KsdGcsKG7Cj/eqABp5Kgj//qeANk8p4abGzttJcaldVFK/6R+D8ptDxYyRzhgPmkuVYuG4t/P/JA5cxNGL1FAJqEiCO2JLaQESpGE/G5RvWDKvI/OcPCTXNsZuj/XVNVc4A2TWwJIBhjKlECrHpZLcfyZHI8CF5lDTU2JaUaLkBC+DpI8O/egqUjrZI8OoUCo0NpTLhzUa3MjzI9YBt6L4gmDZx0Gxqv6bun4okCDm50StLZVFHtNvbRti0+Eb09Xo8PnQSmBkcIWCq18MCBSDW2DJ7iC3W4HsJYWkC8pzyq3Kf9Ou0igfX3Ee7NSQvjs0rHcwZM5eDuVbgqdzBEvUsbztHyEXs0owg9QNHl++Y4+XZCAHUJ2c= root@yu-ubuntu
ubuntu@VM-8-7-ubuntu:~/.ssh$
# 你就可以用客户端机器,免密登录 目标服务器,以ubuntu普通用户,而无需输入密码了
# 已经完成免密登录()
# 练习题,根据ubuntu普通用户登录的流程,再做一个root用户免密登录的流程
# 并且,自己准备2个机器,互相免密登录配置,再次强化免密登录流程,以及设计的配置文件
ssh登录原理实践
这段信息是SSH客户端在首次连接到远程主机时的安全警告信息。让我逐步解释其中的含义:
- The authenticity of host '49.232.220.205 (49.232.220.205)' can't be established.
这句话表示当前连接的主机是
49.232.220.205,但是该主机的身份验证信息(也就是指其公钥)在本地的known_hosts文件中没有记录,即客户端没有该主机的公钥信息。 - ED25519 key fingerprint is SHA256:qTRBZFCXwKhmRpggMwac2v1hKFL9fIDPIYzBbjTvBt8. 这里显示了远程主机使用的公钥的摘要信息(指纹)。ED25519是一种非对称加密算法,而SHA256是摘要算法的名称,后面的一串字符是远程主机公钥的具体指纹。
- This key is not known by any other names
这句话说明这个公钥并没有被其他别名所知晓,也就是说,这个公钥并没有在
known_hosts文件中以别的名字出现过。 - Are you sure you want to continue connecting (yes/no/[fingerprint])?
这句话是询问用户是否确定要继续连接到远程主机。用户可以输入
yes确认连接,输入no取消连接,或者输入fingerprint来查看远程主机的公钥指纹。
这个警告信息的目的是确保用户在连接到远程主机时了解远程主机的身份验证信息,并确认是否愿意与之建立连接。通常情况下,如果用户知道自己是在安全的环境下,可以输入 yes 来继续连接。
root@yuchao-linux-2024:~# ssh ubuntu@49.232.220.205
The authenticity of host '49.232.220.205 (49.232.220.205)' can't be established.
ED25519 key fingerprint is SHA256:qTRBZFCXwKhmRpggMwac2v1hKFL9fIDPIYzBbjTvBt8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '49.232.220.205' (ED25519) to the list of known hosts.
ubuntu@49.232.220.205's password:
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-94-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sun Mar 24 04:01:49 PM CST 2024
System load: 0.080078125 Processes: 131
Usage of /: 9.7% of 58.94GB Users logged in: 1
Memory usage: 25% IPv4 address for eth0: 10.0.8.7
Swap usage: 0%
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Last login: Sun Mar 24 16:00:31 2024 from 106.40.205.29
ubuntu@yuchao-linux-2024:~$
这段交互是用户通过SSH连接到远程主机时的典型过程。让我逐步解释其中的步骤:
- The authenticity of host '49.232.220.205 (49.232.220.205)' can't be established.
此行表示SSH客户端无法确认远程主机的身份,因为它在本地的
known_hosts文件中找不到该主机的记录。 - ED25519 key fingerprint is SHA256:qTRBZFCXwKhmRpggMwac2v1hKFL9fIDPIYzBbjTvBt8. 这行显示了远程主机的公钥指纹,以便用户核实连接的主机是否与预期的主机相匹配。
- This key is not known by any other names
这个提示表明,此公钥没有被其他名称所知,即在
known_hosts文件中没有别的记录与此公钥相关联。 - Are you sure you want to continue connecting (yes/no/[fingerprint])?
这是SSH客户端询问用户是否确定要继续连接到远程主机。用户可以输入
yes确认连接,或者输入no取消连接。另外,用户还可以输入fingerprint来查看远程主机的公钥指纹,以确保连接的主机是预期的主机。 - Warning: Permanently added '49.232.220.205' (ED25519) to the list of known hosts.
用户输入了
yes后,SSH客户端将远程主机的公钥添加到本地的known_hosts文件中,以便以后的连接不再提示身份验证警告。 - ubuntu@49.232.220.205's password: SSH客户端提示用户输入远程主机的密码,以完成身份验证,如果密码正确,用户将成功登录到远程主机。
这个过程确保了用户连接到的是预期的远程主机,并通过密码进行了身份验证,从而确保了通信的安全性。
检查ssh公私钥目录
这段交互展示了用户 root 在本地主机 yuchao-linux-2024 上的 .ssh 目录的内容以及 known_hosts 文件的内容。
authorized_keys:这个文件用于存储允许通过公钥认证登录的用户公钥。known_hosts:这个文件用于存储已知的远程主机的公钥信息,以确保连接到远程主机时能够进行身份验证。known_hosts.old:这个文件可能是known_hosts文件的备份或先前版本。
现在让我们来解释 known_hosts 文件中的内容:
- 每一行代表一个已知的远程主机的公钥信息。
- 每行包含三部分:主机名(或主机的 IP 地址)、公钥算法和公钥。
- 在你的示例中,有三个远程主机的公钥信息。
- 每个远程主机的公钥信息都是由空格分隔的。
- 公钥信息的最后一部分是经过 Base64 编码的公钥。
总的来说,.ssh 目录中的这些文件是SSH客户端用来进行安全连接的关键文件,known_hosts 文件特别用于存储已知的远程主机的公钥信息,以确保安全连接。
SSHD服务端配置
要搭建SSH(Secure Shell)服务端,你需要在你的服务器上安装并配置SSH服务器软件。常见的SSH服务器软件包括OpenSSH。以下是在Linux系统上使用OpenSSH搭建SSH服务端的简单步骤:
安装OpenSSH服务器: 在大多数Linux发行版中,OpenSSH都是默认安装的,但如果你的系统中没有安装,你可以通过包管理器来安装。例如,在Ubuntu或Debian系统上,你可以运行以下命令来安装OpenSSH服务器:
sudo apt-get update sudo apt-get install openssh-server在其他发行版上,使用相应的包管理器来安装OpenSSH。
配置SSH服务器: 默认情况下,OpenSSH安装完成后应该可以工作,但你可能需要对其进行一些基本配置。主要的配置文件是
/etc/ssh/sshd_config。你可以使用文本编辑器(如nano或vi)编辑这个文件,根据你的需求进行配置。例如,你可以更改SSH端口、禁用root登录、配置密钥认证等。启动SSH服务: 安装完成后,SSH服务应该会自动启动。如果没有,请使用以下命令手动启动SSH服务:
sudo service ssh start或者,如果你使用的是systemd,则可以使用以下命令:
sudo systemctl start ssh防火墙设置: 如果你的服务器上启用了防火墙,确保允许SSH流量通过。默认情况下,SSH使用的端口是22。如果你更改了SSH端口,请确保在防火墙设置中相应地更新。
在使用ufw防火墙的Ubuntu系统上,你可以运行以下命令允许SSH流量:
sudo ufw allow ssh测试SSH连接: 安装和配置完成后,你可以使用SSH客户端测试连接到你的服务器。在终端中运行以下命令:
ssh username@your_server_ip替换
username为你的用户名,your_server_ip为你的服务器IP地址。如果一切设置正确,你应该能够成功连接到你的服务器。
通过这些步骤,你应该能够在你的服务器上成功搭建SSH服务端。记得在配置和管理SSH服务时保持安全意识,以确保服务器的安全性。
sshd进程
root@yuchao-linux-2024:~# ps aux|grep ssh
root 854 0.0 0.1 15432 6476 ? Ss Mar16 0:06 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 3019929 0.0 0.3 17188 10800 ? Ss 16:00 0:00 sshd: ubuntu [priv]
ubuntu 3020012 0.0 0.2 17320 7932 ? S 16:00 0:00 sshd: ubuntu@pts/0
root 3020073 0.0 0.2 14320 8316 pts/1 S+ 16:00 0:00 ssh ubuntu@49.232.220.205
root 3020074 0.0 0.3 17192 10840 ? Ss 16:00 0:00 sshd: ubuntu [priv]
ubuntu 3020411 0.0 0.2 17324 8168 ? S 16:01 0:00 sshd: ubuntu@pts/2
root 3022307 0.0 0.0 6612 2344 pts/3 S+ 16:09 0:00 grep --color=auto ssh
root@yuchao-linux-2024:~#
根据你提供的输出,你的系统中已经在运行SSH服务。下面是一些解释:
- 第一行显示了一个名为
sshd的进程,这是SSH守护程序(服务端)的主进程。该进程监听着来自客户端的连接请求。 - 第二行和第三行显示了一个名为
sshd的进程,其父进程ID(PPID)为854,这表示这是一个新的SSH会话。这个会话由ubuntu用户启动,并且有一个私有进程(privilege separation)。这个会话连接的客户端是通过pts/0虚拟终端。 - 第四行显示了一个正在运行的SSH客户端连接,连接到IP地址为49.232.220.205的服务器。这个连接是由root用户通过ssh命令启动的。
- 第五行和第六行显示了另一个新的SSH会话,由
ubuntu用户启动,并且连接到pts/2虚拟终端。 - 最后一行是你执行的grep命令本身,用于查找包含"ssh"关键字的进程。
综上所述,你的系统中有多个SSH会话正在运行,其中一些是由ubuntu用户启动的,另一些是由root用户启动的。
ssh配置文件
root@yuchao-linux-2024:~# ls /etc/ssh/
moduli sshd_config ssh_host_dsa_key.pub ssh_host_ed25519_key ssh_host_rsa_key.pub
ssh_config sshd_config.d ssh_host_ecdsa_key ssh_host_ed25519_key.pub ssh_import_id
ssh_config.d ssh_host_dsa_key ssh_host_ecdsa_key.pub ssh_host_rsa_key
这些文件是OpenSSH服务的关键配置文件和密钥文件。以下是每个文件的简要说明:
- moduli: 包含了用于Diffie-Hellman密钥交换的素数(moduli)。这是为了安全性考虑而随机生成的,并且在服务器端和客户端之间交换以进行密钥交换。
- ssh_config: 这是SSH客户端的全局配置文件。它包含了客户端使用的各种配置选项,比如远程主机的连接配置。
- sshd_config: 这是SSH服务器的主要配置文件。它包含了服务器的各种配置选项,如端口号、认证方式、访问限制等。
- sshd_config.d: 这是一个目录,包含了SSH服务器的额外配置文件。在某些系统中,管理员可以将特定配置放在这个目录中,以便更好地组织和管理配置。
- sshhost*_key: 这些文件包含了SSH服务器使用的主机密钥。不同类型的密钥文件包括
ssh_host_rsa_key(RSA密钥)、ssh_host_dsa_key(DSA密钥)、ssh_host_ecdsa_key(ECDSA密钥)和ssh_host_ed25519_key(Ed25519密钥)。这些密钥用于对连接进行加密和验证服务器身份。 - sshhost*_key.pub: 这些文件包含了对应私钥文件的公钥。公钥通常用于验证服务器身份。
- ssh_import_id: 这是一个可选的文件,包含了SSH密钥的标识信息。这些信息可能会被一些密钥管理工具使用。
这些文件在搭建和配置SSH服务器时都非常重要,可以通过编辑这些文件来自定义SSH服务器的行为和功能。
常见ssh安全优化
对SSH进行安全优化是非常重要的,特别是在公共网络上运行的服务器。以下是一些常见的SSH安全优化措施:
- 使用密钥认证: 禁用密码认证,只允许使用SSH密钥对进行身份验证。密钥对通常比密码更安全,因为它们更难以猜测或破解。确保生成并使用足够强度的密钥,如RSA、DSA、ECDSA或Ed25519。
- 禁用root登录: 在SSH服务器上禁用直接使用root账户登录。通过禁用root登录,可以减少潜在的攻击面,因为攻击者必须先获取普通用户权限,然后再升级为root。
- 限制用户访问: 通过配置
AllowUsers或AllowGroups选项,限制可以访问SSH服务器的用户或用户组。这有助于防止未经授权的用户登录到服务器上。 - 更改SSH端口: 将SSH服务监听的端口更改为非标准端口,这可以减少被自动扫描工具发现的风险。但请注意,这并不能提供真正的安全性,因为有些攻击者会对所有端口进行扫描。
- 使用防火墙: 配置防火墙以限制对SSH服务的访问。只允许来自信任IP地址范围的连接,并限制连接速率,以防止暴力破解尝试。
- 定期更新软件: 及时更新操作系统和SSH服务器软件,以修补已知的安全漏洞并提高系统安全性。
- 监控和日志记录: 启用SSH服务器的日志记录,并监控SSH登录活动。这样可以帮助你及时发现异常登录尝试或其他安全事件。
- 使用SSH代理: 如果需要在多台服务器之间进行安全的身份验证和数据传输,考虑使用SSH代理和跳板主机来管理访问权限。
- 启用两步验证: 对于对安全性要求更高的环境,可以考虑启用SSH的两步验证(2FA)。这样即使攻击者获取了SSH密钥,也需要额外的身份验证步骤才能成功登录。
- 审查SSH配置: 定期审查SSH服务器的配置文件,确保没有意外的漏洞或安全风险存在。
通过采取这些安全措施,可以大大提高SSH服务器的安全性,并减少受到未经授权访问或攻击的风险。
sshd实践
当优化SSH服务器的配置时,你可以通过编辑sshd_config文件来增强安全性并降低风险。以下是一些常见的SSH安全优化建议:
修改SSH端口:将SSH服务监听的默认端口(22)修改为一个非标准端口,这可以减少自动扫描攻击的风险。
Port 2222禁用root登录:禁用root用户直接登录SSH,避免恶意用户尝试暴力破解root账户密码。
PermitRootLogin no限制登录用户:仅允许特定的用户登录SSH,以减少潜在攻击面。
AllowUsers username1 username2使用公钥认证:禁用密码认证,仅允许使用SSH密钥对进行身份验证,提高安全性。
PasswordAuthentication no限制登录尝试次数:限制每个连接的登录尝试次数,防止暴力破解攻击。
MaxAuthTries 3设置登录超时:限制SSH会话的空闲时间,以避免未经授权的访问。
ClientAliveInterval 300 ClientAliveCountMax 2使用TCP Wrapper限制访问:使用TCP Wrapper限制允许连接到SSH服务的IP地址。
DenyUsers username1@hostname1 username2@hostname2禁用SSH协议版本1:SSH协议版本1存在安全漏洞,建议禁用。
Protocol 2日志记录:开启详细的日志记录,以便审计和监视SSH连接活动。
LogLevel VERBOSE使用IP地址访问控制:使用
AllowTcpForwarding和GatewayPorts等选项来限制端口转发,以防止滥用。AllowTcpForwarding no GatewayPorts no更新SSH版本:保持SSH服务器软件(如OpenSSH)的最新版本,以确保修复了已知的安全漏洞。
使用二次验证:如果可能的话,考虑使用基于TOTP或U2F的两步验证(2FA)来提高身份验证的安全性。
配置SSH密钥的权限:确保SSH密钥的权限正确设置,私钥权限设置为600,公钥权限设置为644。
配置防火墙:使用防火墙配置来限制对SSH服务的访问,仅允许受信任的IP地址访问SSH端口。
在修改sshd_config文件之后,记得重新加载SSH服务以应用更改:
sudo systemctl reload sshd
在进行任何配置更改之前,建议备份sshd_config文件,以防止意外情况。并且在修改配置之后,一定要确保你可以通过其他方式访问服务器,以免由于配置错误而被锁定出服务器。
查看用户会话
要查看当前在Ubuntu上关于SSH的会话,你可以使用who或w命令。这些命令会显示当前登录到系统的用户及其相关信息,包括通过SSH连接的会话。
在终端中运行以下命令:
who
或者
w
这将列出当前所有登录到系统的用户及其会话信息,包括SSH连接的会话。如果有用户通过SSH连接到系统,你应该能够在输出中看到他们的会话信息。
root@yuchao-linux-2024:~# who
ubuntu pts/0 2024-03-24 16:20 (106.40.205.29)
ubuntu pts/1 2024-03-24 16:20 (106.40.205.29)
root@yuchao-linux-2024:~# w
16:21:16 up 8 days, 7:21, 2 users, load average: 0.01, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ubuntu pts/0 106.40.205.29 16:20 1:08 0.02s 0.00s sshd: ubuntu [priv]
ubuntu pts/1 106.40.205.29 16:20 1.00s 0.02s 0.00s sudo -i
root@yuchao-linux-2024:~#
根据你提供的输出,你的系统上有两个SSH会话。以下是关于这些会话的说明:
- 第一个会话是由
ubuntu用户通过SSH连接到系统,并且在pts/0虚拟终端上。这个会话显示了连接的IP地址、登录时间以及会话的持续时间和当前活动状态。 - 第二个会话也是由
ubuntu用户通过SSH连接到系统,并且在pts/1虚拟终端上。这个会话显示了连接的IP地址、登录时间以及会话的持续时间和当前活动状态。不同的是,这个会话在sudo -i命令下,表示用户已经使用sudo切换到了root用户。
这些信息给出了关于当前SSH会话的一些基本信息,包括登录用户、连接的IP地址、会话的持续时间等。
SSH免密登录
SSH免密登录(也称为SSH密钥认证)是一种通过使用密钥对而不是密码来进行SSH连接的方法。以下是SSH免密登录的流程:
生成密钥对: 首先,在本地计算机上生成一对SSH密钥:公钥和私钥。你可以使用
ssh-keygen命令生成密钥对。通常,这个命令会生成两个文件:一个私钥文件(通常命名为id_rsa)和一个公钥文件(通常命名为id_rsa.pub)。ssh-keygen -t rsa将公钥复制到远程主机: 接下来,将生成的公钥文件的内容复制到要连接的远程主机的
~/.ssh/authorized_keys文件中。你可以使用ssh-copy-id命令将公钥添加到远程主机上。假设你的用户名是username,远程主机的IP地址是remote_host:ssh-copy-id username@remote_host如果没有
ssh-copy-id命令,你可以手动将公钥内容添加到远程主机的~/.ssh/authorized_keys文件中。尝试SSH连接: 现在,你可以尝试使用SSH连接到远程主机,不需要输入密码。SSH客户端将会自动将你的本地私钥与远程主机的公钥进行匹配,如果匹配成功,则允许登录。
ssh username@remote_host输入密钥的密码(可选): 如果你的私钥设置了密码(当你生成密钥对时选择加密私钥),在第一次使用SSH连接时,系统可能会要求你输入私钥密码以解锁私钥。
登录成功: 如果一切设置正确,你应该能够成功登录到远程主机,而无需输入密码。
SSH免密登录可以提高登录的便捷性和安全性,因为私钥通常是加密的,只有你拥有的用户才能使用它,而不是使用简单的密码。确保在设置SSH免密登录时保持私钥的安全,并在需要时撤销或重新生成密钥对。
原理流程
SSH免密登录的原理流程如下:
- 生成密钥对: 用户在本地计算机上使用
ssh-keygen等工具生成一对密钥:公钥和私钥。公钥是用于加密的,而私钥是用于解密的。 - 将公钥复制到远程主机: 用户将本地生成的公钥复制到要连接的远程主机的
~/.ssh/authorized_keys文件中。这个文件存储了可以使用密钥认证登录的用户公钥。 - SSH连接请求: 当用户尝试通过SSH连接到远程主机时,SSH客户端发送连接请求到远程主机。
- 公钥认证: 远程主机收到连接请求后,会检查请求中的用户名,然后在
~/.ssh/authorized_keys文件中查找该用户的公钥。如果存在匹配的公钥,远程主机会生成一个随机的会话密钥,并使用用户的公钥加密该密钥,并发送给客户端。 - 私钥解密: 客户端收到远程主机发送的加密的会话密钥后,会使用本地存储的私钥进行解密,获取会话密钥。
- 会话密钥生成: 客户端使用会话密钥进行加密通信,以确保通信的安全性和保密性。
- 连接建立: 客户端使用解密后的会话密钥进行加密通信,连接到远程主机。
- 验证成功: 远程主机收到加密的通信后,使用相应的会话密钥进行解密,然后验证客户端的身份和权限。如果一切正常,会话建立成功,用户免密登录到远程主机。
总的来说,SSH免密登录利用了公钥加密和私钥解密的机制,通过在客户端和远程主机之间交换密钥来确保连接的安全性,并实现了免密码登录。


图解


中间人攻击
SSH中间人攻击是一种安全威胁,指的是攻击者截取SSH连接中的通信,并尝试篡改或监视连接中的数据。这种攻击可能会导致信息泄露、身份伪装和数据篡改等问题。以下是SSH中间人攻击的一般流程和防范措施:
攻击流程:
- 截获连接: 攻击者通过各种手段截获用户与目标主机之间的SSH连接请求,通常是在用户发起连接请求后,将其重定向到攻击者控制的恶意服务器上。
- 代理连接: 攻击者在自己的服务器上建立一个虚假的SSH服务,以模拟目标主机。用户的连接请求被重定向到攻击者的服务器上。
- 欺骗认证: 用户可能不知道自己已经连接到了攻击者控制的服务器,攻击者可能会伪装成目标主机并向用户发送虚假的身份认证信息,让用户误以为是目标主机发出的认证请求。
- 中间人攻击: 一旦用户成功认证,攻击者会拦截用户与服务器之间的所有通信。攻击者可以查看、修改或注入通信数据,从而窃取敏感信息或进行其他恶意活动。
防范措施:
- 公钥指纹验证: 在首次连接时,用户应该验证服务器的公钥指纹,以确保连接的安全性。公钥指纹是服务器的唯一标识,用于验证连接是否受到信任。
- 使用SSH密钥对: 使用SSH密钥对进行认证,而不是使用基于密码的认证。密钥对提供了更强的安全性,因为私钥存储在本地,并且不易受到截获的攻击。
- SSH会话记录: 在服务器端启用SSH会话记录,记录所有的SSH连接和活动。这样可以及时发现异常连接和活动,并采取相应的应对措施。
- 防火墙策略: 使用防火墙来限制对SSH服务的访问,只允许来自可信来源的连接请求通过。
- 定期更新软件: 及时更新SSH软件和系统补丁,以修补已知的漏洞和安全问题,降低受攻击的风险。
通过采取这些预防措施,可以有效降低SSH中间人攻击的风险,并提高系统的安全性。
