Linux系统加密和安全及时间同步服务

Linux系统加密和安全及时间同步服务

一、安全

1.1安全的六大目标和归属

信息安全防护的六大目标

目标EN含义
真实性Authenticity对信息的来源进行判断,能对伪造的来源信息进行鉴别
保密性Confidentiality保证机密信息不被窃取,或窃取者不能了解信息的真实含义
完整性Integrity保证数据的一致性,防止数据被非法用户篡改
可用性Usability保证合法用户对信息和资源的使用不会被不正当拒绝
不可抵赖性Non-repudiation建立有责任的机制,防止用户否认其行为
可控性Controlability对信息的传播及内容具有控制能力

安全防护环节

安全环节En说明
物理安全Physical security各种主机、设备、机房环境
系统安全System security主机或设备的操作系统
应用安全Application security各种网络服务、应用程序
网络安全network security对网络访问控制、防火墙规则
数据安全Data security信息的备份与恢复、加密解密
管理安全Manage security各种保障性的规范、流程、方法

汇总

安全目标核心所属安全环节关键落地场景
保密性数据安全数据加密、隐私脱敏、传输加密
完整性数据安全哈希校验、数字签名、防篡改存储
可用性物理安全、网络安全机房冗余、抗 DDoS、链路高可用
真实性应用安全、网络安全身份认证、设备准入、接口鉴权
不可抵赖性管理安全全链路审计日志、操作存证追溯
可控性管理安全全局权限、流量 / 访问统一管控、风险阻断

1.2 STRIDE

STRIDE 威胁模型

  • STRIDE 是微软推出的面向软件 / 系统架构的威胁分类模型,用于在需求、设计阶段识别系统潜在安全威胁,通过 6 类标准化威胁维度梳理攻击面,辅助做威胁建模、风险评估、安全设计评审。名称是 6 类威胁英文首字母缩写:Spoofing(身份仿冒)、Tampering(数据篡改)Repudiation(抵赖)、Information Disclosure(信息泄露)、Denial of Service(拒绝服务)、Elevation of Privilege(权限提升)

常见的攻击方式

攻击方式EN说明
假冒、钓鱼网站Spoofing与真实网站界面形同,欺骗浏览者提交敏感信息
篡改Tampering修改网络中的数据包已达到某种目的
否认Repudiation一种欺骗手段
信息泄露Information Disclosure有意或无意的将非公开信息暴露给无权者
拒绝服务Denial of service使计算机或网络无法提供正常的服务
提升权限Elevation of Privilege将用户权限通过非法手段提高,已达到执行敏感操作的目的
1.2.1 如何在系统架构设计或入口处防范这些威胁

安全设计原则

  1. 使用成熟的安全系统
  2. 以小人之心度输入数据
  3. 外部系统是不安全的
  4. 最小的授权
  5. 减少外部接口
  6. 缺省使用安全模式
  7. 安全不是似是而非
  8. 从STRIDE思考
  9. 在入口检查
  10. 从管理上保护好你的系统

安全技术实施

  • 认证
  • 授权
  • 审计
  • 安全通信

1.3 DDos 攻击

  • DDOs 既 分布式拒绝服务 攻击,是一种恶意的网络攻击手段,旨在通过耗尽目标系统的资源或者带宽,使其无法正常提供服务。

攻击原理

  • 攻击者控制大量的计算机(通常被称为僵尸网络),这些计算机可以分布在不同的的地理位置。然后攻击者协调这些计算机同时向目标服务器发送海量的请求,导致这些服务器的资源被过度占用,如CPU处理能力、内存、网络带宽等,无法正常处理合法的用户需求,使服务终端或者变的极其缓慢。

攻击方式

  1. 流量型攻击:这类的攻击主要是通过向目标发送大量的数据包,占用网络带宽,是目标系统无法正常接受和处理合法的网络流量。常见的饿又UDP的洪水攻击、ICMP的洪水攻击等。例如UDP的洪水攻击利用的是UDP协议的无连接等待性,项目表端口的随机端口发送大量的UDP数据包,导致目标主机忙于处理这些无效的数据包,从而无法正常工作。
  2. 资源耗尽型攻击:此类的攻击侧重于喜爱哦好目标系统的服务器的资源,如CPU、内存。典型的攻击方式包括SYN洪水攻击、HTTP洪水攻击等。以SYN洪水攻击为例,攻击者回向目标服务器发送大量的SYN请求。但不完成TCP的三次握手过程,导致服务器的连接队列被填满,无法在接受新的合法请求。

攻击危害

  • 业务中断:对于企业来说,DDoS 攻击可能导致其网站或在线服务长时间无法访问,造成巨大的经济损失。例如,电商网站在遭受攻击期间无法正常交易,不仅会失去即时的销售收入,还可能损害企业的声誉,导致客户流失。

  • 数据丢失或损坏:在某些攻击情况下,可能会导致目标系统出现异常,进而造成数据丢失或损坏。如果是关键业务数据,如金融机构的交易记录、医疗机构的患者信息等,后果将不堪设想。

  • 影响网络稳定:大规模的 DDoS 攻击可能会影响整个网络的稳定性,导致网络拥塞,使周边的网络设备也受到影响,甚至可能引发局部网络瘫痪。

1.4缓冲区溢出

缓冲区溢出攻击是一种常见的且危险的网络攻击方式

攻击原理

  • 程序在运行过程中,会为变量、数组等数据分配一定的内存空间,即缓冲区。当程序向缓冲区中写入的数据超出了缓冲区的容量时,就会发生缓冲区溢出。

  • 攻击者利用这一漏洞,精心构造恶意数据,使其溢出到相邻的内存区域,覆盖原本存储在那里的重要数据,如程序的返回地址、函数指针等。这样,当程序继续执行时,就可能会按照攻击者的意愿跳转到恶意代码所在的地址,从而执行攻击者预先植入的指令,达到控制程序甚至整个系统的目的。

攻击危害

  • 系统被控制:攻击者可以利用缓冲区溢出执行任意代码,如在目标系统上安装后门程序、木马病毒等,从而长期控制受害者的计算机系统,窃取敏感信息、监控用户行为或进行其他恶意活动。

  • 数据泄露与篡改:攻击者可能覆盖或修改程序中的关键数据,导致数据泄露、损坏或被篡改。例如,在数据库应用程序中,通过缓冲区溢出攻击可以修改数据库的查询语句,从而获取或篡改数据库中的敏感信息。

  • 程序崩溃与服务中断:缓冲区溢出可能导致程序异常终止,使系统服务中断,影响正常的业务运行。对于关键的服务器应用,如 web 服务器、邮件服务器等,这可能会给企业和用户带来严重的经济损失和业务影响。

二、加密算法

2.1对称机密算法

对称机密算法:加密和解密使用的同一个秘钥

特性

  • 加密和解密使用的是同一个秘钥、效率高
  • 将原始的数据分割成固定的大小的数据块,逐个进行加密
  • 加密解密双方需要协商使用哪一种秘钥信息

缺陷

  • 秘钥过多
  • 秘钥分发,无法保证获得秘钥的人都是好人
  • 数据来源无法确定

总结:对称加密算法效率高但是,存在秘钥传输的问题,而且也存在无法确定数据来源的问题。

2.2非对称机密算法

非对称加密算法:秘钥是成对出现的

公钥:public key ,公开给所有人,主要是给别人加密使用

私钥:secret key,private key 自己保留,必须保证其的私密性,用于自己加密签名

特点

  • 用公钥加密数据,只能使用与之配对的私钥解密:问题就是因为公钥公开的原因,接受的一方无法保证数据的来源是安全的
  • 用私钥加密数据,只能只能使用与之配对的公钥进行解密:问题是因为公钥公开的原因,发送数据的一方,加密的数据在互联网上几乎是裸奔。

功能

  1. 数据加密:适合加密较小的数据,比如:加密对称的秘钥
  2. 数字签名:主要在于让接受方确认发送者的身份

缺点

  1. 密钥长,算法复杂
  2. 加密解密效率低下,据说加密一分钟,解密一小时

总结:加密解密效率低下,公钥加密无法确定数据的来源,私钥加密数据没有秘密可言

为什么对称加密通常采用“固定大小的块”进行数据处理

  1. 算法底层数学限制:加密轮变换基于固定维度矩阵,只能处理定长比特;
  2. 硬件加速刚需:CPU / 加密芯片电路按固定块设计,提升性能;
  3. 密码安全保障:标准化填充、加密模式,抵御长度泄露、填充攻击;
  4. 工程性能优化:分块流式处理,控制内存占用,兼容网络 / 磁盘 IO。

2.3组合使用方案

综合加密
在这里插入图片描述
A 发送端步骤

  1. 对业务 data 做单向加密,生成摘要;
  2. 用 A 私钥 ASK 加密摘要,生成数字签名(防篡改、身份认证、不可抵赖);
  3. 生成随机对称密钥 D-key,用 D-key 加密data+签名,得到密文(对称加密,高速加密大数据);
  4. 用 B 公钥 BPK 加密 D-key,得到密文`(非对称加密,解决密钥分发,只有 B 能解开 D-key);
  5. 网络传输两段密文:业务密文 + 加密后的 D-key。

B 接收端步骤

  1. 用自身私钥 BSK 解密,还原出对称密钥 D-key;
  2. 用 D-key 解密密文,得到原始 data+A 的签名
  3. 用 A 公钥 APK 解密签名,还原出原始摘要;
  4. 对收到的 data 重新哈希,对比两段摘要:
    • 相等:数据未篡改、发送方确为 A;
    • 不等:数据被篡改 / 身份伪造,丢弃报文。

三、证书&协议

中间人攻击

  • 中间人攻击(MITM)是一种常见的网络安全攻击类型,他涉及攻击者在两个通信实体之间插入自己,从而窃听、篡改或者干扰他们之间的通信。
  • 中间人攻击的基本原理就是通过某种手段,如ARP欺骗、DNS挟持、WIFI劫持模式,让通信双方误以为对方直接通信,从而实际上所有的通信都经过攻击者的控制的访问环节。在这个过程中,攻击者可以窃取双方的敏感信息,如账号密码、信用卡等,也可以篡改通信内容,导致双方交互的结果出现问题。
    ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024在这里插入图片描述

CA认证

  • Linux中的CA认证是一种用于确保网络安全通信的安全技术。CA认证,即证书颁发机构认证,是一种通过数字验证的双方身份的技术。在Linux系统中,CA认证通常依赖于openssl库来实现加密和签名的功能。数字证书有CA机构颁发,用于证明证书的持有者身份,并加密网络的通信。

  • 注意:CA结构的公钥已经内置在操作系统中了,操作系统已经天然的相信它了。

CA证书的加密流程

  1. 证书的申请:用户向CA机构提交申请,包括用户的公钥和身份信息
  2. 证书的颁发:CA机构验证用户的身份信息后,使用自己的私钥对包含公钥和用户身份信息的证书签名请求(CSR)进行签名,生成CA证书
  3. 证书的传输:CA证书通过安全通道传输给用户,放置到适当的目录下,用户可以使用CA机构的公钥对证书的数字签名进行验证
  4. 证书的使用:用户在进行安全通信时,使用自己的私钥对信息进行加密或签名,然后使用对方的公钥进行解密或验证签名。同时,用户也可以验证对方的证书的真实性,以确保通信安全性。

CA证书的多级认证逻辑

在这里插入图片描述

子CA下的用户公钥文件传输

场景:同一个CA机构下的所有用户认证信息通信

  • 主机A 和 主机B 相信同一个CA机构

证书申请

  • 主机A将签名请求信息发送给CA1的机构
  • 包含公钥和用户信息的证书签名请求 A.csr

证书颁发

  • CA1机构验证主机A的A.csr信息,如果消息真实可靠
  • 使用自己的CA的私钥(ca1.key)对签名请求进行验证
  • 生成配套的证书A.crt (A的公钥和CA的其他信息,该证书文件会在CA1机构的目录存储下来,进行后续管理)

不同CA的机构用户认证通信流程

证书的传输

CA1 机构将证书 (Alice.crt) 返回给 Alice,Alice 如果想要和主机 B 进行通信,那么就通过网络将证书传递给主机 B

  • 因为主机 B 相信 CA1 机构,具有 CA1 机构的私钥 (CA_PriKey) 信息,这样就可以获取 Alice 的公钥
  • 证书的目的,就是让 主机 B 以安全的方式获取 Alice 的公钥 (A_PubKey) 信息。

提取修改后全文

场景:不同 CA 机构下的所有用户认证信息通信。

Alice 和 主机 A 相信的 CA 机构不是同一个 CA 机构,Alice 相信 CA1 机构,主机 A 相信 CA2 机构。

因为 CA1 和 CA2 是平级机构,所以,需要一个更高级的机构 RootCA,对所有的子 CA 机构进行身份认证。

证书申请

CA1 将签名请求信息发送给 Root_CA 机构

  • 包含公钥和用户身份信息的证书签名请求 CA1.csr

证书签发

Root_CA 验证 CA1 的 CA1.csr 信息,如果信息真实可靠

  • 使用自己的 CA 私钥 (ca.key) 对签名请求进行签证
  • 生成配套的证书 ca1.crt
  • RootCA_PriKey (CA1_PubKey) + RootCA 其他信息
  • 该证书文件会在 RootCA 机构的目录下存储下来,进行后续管理

证书传输

RootCA 机构将证书 (CA1.crt) 返回给 CA1,CA1 如果想要和 CA2 进行通信,那么就通过网络将证书传递给 CA2

  • 因为 CA2 相信 RootCA 机构,具有 RootCA 机构的公钥 (RootCA_PriKey) 信息,这样就可以获取 CA1 的公钥
  • 证书的目的,就是让 CA2 以安全的方式获取 CA1 的公钥 (CA1_PubKey) 信息。

Root CA凭什么信任

  • 因为在电脑上已经内置了很多的根CA

Root CA的机构是谁

  • 自己给自己颁发的

四 、SSL和TLS

简介

  • SSL:安全套接协议,最初由NETscape公司在1990年推出,用于在网络通信中建立web浏览器和web服务器之间的加密连接。他是从1994年开始出现的,到1996年升级到SSL3.0

  • TLS(Transport Layer Security):传输层安全协议,由 IETF(互联网工程任务组)在 SSL3.0 基础上设计,实际上相当于 SSL 的后续版本,提供了更强大的安全功能。目前主要使用的是 TLS1.2,最新版是 2018 年出现的 TLS1.3。

  • TLS 版本:包括 TLS 1.0(存在安全漏洞)、TLS 1.1(存在安全漏洞)、TLS 1.2(需注意配置和更新)、TLS 1.3(提供了更高的安全性和效率)。

功能

  • 数据加密:SSL和TLS协议能够对传输的数据进行加密,从而防止数据在传输的过程中被窃听和篡改。
  • 身份的验证:通过证书认证机制,SSL/TLS协议可以确保通信双方的身份可靠
  • 数据的完整性:传送的消息包括消息的完整性检查(如使用MAC),以确保身份在传输的过程中未被篡改

握手过程

TLS的实现过程主要是,握手协议、加密通信、连接关闭三个阶段
在这里插入图片描述

  • 客户端发送一个CLIENT hello消息:包含客户端支持的TLS的版本,加密列表。随机数等信息
  • 服务端发送一个SERVER hello消息:服务器接受到客户端的消息后,从中选择一个TLS的版本,加密套件,并生成一个随机数,然后向客户端发送确认消息
  • 服务端发送证书:服务端向客户端发送身份认证消息,包含服务器的公钥证书,证书由可信的证书颁发机构颁发,用于服务端的身份证明
  • 客户端验证证书:客户端收到服务端的证书后,验证证书的合法性,包括证书的是否有可信的证书机构颁发等。

双方协商认可

  • 客户端发送加密的随机数:如果证书验证通过,客户端会生成一个随机数(称为预主秘钥 PRE-master secret)并使用服务器的公钥加密该随机数,然后发送给服务端,这个随机数后续会生成会话秘钥
  • 服务器解密随机数并生成会话秘钥:服务收到客户端发送的加密随机数后,使用自己的私钥解密随机数,得到预主密钥。然后服务器端结合客户端随机数,服务器随机数和预主密钥,通过一定的算法生成【会话秘钥】
  • 服务器发送 SERVER hello Done消息:服务器端想客户端发送SERVER hello Done消息,表示握手协议的第一部分结束
  • 客户端发送 CLIENT key exchange消息:在某些特定的情况下,客户端需要向服务器端发送CLIENTkeyExchange消息,其中包含客户端生成的随机数和会话秘钥的相关信息

确认是否被对方成立

客户端发送 ChangeCipherSpec 和 Finished 消息:

  • 客户端向服务器发送 ChangeCipherSpec 消息,通知服务器后续的通信将使用协商好的会话密钥进行加密。
  • 然后,客户端计算一个使用会话密钥加密的消息摘要(称为 Finished 消息),并发送给服务器,用于验证密钥交换和认证过程是否成功。

服务器发送 ChangeCipherSpec 和 Finished 消息:

  • 服务器收到客户端的 ChangeCipherSpec 和 Finished 消息后,也发送一个 ChangeCipherSpec 消息通知客户端,并计算一个使用会话密钥加密的消息摘要(Finished 消息)发送给客户端。至此,握手协议完成。

注意:

  • 会话密钥(密钥块)本质上是由「主密钥、SecurityParameters.server_random 和 SecurityParameters.client_random」这几个数据通过 PRF 函数来生成的。

加密通信

在我握手阶段完成之后,双方会进行会话秘钥加密通信

  • 发送方会使用会话秘钥对数据进行加密,并添加TLS的头部和MAC,然后通过TCp协议传输给接受对方。接收方收到加密数据后,使用会话秘钥进行解密,并验证MAC以确保数据的完整性和真实性。如果解密和验证成功,接收方将解密后的数据提交上层应用管理

连接关闭

  • 当客户端和服务器通信结束后,需要关闭连接。TLS协议使用和关闭和协议王城链接关闭,包括发送closenotity消息和接受closenotity消息,客户端和服务器都需要发送closenotity消息,表示连接关闭,如果有一方没有收到消息,可以通过超时机制关闭连接

前向保密

  • 前向保密(Forward Secrecy),也称为完美前向保密(Perfect Forward Secrecy,PFS),是一种密码学概念,旨在确保即使长期密钥被泄露,过去的通信内容仍保持保密。
  • 前向保密通过使用临时的、一次性的密钥来加密通信数据。
  • 在每次通信会话中,系统会生成一对临时的密钥,即会话密钥。这对密钥仅在当前会话中使用,用于加密和解密该会话期间传输的所有数据。
  • 当会话结束后,这对密钥就会被丢弃。即使攻击者获取了用于生成会话密钥的长期密钥,由于会话密钥是临时的且已被丢弃,攻击者也无法解密过去使用该会话密钥加密的通信数据。

实现方式

  • Diffie – Hellman 密钥交换及其变体:这是实现前向保密的常用方法。

  • 例如,在 TLS 协议中,通过使用椭圆曲线 Diffie – Hellman(ECDH)或 RSA – based Diffie – Hellman 等算法,客户端和服务器在每次连接时协商生成一个临时的共享密钥。

  • 其他密钥交换机制:

  • 一些其他的密钥交换机制也可以实现前向保密,如在某些 VPN 协议中使用的 IKE(Internet Key Exchange)协议,通过类似的原理在每次建立 VPN 连接时生成临时的密钥,确保通信的前向保密性。

RSA 秘钥交换 + RSA 数字签名

安全性:

  • RSA 算法本身具有较高的安全性,基于大数分解的困难性。
  • 但在密钥交换方面,RSA 不支持前向保密,一旦私钥泄露,过去的通信可能受到威胁。

性能:

  • RSA 算法涉及大数运算,因此加密、解密和密钥生成的速度相对较慢。
  • 较长的密钥长度进一步增加了运算的复杂性。

应用场景:

  • 尽管存在性能上的限制,但 RSA 因其广泛的支持性和成熟性,仍在许多传统应用中得到使用。

ECDHE 秘钥交换 + RSA 数字签名

安全性:

  • ECDHE(椭圆曲线 Diffie-Hellman)算法提供前向保密,即使长期密钥泄露,过去的通信仍然安全。

  • RSA 数字签名保证数据的完整性和不可否认性。

性能:

  • ECDHE 算法在相同安全级别下使用较短的密钥,提高了运算效率。

  • RSA 签名算法的性能虽然不如对称加密算法,但相较于 RSA 密钥交换,其影响较小。

应用场景:

  • ECDHE+RSA 组合在现代 TLS 协议中广泛使用,既保证了前向保密,又利用了 RSA 签名的成熟性和广泛支持性。

五、Base64编码

关联

数据保护:

  • 在某些情况下,为了保护数据的机密性和完整性,需要对数据进行加密处理。而在加密之前,如果数据是二进制格式的,可能需要先进行 Base64 编码,以便在加密过程中更容易处理。
  • OpenSSL 提供了多种加密算法,可以与 Base64 编码结合使用,实现数据的加密和保护。

证书管理:

  • 在 SSL/TLS 证书管理中,证书文件通常以二进制格式存储。为了方便证书的传输和存储,可以使用 OpenSSL 将证书文件转换为 Base64 编码格式。
  • 这样不仅可以减小证书文件的大小(相对于二进制格式),还可以使证书文件更易于在文本协议中传输和存储。

为后续内容铺垫:

  • 在讲述 OpenSSL 时,先介绍 Base64 编码可以为用户理解 OpenSSL 的其他功能(如加密、解密、签名等)打下基础。因为 Base64 编码是处理二进制数据的一种常用方法,而 OpenSSL 中的许多功能都需要处理二进制数据。

简介

  • Base64是网络上最常见的用于传输8bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制的数据的方法

编码过程

输入数据处理:

  • 将输入的二进制数据(通常是字节流)分成每 3 个字节为一组。将每 3 个字节放入一个 24 位的缓冲区中。
  • 如果最后一组不足 3 个字节,则会在其后填充零字节(\0),使其长度达到 3 个字节。

二进制到十进制的转换:

  • 将每一组的 24 位二进制数据转换为一个 24 位的十进制数。

十进制到 Base64 的转换:

  • 将这个 24 位的十进制数分成 6 组,每组 4 位。然后,将每组 4 位的二进制数转换为对应的 Base64 字符。
  • Base64 字符集包括 A-Z、a-z、0-9、+、/,以及一个填充字符 ‘=’(用于填充最后一组不足 6 个 4 位的情况)。

4 输出:

  • 将转换后的 Base64 字符序列作为编码结果输出。

5 这样不断地进行下去,就可完成对所有数据的编码工作。

简单实践

root@ubuntu24-18:~# echo man | base64
bWFuCg==
root@ubuntu24-18:~# echo xxx|base64
eHh4Cg==
root@ubuntu24-18:~# echo sjafiowqfh|base64
c2phZmlvd3FmaAo=
root@ubuntu24-18:~# echo afjioqfieoaihgioaheioahgi|base64
YWZqaW9xZmllb2FpaGdpb2FoZWlvYWhnaQo=

Cg==怎么来的

root@ubuntu24-18:~# echo Man | cat -A
Man$
root@ubuntu24-18:~# printf "Man\n" | cat -A
Man$

解析

  • 换行符在ascii 中对应的是十进制数刚好是10,10换成8位二进制数是00001010,但是 base64以6位二进制来定义的一个字符,所以00001010会被分成000010和10 两部分
  • 第一部分从低位开始算 000010和10 对应的十进制就是2 则Base64中的就是c
  • 第二部分会被从高位开始算,10后面补四个0就是100000,对应的十进制就是32,则base64中就是g由于补了四个0,所以后面再补两个==

取消换行符

Manroot@ubuntu24-18:~# echo -n Man |base64
TWFu
root@ubuntu24-18:~# echo Man |base64
TWFuCg==
root@ubuntu24-18:~# echo TWFuCg==| base64 -d  #解密
Man

六、openssl

查看版本

root@ubuntu24-18:~# openssl version
OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)

命令与算法

root@ubuntu24-18:~# openssl list --commands
asn1parse         ca                ciphers           cmp               
cms               crl               crl2pkcs7         dgst              
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
fipsinstall       gendsa            genpkey           genrsa            
help              info              kdf               list              
mac               nseq              ocsp              passwd            
pkcs12            pkcs7             pkcs8             pkey              
pkeyparam         pkeyutl           prime             rand              
rehash            req               rsa               rsautl            
s_client          s_server          s_time            sess_id           
smime             speed             spkac             srp               
storeutl          ts                verify            version           
x509              
#查看所有的摘要命令
root@ubuntu24-18:~# openssl list -digest-commands
blake2b512        blake2s256        md5               rmd160            
sha1              sha224            sha256            sha3-224          
sha3-256          sha3-384          sha3-512          sha384            
sha512            sha512-224        sha512-256        shake128          
shake256          sm3               
#查看所有的摘要的算法
root@ubuntu24-18:~# openssl list -digest-commands
blake2b512        blake2s256        md5               rmd160            
sha1              sha224            sha256            sha3-224          
sha3-256          sha3-384          sha3-512          sha384            
sha512            sha512-224        sha512-256        shake128          
shake256          sm3               

root@ubuntu24-18:~# openssl list -cipher-commands
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb      
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb      
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1     
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb      
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8     
aria-256-ctr      aria-256-ecb      aria-256-ofb      camellia-128-cbc  
camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  camellia-256-cbc  
camellia-256-ecb  des-ede           des-ede-cbc       des-ede-cfb       
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb      
des-ede3-ofb      des3              sm4-cbc           sm4-cfb           
sm4-ctr           sm4-ecb           sm4-ofb           

root@ubuntu24-18:~# openssl list -cipher-algorithms 
Legacy:
  AES-128-CBC
  AES-128-CBC-HMAC-SHA1
  AES-128-CBC-HMAC-SHA256
  id-aes128-CCM
  AES-128-CFB
  AES-128-CFB1
  AES-128-CFB8
  AES-128-CTR
  AES-128-ECB
  id-aes128-GCM
  AES-128-OCB
  AES-128-OFB
  AES-128-XTS
  AES-192-CBC
  id-aes192-CCM

简单实战

默认是sha256

root@ubuntu24-18:~# openssl dgst /etc/shadow
SHA256(/etc/shadow)= cb1e49d25a587cc7089768507086806f582c203775233fca34c18f04af306936

对md5摘要信息进行操作

root@ubuntu24-18:~# echo nihao > nihao.txt
root@ubuntu24-18:~# openssl md5 nihao.txt 
MD5(nihao.txt)= 0a34a9366d438e6ac5ae3480d024c4ef
root@ubuntu24-18:~# openssl dgst -md5 nihao.txt 
MD5(nihao.txt)= 0a34a9366d438e6ac5ae3480d024c4ef
root@ubuntu24-18:~# md5sum nihao.txt 
0a34a9366d438e6ac5ae3480d024c4ef  nihao.txt

对sha512摘要信息进行操作

root@ubuntu24-18:~# openssl dgst -sha512 /etc/shadow
SHA2-512(/etc/shadow)= 4c5fe012129effc88850bbf53d6de4a2ca56e6d7e1850b3b94bf70857d155d4249395278af6602d25ba21021da8159d982391a8efd51d8a1887f79e5d99322ad
root@ubuntu24-18:~# openssl sha512 /etc/shadow
SHA2-512(/etc/shadow)= 4c5fe012129effc88850bbf53d6de4a2ca56e6d7e1850b3b94bf70857d155d4249395278af6602d25ba21021da8159d982391a8efd51d8a1887f79e5d99322ad
root@ubuntu24-18:~# sha512sum /etc/shadow
4c5fe012129effc88850bbf53d6de4a2ca56e6d7e1850b3b94bf70857d155d4249395278af6602d25ba21021da8159d982391a8efd51d8a1887f79e5d99322ad  /etc/shadow

密码实践

通过 openssl passwd 可以生成用户密码
#默认是md5
root@ubuntu24-18:~# openssl passwd 123456
$1$/nYVHqvD$X5HUKBKWVKj7ECI5MQFM4.
#使用MD5 加密算法 -1
root@ubuntu24-18:~# openssl passwd -1 123456
#交互式
$1$lBtACSGn$JOiseqcW4A3a4U8aFOxfw/
root@ubuntu24-18:~# openssl passwd
Password: 
Verifying - Password: 
$1$s7ydmLVu$/r3iwHwgyA5riduG/fBCw/
# 使用 sha512 -6
root@ubuntu24-18:~# openssl passwd -6 123456
$6$a3a8k5sWteU2Lfxc$945hBp55ZQ0qlfXwX/p5TEl4iggEumGS8I16G4HucLsk6uSV0gbfdbxRqgZPmk7ECDztro6dzgB/n3WmHwJh..
# 从标准输入读取
root@ubuntu24-18:~# echo 123456 | openssl passwd -stdin
$1$U1xhxAyb$xKQkfKyNPZEPr/eZpmEOY1
# 指定盐值加密 -salt
root@ubuntu24-18:~# openssl passwd -1 -salt abcd1234 123456
$1$abcd1234$flW8OGJjRMMEgtyb4lbLN0

随机数

#命令 格式 
	openssl rand 【options】 NUM

简单实战


root@ubuntu24-18:~# openssl rand 10
{�N��
      �Kroot@ubuntu24-18:~# 

#转base64,不够加等号补齐
root@ubuntu24-18:~# openssl rand -base64 10
oRs2uAvaqYV0YQ==

root@ubuntu24-18:~# openssl rand -base64 15
PcoBmTISALjlca2sd/pe

密钥对

  • openssl是一个强大的开源工具库,它实现了SSL和TLS协议以及包括RSA在内的多重加密算法,被广泛使用与安全通信和数据加密中

生成

#生成私钥
root@ubuntu24-18:~# openssl genrsa -out test.key
root@ubuntu24-18:~# ll  test.key 
-rw------- 1 root root 1704  628 15:28 test.key
#在私钥中提取公钥
root@ubuntu24-18:~# openssl rsa -in test.key -pubout -out test2.key
writing RSA key
root@ubuntu24-18:~# ll -a test*
-rw-r--r-- 1 root root  451  628 15:29 test2.key
-rw------- 1 root root 1704  628 15:28 test.key
#除了公钥是644 其他都是600

生成私钥时候加密

#指定加密算法,指定口令
root@ubuntu24-18:~# openssl genrsa -out test.key -des3 -passout pass:"123456"
#解密加密的私钥 需要输入密码
root@ubuntu24-18:~# openssl rsa -in test.key -out test2.key
Enter pass phrase for test.key:
writing RSA key
root@ubuntu24-18:~# ll test*
-rw------- 1 root root 1704  628 15:41 test2.key
-rw------- 1 root root 1854  628 15:40 test.key
#提取公钥需要密码 也可以提取解密完的私钥不需要密码
root@ubuntu24-18:~# openssl rsa -in test.key -pubout -out test.key2
Enter pass phrase for test.key:
writing RSA key
root@ubuntu24-18:~# openssl rsa -in test2.key -pubout -out test.key2
writing RSA key

加解密

准备工作

root@ubuntu24-18:~# mkdir key ; cd key
root@ubuntu24-18:~/key# openssl genrsa -out private.pem 2048
root@ubuntu24-18:~/key# openssl rsa -pubout -in private.pem -out public.pem
writing RSA key
#准备文件
root@ubuntu24-18:~/key# echo hello > hello.txt
root@ubuntu24-18:~/key# cat hello.txt 
hello

rsautl加解密

  • 使用公钥对文件进行加密
root@ubuntu24-18:~/key# openssl rsautl -encrypt -in hello.txt -inkey public.pem -pubin -out hello.en
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
#3.0版本以下的rsautl已被废弃
root@ubuntu24-18:~/key# ll
总计 24
drwxr-xr-x 2 root root 4096  628 15:52 ./
drwx------ 6 root root 4096  628 15:47 ../
-rw-r--r-- 1 root root  256  628 15:52 hello.en
-rw-r--r-- 1 root root    6  628 15:49 hello.txt
-rw------- 1 root root 1704  628 15:48 private.pem
-rw-r--r-- 1 root root  451  628 15:49 public.pem
  • 使用公钥进行解密
root@ubuntu24-18:~/key# openssl rsautl -decrypt -in hello.en -inkey private.pem -out hello.de
The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
root@ubuntu24-18:~/key# ls
hello.de  hello.en  hello.txt  private.pem  public.pem
root@ubuntu24-18:~/key# cat hello.de
hello
root@ubuntu24-18:~/key# cat hello.en 
EX��ڔ1o�z���`6�1O����ظ���ep�����K�uumP�H��
5���e��4��ꕬ�\���XX!(X��54\��Px`�ee��5�O�66��:��͑��ag1ڇ��н+TJa
�7�5F<�wv�w�~~���

��uu���RR ��˴e��4LaI�3���KK����--��A6p�k�7��ѻѻH�EE��>N���d�#Y���&讜��
                                                                 NZe�쫾E4:���Pmې�Kަ�i��⻨eߵ�

pkeyutl加解密

  • 使用公钥对文件进行加密
root@ubuntu24-18:~/key# openssl pkeyutl -encrypt -in hello.txt -inkey public.pem -pubin -out hello.en1
root@ubuntu24-18:~/key# ls
hello.de  hello.en  hello.en1  hello.txt  private.pem  public.pem
# 公钥解密
root@ubuntu24-18:~/key# openssl pkeyutl -decrypt -in hello.en1 -inkey private.pem -out hello.de2
root@ubuntu24-18:~/key# ls
hello.de  hello.de2  hello.en  hello.en1  hello.txt  private.pem  public.pem
root@ubuntu24-18:~/key# cat hello.de2
hello
root@ubuntu24-18:~/key# cat hello.en1
O��TO��w��i�EěW��
��uT*�fQ��))�zS�B������##Neh�uR���""\�30�II��BB��������V��11,��*b�����|�22ɄX껤�ee�dU�UHo�J���]�gs�??Y�ߺD2��r�/�  G
�c��             ����u�ܗ
    �~��(̒��OG$��6�!g�$$����ȣ$���'�'��77��)ʽ0��
Q���v�t�\9���mmwnroot@ubuntu24-18:~/key#     i��W*w���ff�%��v���0�RyQ��1/

数字签名

  • 使用私钥对文件进行签名,例如使用命令对hello.txt文件进行签名,生成签名文件sign.txt
    root@ubuntu24-18:~/key# openssl dgst -sha256 -sign private.pem -out sign.txt
    需要等待

  • 使用公钥验证签名,验证sign文件是否有效

root@ubuntu24-18:~/key# openssl dgst -verify public.pem -sha256 -signature sign.txt hello.txt 
verified OK

七、CA证书

准备环境

# centos 系统:
		yum install -y openssl-libs
#ubuntu 系统
		apt install -y openssl libssl-dev

查看配置文件

[root@rocky-12 yum.repos.d]# cat /etc/pki/tls/openssl.cnf

pem和crt后缀

格式与编码

PEM 证书

  • PEM(Privacy Enhanced Mail)证书是一种基于 Base64 编码的文件格式。
  • 它通常以 “.pem” 扩展名结尾,但也可以使用 “.cer” 或 “.crt” 作为扩展名(尽管这种用法可能造成一些混淆)。
  • PEM 文件是文本文件,可以使用文本编辑器打开并查看其内容。
  • 它们以 “-----BEGIN XXX-----” 和 “-----END XXX-----” 作为起始和结束标记,
  • 其中 “XXX” 表示证书或密钥的类型,如 “CERTIFICATE” 表示证书,“PRIVATE KEY” 表示私钥。

CRT 证书

  • CRT(Certificate)证书通常是 X.509 证书的一种存储格式。
  • 它以 “.crt” 扩展名结尾,但也可以使用 “.pem” 或其他扩展名(同样可能造成混淆)。
  • CRT 证书可以是 PEM 编码(即 Base64 编码)或 DER 编码(二进制编码)。
  • 因此,不是所有 CRT 证书都是文本文件;
  • 如果是 DER 编码的,则不能直接通过文本编辑器查看。

内容与用途

PEM 证书

  • PEM 证书文件通常包含证书信息,但也可以包含私钥、证书链等其他加密数据。
  • 由于其文本格式和 Base64 编码,PEM 证书在不同平台和工具之间的兼容性很高,广泛应用于需要同时存储多个证书和密钥的场景,如 web 服务器配置和开发环境。

CRT 证书

  • CRT 证书文件主要包含公钥信息和证书信息,用于身份验证和数据加密。
  • CRT 证书常用于需要单独存储证书的场景,特别是在一些特定的应用或服务中。
  • 可以使用 OpenSSL 等工具在 PEM 证书和 CRT 证书之间进行转换。

例如,PEM 格式的 CRT 证书转换为.pem 格式。

openssl x509 -in certificate.crt -outform PEM -out certificate.pem

例如,DER 格式的 CRT 证书转换为.pem 格式。

openssl x509 -inform DER -in certificate.crt -outform PEM -out certificate.pem

例如,将 PEM 证书转换为 CRT 证书(DER 二进制)。

openssl x509 -inform PEM -in certificate.pem -outform DER -out certificate.crt

自建CA

创建相关的文件目录

[root@rocky-12 ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
mkdir: 已创建目录 '/etc/pki/CA'
mkdir: 已创建目录 '/etc/pki/CA/certs'
mkdir: 已创建目录 '/etc/pki/CA/crl'
mkdir: 已创建目录 '/etc/pki/CA/newcerts'
mkdir: 已创建目录 '/etc/pki/CA/private'
[root@rocky-12 ~]# tree /etc/pki/CA/
/etc/pki/CA/
├── certs
├── crl
├── newcerts
└── private

5 directories, 0 files

生成CA秘钥

[root@rocky-12 ~]# cd /etc/pki/CA/
[root@rocky-12 CA]# ls
certs  crl  newcerts  private
[root@rocky-12 CA]# openssl genrsa -out private/cakey.pem 2048
[root@rocky-12 CA]# ls private/
cakey.pem

生成CA自签名证书

[root@rocky-12 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN                    #国家/代码
State or Province Name (full name) []:bj				#省/洲
Locality Name (eg, city) [Default City]:bj				#城市
Organization Name (eg, company) [Default Company Ltd]:wangge #公司/单位  
Organizational Unit Name (eg, section) []:sre  			#部门
Common Name (eg, your name or your server's hostname) []:www.xiao.com #域名
Email Address []:										#邮箱
[root@rocky-12 CA]# cat /etc/pki/CA/cacert.pem 
-----BEGIN CERTIFICATE-----
MIIDmzCCAoOgAwIBAgIUJdbyUR+nsmpl3G1pywqneAxOOU4wDQYJKoZIhvcNAQEL
BQAwXTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAmJqMQswCQYDVQQHDAJiajEPMA0G
A1UECgwGd2FuZ2dlMQwwCgYDVQQLDANzcmUxFTATBgNVBAMMDHd3dy54aWFvLmNv
.....   # 共20行
-----END CERTIFICATE-----
[root@rocky-12 CA]# cat /etc/pki/CA/cacert.pem |wc -l
22

查看证书

[root@rocky-12 CA]# openssl x509 -in /etc/pki/CA/cacert.pem -noout -text 
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            25:d6:f2:51:1f:a7:b2:6a:65:dc:6d:69:cb:0a:a7:78:0c:4e:39:4e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=bj, L=bj, O=wangge, OU=sre, CN=www.xiao.com
        Validity
            Not Before: Jun 28 08:56:48 2026 GMT
            Not After : Jun 25 08:56:48 2036 GMT
        Subject: C=CN, ST=bj, L=bj, O=wangge, OU=sre, CN=www.xiao.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:

证书管理

[root@rocky-12 date]# openssl genrsa -out /date/date/test.key 2048
[root@rocky-12 date]# ls
test.key
[root@rocky-12 date]# openssl req -new -key /date/date/test.key -out /date/date/test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:wangge
Organizational Unit Name (eg, section) []:sre-cless
Common Name (eg, your name or your server's hostname) []:www.xiao.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

用CA签署的证书并将证书颁发给请求者

#创建一个索引文件
[root@rocky-12 date]# touch /etc/pki/CA/index.txt
#创建一个序列文件
[root@rocky-12 date]# echo 0F > /etc/pki/CA/serial
#签发证书
[root@rocky-12 date]# openssl ca -in /date/date/test.csr -out /etc/pki/CA/certs/test.crt -days 100
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15 (0xf)  	#序列号是15,十六进制格式0F
        Validity
            Not Before: Jun 28 09:07:22 2026 GMT
            Not After : Oct  6 09:07:22 2026 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = bj
            organizationName          = wangge
            organizationalUnitName    = sre-cless
            commonName                = www.xiao.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                28:D9:77:79:A2:B8:AF:45:6A:3D:E7:D6:36:00:DF:A5:A3:74:C8:68
            X509v3 Authority Key Identifier: 
                7C:D6:8D:98:18:CC:09:95:97:9E:DA:90:6B:63:0C:96:B4:76:EF:67
Certificate is to be certified until Oct  6 09:07:22 2026 GMT (100 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Database updated
#注意 如果是证书申请文件的配置项与CA结构的匹配规则不一样,将无法签发证书
#     如果是Ubuntu系统执行这一条命令的话,需要提前修改openssl的配置
	/etc/pki/CA   vim /etc/pki/opensll.cnf
     dir			= /etc/pki/CA
[root@rocky-12 date]# tree /etc/pki/CA/
/etc/pki/CA/
├── cacert.pem			# 这是CA的根证书文件。它包含了CA的公钥和CA的身份信息

├── certs				#这个目录是用于存储CA签发的文档的证书(.crt)
│   └── test.crt

├── crl					#证书吊销列表(CRl)的存储目录。CRL是一个文件,列出了已被CA吊							销的证书
├── index.txt			#这是一个文本文件,用于跟踪CA的签发的所有证书的状态

├── index.txt.attr		#这个文件是CA数据库的一部分,用于管理证书的生命周期
						#这个文件通常包含于index.txt中的条目相关的附加属性信息

├── index.txt.old		#这是index.txt文件的备份,在惊醒重要的数据库操作(如吊销证书)

├── newcerts			#这个目录存储了CA新签发的证书,每个证书文件以唯一的序列号命名
│   └── 0F.pem

├── private				#这个目录包含了CA的私钥文件(这个是cakey.pem)
│   └── cakey.pem

├── serial				#这个文件包含了下一个签发的证书的序列号,么一次签发新的证书的时						候序列号都会递增
└── serial.old			#这是serial文件的备份,与index.txt.old类似,用于在需要恢复序						列号状态

5 directories, 9 files

原来是0F,数字是15,签证后,序列号+1 ,数字变成16,十六进制是缝16进1 所以十六进制表示为10

[root@rocky-12 date]# cat /etc/pki/CA/serial
10
[root@rocky-12 date]# cat /etc/pki/CA/index.txt
V       261006090722Z           0F      unknown /C=CN/ST=bj/O=wangge/OU=sre-cless/CN=www.xiao.com
#解析:
	# V 表示有效,261006 表示2026年10月06日过期,0F证书的编号 

查看证书的状态

[root@rocky-12 date]# openssl ca -status 0F
Using configuration from /etc/pki/tls/openssl.cnf
0F=Valid (V)
[root@rocky-12 date]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -text 
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 15 (0xf)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=bj, L=bj, O=wangge, OU=sre, CN=www.xiao.com
        Validity
            Not Before: Jun 28 09:07:22 2026 GMT
            Not After : Oct  6 09:07:22 2026 GMT
        Subject: C=CN, ST=bj, O=wangge, OU=sre-cless, CN=www.xiao.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
.......

吊销证书

在客户端吊销证书

[root@rocky-12 CA]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -serial -subiect
x509: Unknown option or message digest: subiect
x509: Use -help for summary.
[root@rocky-12 CA]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -serial -subject
serial=0F
subject=C=CN, ST=bj, O=wangge, OU=sre-cless, CN=www.xiao.com
[root@rocky-12 CA]# openssl ca -revoke /etc/pki/certs/test.crt
Using configuration from /etc/pki/tls/openssl.cnf
Could not open file or uri for loading certificate to be revoked from /etc/pki/certs/test.crt: No such file or directory
[root@rocky-12 CA]# cat /etc/pki/CA/index.txt
V       261006090722Z           0F      unknown /C=CN/ST=bj/O=wangge/OU=sre-cless/CN=www.xiao.com

更新吊销证书信息

[root@rocky-12 CA]# echo 01 > /etc/pki/CA/crlnumber
[root@rocky-12 CA]# openssl ca -gencrl -out /etc/pki/CA/crl.pem
Using configuration from /etc/pki/tls/openssl.cnf
[root@rocky-12 CA]# openssl crl -in /etc/pki/CA/crl.pem -noout -text
Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=bj, L=bj, O=wangge, OU=sre, CN=www.xiao.com
        Last Update: Jun 28 09:41:16 2026 GMT
        Next Update: Jul 28 09:41:16 2026 GMT
        CRL extensions:
            X509v3 CRL Number: 
                1
No Revoked Certificates.
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:

八、SSH服务

8.1基础知识

  • SSH服务是一种网络协议,用于在不安全的的网络中提供安全带的远程登录和其他安全网络服务。SSH服务通过加密和认证机制,确保了数据的到传输安全性和用户身份的验证,可以有效防止远程管理过程中的信息泄露问题,SSH最初是LINUX系统的一个程序,后来又迅速扩展到其他操作平台。
  • SSH服务的端口默认是22端口

8.2主要功能

  • 远程登录:SSH 最常见的用途是允许用户安全地登录到远程计算机上。用户可以通过 SSH 客户端(如 ssh 命令)连接到 SSH 服务器,并输入用户名和密码(或使用其他认证方法,如公钥认证)来登录。
  • 文件传输:SSH 还提供了安全的文件传输功能,通常通过 scp(Secure Copy Protocol)或 sftp(SSH File Transfer Protocol)实现。这些工具允许用户在两台计算机之间安全地传输文件。
  • 端口转发:SSH 可以配置为端口转发器,允许用户将一台计算机上的端口流量安全地转发到另一台计算机上的端口。这对于绕过防火墙或访问内部网络资源非常有用。
  • 隧道:SSH 隧道允许用户创建加密的通道,通过该通道可以安全地传输各种协议的数据。例如,用户可以使用 SSH 隧道来安全地访问远程数据库或 web 服务。
  • 命令执行:SSH 允许用户远程执行命令,而无需登录到远程计算机。这可以通过 ssh 命令的 -C(执行命令)选项实现。

8.3简单连接远程主机

root@ubuntu-22:~# ssh root@10.0.0.12
The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.
ED25519 key fingerprint is SHA256:F8g9hiArusK12j6jAylA0MoXI3BOgaMywreT62Yq5LI.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.12' (ED25519) to the list of known hosts.
  1. 前置基础:服务器身份凭证

每台 SSH 服务器会生成一对主机密钥(Host Key,永久固定,区分于用户登录密钥)

  • 私钥:保存在服务器 /etc/ssh/ssh_host_*_key,绝不对外暴露;
  • 公钥:计算哈希指纹(sha256/md5),连接时自动发送给客户端。
  1. 首次连接完整流程(弹出警告的原因)

  2. 客户端发起 TCP 连接到服务器 22 端口;

  3. 握手阶段服务器将自身主机公钥发送给客户端;

  4. 客户端检查本地文件

    ~/.ssh/known_hosts
    
    • 文件内记录所有曾经信任过的「IP / 域名 + 对应主机公钥」;

    • 首次连接无该服务器记录,文件匹配失败,触发警告警并打印主机公钥指纹;

      The authenticity of host 'xxx' can't be established
      
  5. 交互询问用户:

    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    
    • 用户输入yes:客户端把「服务器地址 + 公钥指纹」写入known_hosts,完成登录;
    • 用户输入no:直接断开连接,放弃登录。
  6. 非首次连接校验逻辑(防篡改)

后续再次连接同一服务器时:

客户端拿服务器发来的公钥,和known_hosts中已保存的公钥比对:

  • 一致:直接登录,无任何提示;
  • 不一致(服务器公钥变了):抛出高危中间人告警,强制断开连接,禁止登录。

防止中间人攻击MITM

  1. 信任锚绑定(核心防护)

首次连接是人工信任锚建立点

只有你手动确认服务器真实指纹并写入known_hosts后,客户端才永久绑定「服务器地址 + 唯一公钥」。

后续任何第三方无法替换服务器公钥,一旦公钥变动直接阻断连接。

  1. 两种场景拦截攻击

  2. 首次连接阶段

    :必须人工核对指纹

    你需要通过线下渠道(机房控制台、运维台账、服务器本地查看)获取真实主机指纹,和 SSH 弹窗打印的指纹比对,一致再输入 yes;

    若不核对直接回车,会存在被中间人劫持风险。

  3. 非首次连接

    :自动校验阻断

    中间人即便拦截流量、替换服务器公钥,内已有合法公钥记录,两者不匹配,SSH 直接报错并断开,不会泄露任何登录数据

    known_hosts
    

后续的连接

  • 如果首次连接之后,保存了远程主机的公钥,后续远程主机发生了改变,则会提示,如果远程主机确实发生了改变,可以删除本地的~./.ssh/konw_host中对应的公钥
#简单模拟一下 物理网卡或者重装系统
[root@rocky-12 ~]# rm -f /etc/ssh/ssh_host_*  
[root@rocky-12 ~]# systemctl restart sshd
root@ubuntu-22:~# ssh root@10.0.0.12
root@10.0.0.12's password: 
Last login: Sun Jun 28 20:59:39 2026 from 10.0.0.1
[root@rocky-12 ~]# exit
注销
Connection to 10.0.0.12 closed.
root@ubuntu-22:~# ssh root@10.0.0.12
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:/5+kPp6sfIzmI9CHEKvHVvJWNYPNC9i/exT6UK/NjUg.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:3
  remove with:
  ssh-keygen -f '/root/.ssh/known_hosts' -R '10.0.0.12'
Host key for 10.0.0.12 has changed and you have requested strict checking.
Host key verification failed.

删除之前的~./.ssh/know_hosts文件就可以重新建立连接了

root@ubuntu-22:~# rm -f ./.ssh/known_hosts
root@ubuntu-22:~# ssh root@10.0.0.12
The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.
ED25519 key fingerprint is SHA256:/5+kPp6sfIzmI9CHEKvHVvJWNYPNC9i/exT6UK/NjUg.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.12' (ED25519) to the list of known hosts.
root@10.0.0.12's password: 
Last login: Sun Jun 28 21:11:41 2026 from 10.0.0.22

8.3 SSH配置

SSH常用配置解读

[root@rocky-12 ~]# cat /etc/ssh/sshd_config
Port 22								#远程端口,生产建议修改

ListenAddress 0.0.0.0
LoginGraceTime 2m
PermitRootLogin yes					#默认情况下是不允许root登录的
StrictModes yes						#检查.ssh/文件的所有者,权限等
MaxAuthTries 6						#一次的连接最多允许输错6次密码
MaxSessions 10						#同一个连接最大的会话 10

PubkeyAuthentication yes			#开启基于key的验证
PermitEmptyPasswords no				#不允许空密码连接  

PrintMotd no						#是否输出motd信息改成yes输出两次
PrintLastLog yes					#是否输出上次的登录信息
UseDNS no							#是否需要解析主机名,no可以加快连接速度

Banner /path/file					#远程连接主机的时候登录前提示
GSSAPIAuthentication yes 			#是否开启客户端对IP的反解析提高速度可no

ALLowUsers user1 user2 				#用户的白名单
DenyUsers user1 user2 				#用户的黑名单
ALLowGroups g1 g2					#用户组的白名单
DenyGroups g1 g2 					#用户组的黑名单

PubkeyAcceptedAlgorithms +ssh-rsa	#支持旧版本的rsa秘钥认证

简单实战

设置ssh的服务超时断开连接

# 10s如果没有互动,则会断开连接,永久生效可以写配置文件,例如可以写在/etc/profile
root@ubuntu-22:~# export TOMUT=10

关闭DNS解析选项,加快连接速度

root@ubuntu-22:~# vim /etc/ssh/sshd_config
GSSAPICleanupCredentials no
UseDNS no
root@ubuntu-22:~# systemctl restart sshd

在Ubuntu上开启root远程登录

root@ubuntu-22:~# vim /etc/ssh/sshd_config
PermitRootLogin yes
root@ubuntu-22:~# systemctl restart sshd

ssh服务的常见管理策略

  1. 建议使用非默认端口
  2. 禁止使用protocol version1
  3. 限制可登录用户
  4. 设置空闲会话超时时长
  5. 利用防火墙设置ssh访问策略
  6. 仅监听特定的IP地址
  7. 基于口令认证时候,使用强密码认证策略
  8. 使用基于秘钥的认证
  9. 禁止使用空密码
  10. 禁止root用户直接登录
  11. 限制ssh的访问频度和并发在线数
  12. 经常分析日志

九、SCP和RSYNC传输

9.1功能对比

  • scprsync都是跨主机文件的传输工具(均基于ssh加密),但是核心设计目标、创术效率、功能特性差异极大 scp侧重于简单直接完整复制 rsync侧重于“高效增量同步”

先和cp对比一下

  1. cp(本地复制)
  • 通信层面:仅操作本机磁盘、内存,无网络交互,不使用任何网络协议、端口。
  • 执行原理:调用系统本地文件读写 API,在内核中直接完成文件数据拷贝,只作用于本机目录 / 磁盘。
  • 适用:同一台机器内部文件复制。
  1. scp(安全远程拷贝)
  • 通信层面:底层封装SSH 协议,走 TCP 22 端口,全程加密传输文件二进制流;支持跨主机读写。
  • 执行原理
    • 本地发起 SSH 握手连接目标服务器;
    • 建立加密隧道后,通过 SSH 通道传输文件;
    • 远端启动 scp 子进程接收 / 写出文件;
  • 适用:本地 ↔ 远程服务器、两台远程服务器之间互传文件

SCP&RSYNC

对比维度scprsync
核心定位远程文件复制工具(加密版cp远程/本地文件同步工具
传输机制全量复制:无论是文件是否变化,均重新传输完整的文件增量同步:仅传输“源与目标的差异部分”(基于文件的大小、修改时间、校验和)
效率表现首次复制与rsync接近,重复复制效率极低首次复制效率相当:重复复制的时候效率极高
核心功能仅支持复制(无 同步、删除、备份功能)支持增量同步、删除冗余文件、备份归档、权限保留、断点续传
断点续传不支持(传输中断需要重新传输)支持-p选项中断可以恢复
文件一致性仅保证复制完成,不校验文件是否一致可以通过检验和-c选项确保源与目标完全一致
冗余文件处理不会删除目标的多余文件仅覆盖或新增支持删除目标端的不存在的文件--delete实现同步
权限属性保留仅保留部分属性如权限、所有者,需要-p选项可以完整保留权限、所有者、修改时间、软连接
压缩传输需要手动-c选项开启默认支持压缩传输(-z可以强化)压缩效率更高
语法复杂度极简(与cp差不多)功能丰富,选项较多(学习成本稍微高)
依赖条件仅依赖ssh服务(openssl-client)需要安装rsync工具(两端均可,或仅源端、目标端一致,仅取决于传输模式)

场景对比

需求场景优先选 scp优先选 rsync
临时传输少量文件 / 小文件(如单个配置、日志)✅ 简单高效,不用记复杂选项❌ 小题大做,没必要
传输大文件、频繁更新的目录(如代码、备份)❌ 重复传输,浪费带宽和时间✅ 增量同步,效率极高
服务器备份(需保留权限、增量备份)❌ 无增量 / 备份功能,无法满足✅ 支持归档、增量、权限保留,是备份首选
需断点续传(如大文件传输易中断)❌ 不支持,中断需重来-P 选项直接实现
需同步两端文件(删除目标端多余文件)❌ 无删除功能,无法同步状态--delete 实现 “源端为主” 的同步
仅需要 “复制” 功能,不需要额外特性✅ 语法简单,学习成本低❌ 功能冗余,操作稍复杂

rsync命令解读

#命令格式
rsync [OPTION]... SRC [SRC]... DEST
#常用选项
-a --archive         #保留所有属性,但不包括acl和selinux
-v --verbose         #显示详细过程
-r --recursive       #递归复制
#一般选项
-n --dry-run         #只测试,不执行
-p --perms           #保留权限属性
-t --times           #保留修改时间戳
-g --group           #保留组信息
-o --owner           #保留所有者信息
-l --links           #将软链接文件本身进行复制(默认)
-L --copy-links      #将软链接指向的文件复制
-u --update          #如果接收者的文件比发送者的文件较新,将忽略同步
-z --compress        #压缩,节约网络带宽
--delete             #如果原文件被删除,则目标中的对应文件也要被删除,配合-r使用
--progress           #显示进度
--bwlimit=5120       #限速以KB为单位,5120表示5MB

准备文件

#两个主机都需要暗转rsync
root@ubuntu-22:~# mkdir 0628
root@ubuntu-22:~# cp /etc/fstab /etc/issue ./0628/
root@ubuntu-22:~# cd 0628/
root@ubuntu-22:~/0628# ls
fstab  issue

传输(全量复制)

root@ubuntu-22:~/0628# rsync -av /root/0628 root@10.0.0.12:/tmp/
root@10.0.0.12's password: 
sending incremental file list
0628/
0628/fstab
0628/issue

sent 878 bytes  received 58 bytes  374.40 bytes/sec
total size is 683  speedup is 0.73

查看目标机,属性保持一致

root@ubuntu-22:~/0628# ssh root@10.0.0.12 "ls /tmp/0628"
root@10.0.0.12's password: 
fstab
issue

文件级别的传输

root@ubuntu-22:~/0628# rsync -av /root/0628/ root@10.0.0.12:/tmp/
root@10.0.0.12's password: 
sending incremental file list
./
fstab
issue

sent 863 bytes  received 57 bytes  368.00 bytes/sec
total size is 683  speedup is 0.74

文件增量复制

准备新文件

root@ubuntu-22:~/0628# cp -r /var/log/journal ./
root@ubuntu-22:~/0628# ls
fstab  issue  journal

这次这复制了新增的journal目录

root@ubuntu-22:~/0628# rsync -av /root/0628/ root@10.0.0.12:/tmp/
root@10.0.0.12's password: 
sending incremental file list
./
journal/
journal/a217d3fbef144f95b0745c059af64ca8/
journal/a217d3fbef144f95b0745c059af64ca8/system.journal
journal/a217d3fbef144f95b0745c059af64ca8/system@0006552861628f5f-39dc93bddc8fc5cb.journal~
journal/a217d3fbef144f95b0745c059af64ca8/system@43c13b1fa8574070954707439472fa55-0000000000001016-000653442f49d6b5.journal
journal/a217d3fbef144f95b0745c059af64ca8/system@55d7fbbb7f674c5b8746cc07037c70bc-000000000000188a-00065443798ebb1a.journal

如果执行 rsync -r /data/app /backuprsync -r /data/app/ /backup,两个命令执行后,目标端 /backup 的目录结构会有什么细节差异?

把整个app文件复制到backup目录下

root@ubuntu-22:~# rsync -r /date/app /backup
root@ubuntu-22:~# tree /backup/
/backup/
└── app
    └── fstab

2 directories, 1 file

只复制app下的文件到backup目录下

root@ubuntu-22:~# rsync -r /date/app/ /backup
root@ubuntu-22:~# tree /backup/
/backup/
├── app
│   └── fstab
└── fstab

2 directories, 2 files

这个一定要看好是要复制整个目录还是把文件内容平铺到目录中,潜在的危害

  • 危害 1:备份目录层级错乱,恢复数据完全失效
  • 危害 2:磁盘容量冗余翻倍,存储空间耗尽
  • 危害 3:覆盖、冲掉备份目录原有其他业务数据(灾难性)
  • 危害 4:搭配--delete参数会批量删除备份内无关业务(最致命)
  • 危害 5:增量备份逻辑完全崩塌,历史快照损坏

9.2SSH认证通信

基于秘钥的登录方式

  1. 首先在客户端生成一对密钥(ssh-keygen)
  2. 并将客户端的公钥 ssh-copy-id 拷贝到服务端
  3. 当客户端再次发送一个连接请求,包括 ip、用户名
  4. 服务端得到客户端的请求后,会到 authorized_keys 中查找,如果有相应的 IP 和用户,就会随机生成一个字符串,例如:xiaowang
  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
  6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

命令解读

# 在客户端生成秘钥对
	ssh-keygen -t rsa [-p 'passwd'] [-f "~/.ssh/id_rsa"]
# 公钥文件传输给远程的服务端对应的家目录
	ssh-copy-id [-i [identity_file]] [user@]host

简单实践

在客户端生成秘钥

root@ubuntu-22:~# ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:rrET/xnCsM6v6r41dtrAfuMdRf5i+NYYy7Gc9ejR5ow root@ubuntu-22
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|                 |
|            .    |
|           o     |
|      . S   o    |
|     ..=   oo... |
|      Oo= +ooXooo|
|     *.X+o *O.o*.|
|   o=oO*+o+...E o|
+----[SHA256]-----+

把公钥传给远程的服务器对应的家目录

root@ubuntu-22:~# ssh-copy-id root@10.0.0.12
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ed25519.pub"
The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.
ED25519 key fingerprint is SHA256:/5+kPp6sfIzmI9CHEKvHVvJWNYPNC9i/exT6UK/NjUg.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/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
root@10.0.0.12's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.0.0.12'"
and check to make sure that only the key(s) you wanted were added.

查看目标主机

[root@rocky-12 ~]# ls .ssh/
authorized_keys

测试免密登录

root@ubuntu-22:~# ssh root@10.0.0.12 "tree /date"
/date
├── app.py
├── ceshi-all
├── ceshi-ok
├── ceshi.sh
├── data
│   └── dir
│       └── dir1
│           └── dir2
│               ├── 1.txt
│               └── dir3
├── date
│   ├── test.csr
│   └── test.key
├── file.txt
├── fstab
├── hosts
├── nihaoya
└── test

7 directories, 12 files

多主机互通

ssh-keygen 
ssh-copy-id 127.1
scp -r .ssh 10.0.0.xxx:/root/
[root@ubuntu-22 ~]# ll .ssh/
authorized_keys   	# 已认证的客户端的公钥
id_rsa				# 私钥
id_rsa.pub			# 公钥
Known_hosts			# 已知的主机列表

#相较于ssh-copy-id来说,所有的主机使用的公钥和私钥都是一样的,无需在每台主机上重复生成各自的私钥只需要更新know_hosts即可

十、sudo授权

查看sudo的软件包

root@ubuntu-22:~# dpkg -l sudo
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version                   Architecture Description
+++-==============-=========================-============-=================================
======================
ii  sudo           1.9.15p5-3ubuntu5.24.04.2 amd64        Provide limited super user privil
eges to specific users
[root@rocky-12 ~]# rpm -qa sudo
sudo-1.9.17-4.p2.el10_2.x86_64

工具命令

#核心命令
	sudoedit # 授权编辑规则的文件工具
	sudo 	# 授权执行命令
#一般命令
	visudo	#安全检查授权规则的文件和语法检查
	#语法检查
	visudo -c
	visudo -f /etc/sudoers.d/test

规则实践

sudo授权配置规则

一、基础语法格式

授权 user 用户可以在 host 主机上以 runas 的身份执行 command,TAG 可为空

user host=(runas) [TAG]:command

常见 TAG:NOPASSWD,表示执行命令的时候,不需要验证

举例:

wo wanda=(sicong) chifan
# wo 在 wanda 以 sicong 的身份去 chifan,需要出示工牌

wo wanda=(sicong) NOPASSWD:chifan
# wo 在 wanda 以 sicong 的身份去 chifan,不需要出示工牌

二、授权示例

root ALL=(ALL:ALL) ALL     # (所有者:归属组)
root ALL=(ALL) ALL

注意:

root 就是一个普通的用户名

ALL 代指所有,在不同位置,就代表不同的所有对象

三、用户组授权示例

%wheel  ALL=(ALL) ALL
%#10    ALL=(%#0) /bin/cat /var/log/secure

注意:组名的写法 % groupName 或 %#gid

四、别名定制说明

上面所有的部分都可以通过别名的方式来定制

类型:User_Alias|Runas_Alias|Host_Alias|Cmnd_Alias

格式:

Alias_Type NAME = item1, item2, ...

注意:别名名称由大写字母开始,后面接大写字母,数字,下划线

正则规则:NAME = [A-Z]([A-Z][0-9]_)*

简单演示

准备工作

#创建用户
[root@rocky-12 ~]# useradd -m wangwu
#设置密码
[root@rocky-12 ~]# echo 123456 |passwd --stdin wangwu
# 也可以使用 passwd wangwu

visudo 实现语法检查

检查用户的归属组

[root@rocky-12 ~]# id wang
uid=1000(wang) gid=1000(wang)=1000(wang),10(wheel)
[root@rocky-12 ~]# grep '%wheel' /etc/sudoers
%wheel  ALL=(ALL)       ALL
# %wheel        ALL=(ALL)       NOPASSWD: ALL

测试用户执行超越自身 的权限

[root@rocky-12 ~]# su - wang
上一次登录: 2026年06月28日 星期日 23:44:57 CST 于 pts/0
[wang@rocky-12 ~]$ ls /root/
ls: 无法打开目录 '/root/': 权限不够

[wang@rocky-12 ~]$ sudo ls /root/
[sudo] wang 的密码:
anaconda-ks.cfg

查看特定用户的sudo权限

[root@rocky-12 ~]# sudo -l -U wang
匹配 rocky-12 上 wang 的默认条目:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset,
    env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2
    QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION
    LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER
    LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

用户 wang 可以在 rocky-12 上运行以下命令:
    (ALL) ALL

有效期限拓展

#想要修改默认有效期权限的话,可以修改/etc/sudoers文件的规则
#默认情况下,该属性没有
	Defaults timestamp_timeout=5
	
#关于有效期的控制文件在 /run/sudo/ts/
[root@rocky-12 ~]# ls /run/sudo/ts/
1000
#只要把这个文件删除,那么普通用户的sudo就会需要重新输入密码

指定执行用户

wang无法查看wangwu的工作目录

[root@rocky-12 ~]# su - wang
上一次登录: 2026年06月28日 星期日 23:50:22 CST 于 pts/0
[wang@rocky-12 ~]$ ls /home/wangwu
ls: 无法打开目录 '/home/wangwu': 权限不够

订制sudo规则无密码设置

[root@rocky-12 ~]# vim /etc/sudoers
[root@rocky-12 ~]# cat /etc/sudoers |grep %sudo
%sudo All=(ALL:ALL) NOPASSWD:ALL
# NOPASSWD 就是无密码设置 :后面不加空格

其他认证文件移除

[root@rocky-12 ~]# rm -f /run/sudo/ts/1000

尝试其他用户sudo

[wang@rocky-12 ~]$ sudo ls /root/
anaconda-ks.cfg

为什么必须用 visudo,禁止直接 vim /etc/sudoers

  • visudo 两大核心保护机制
  1. 语法预校验(最关键)

    visudo 保存前会自动调用

    sudo -c
    

    校验 sudoers 语法;一旦存在语法错误,会弹窗提示,

    禁止写入损坏配置。直接 vim 保存错语法,系统 sudo 直接全体失效,所有管理员无法提权,机器失去运维权限。

  2. 文件独占锁

    visudo 编辑时会加临时锁文件,防止多人同时编辑覆盖冲突

    /etc/sudoers.tmp。
    
  • 直接 vim 的致命风险

手动 vim 保存后不会校验语法,任意一处拼写、符号错误,会导致所有 sudo 权限完全失效,root 之外用户无法执行管理员操作,线上故障

生产无限制使用的隐患

  1. 账号泄露即提权

    若用户普通账号被黑客入侵、密码泄露,攻击者不用密码就能执行全部 sudo 管理员命令,直接接管服务器。

  2. 恶意脚本 / 木马自动提权

    恶意程序、webshell 可直接调用 sudo 执行高危命令(删数据、改防火墙、植入后门),无密码拦截。

  3. 无操作验证,审计风险上升

    正常 sudo 输密码是二次校验,NOPASSWD 取消校验,误操作、恶意操作无拦截,数据丢失风险大幅提高。

  4. 最小权限原则失效

    若搭配允许所有命令,等于把 root 权限无门槛开放给普通用户。

    ALL
    

十一、时间同步

Chrony时间同步

基础知识

在微服务或数据库集群中,服务器之间的时间不同步可能会引发哪些灾难性问题

  • 数据层面:主从同步断裂、分布式事务错乱、超卖 / 资损、数据不一致;
  • 服务可用性:注册中心误剔除、集群脑裂、定时任务失效、接口鉴权拦截;
  • 运维排障:日志时序混乱无法定位故障,审计失效不合规;
  • 安全层面:证书鉴权失效、签名校验拦截全部内外调用。

简述 systemd-timesyncdchrony 在定位和应用场景场景上有何区别

  • systemd-timesyncd:轻量自带客户端,只同步本机,不能当时间服务器,适合桌面 / 单机容器;
  • chrony:企业级双向 NTP 工具,客户端 + 授时服务一体,校正精度高,是服务器、集群生产环境标准方案。

timedatectl简介

timedatectl命令是LINux系统下的用于查看和设置系统时间、日期、时区以及NTP的强大工具

命令格式

#命令格式:
timedatectl [OPTIONS...] COMMAND ...
#常用子命令
status 						#显示当前时间设置,默认项
show 						#以友好格式显示,具体内容同 status
set-time TIME 				#修改时间
set-timezone ZONE 			#修改时区
list-timezones 				#列出当前可用时区
set-local-rtc BOOL 			#RTC 时间是否关联本地时区
set-ntp BOOL 				#是否开启 ntp 服务

简单实践

[root@rocky-12 ts]# timedatectl
               Local time: 一 2026-06-29 00:31:39 CST
           Universal time: 日 2026-06-28 16:31:39 UTC
                 RTC time: 日 2026-06-28 16:31:39
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
# RTC Read-Time clock 硬件时间,来自于时钟芯片
# UTC Coordinate Universal time 世界协调时间,又称世界标准时间
# GMT Greenwich Mean time 格林尼治(天文台)标准时间
[root@rocky-12 ts]# timedatectl show
Timezone=Asia/Shanghai
LocalRTC=no
CanNTP=yes
NTP=yes								# 该功能开启无法手动调date时间
NTPSynchronized=yes
TimeUSec=Mon 2026-06-29 00:34:41 CST
RTCTimeUSec=Mon 2026-06-29 00:34:41 CST

修改时间

# 关闭时间同步
[root@rocky-12 ts]# timedatectl set-ntp 0
[root@rocky-12 ts]# timedatectl set-time "2026-10-15 00:00:00"
[root@rocky-12 ts]# date
20261015日 星期四 00:00:06 CST

自动对表

[root@rocky-12 ts]# timedatectl set-ntp 1
[root@rocky-12 ts]# timedatectl 
               Local time: 一 2026-06-29 00:38:09 CST
           Universal time: 日 2026-06-28 16:38:09 UTC
                 RTC time: 日 2026-06-28 16:38:09
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

timedatectl set-ntp 1启用的是systemd-timesyncd服务

  • systemd-timesyncd 是 systemd 提供的一个系统服务,用于将本地系统时钟与远程网络时间协议(NTP)服务器进行同步。它实现了简单网络时间协议(SNTP),可以在系统时钟偏移较大时进行大步调整,在偏移较小时进行缓慢调整。
  • timedatectl 命令是 systemd 系统和服务管理器的一部分,通过 set-ntp 选项可以方便地启用或禁用 systemd-timesyncd 服务,从而控制 NTP 时间同步功能的开启与关闭。

chrony 的优势:

  • 更快的同步只需要数分钟而非数小时时间,从而最大程度减少了时间和频率误差,对于并非全天 24 小时运行的虚拟计算机而言非常有用,能够更好地响应时钟频率的快速变化,对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节能技术而言非常有用。
  • 在初始同步后,它不会停止时钟,以防对需要系统时间保持单调的应用程序造成影响,在应对临时非对称延迟时(例如,在大规模下载造成链接饱和时)提供了更好的稳定性,无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

vs systemd-timesyncd

systemd-timesyncd 和 chrony 都是 Linux 系统中用于时间同步的工具,但它们在功能、适用场景和设计目标上有明显区别。

systemd-timesyncd 是 systemd 生态的轻量级组件,仅实现 SNTP(简单网络时间协议),功能单一:

  • 仅支持客户端模式(不能作为 NTP 服务器给其他设备同步)。
  • 仅能与远程 NTP 服务器同步时间,无复杂的时钟调整策略。
  • 适合简单场景(如个人电脑、嵌入式设备),资源占用极低(内存通常 <1MB)。
  • 仅支持基础的周期性同步,对网络波动的适应性较差,时间精度一般(毫秒级)。

优先选 systemd-timesyncd 的场景:

  1. 简单的桌面系统、个人服务器,仅需基本的时间同步功能。
  2. 对系统资源(内存、CPU)敏感的环境(如嵌入式设备)。
  3. 已使用 systemd 作为 init 系统,希望减少额外组件依赖。

文件的组成

[root@rocky-12 ts]# rpm -q chrony
chrony-4.8-2.el10.x86_64

Ubuntu需要单独去安装chrony软件包会自动启动

root@ubuntu-22:~# systemctl is-active chrony
inactive
root@ubuntu-22:~# apt install -y chrony
root@ubuntu-22:~# systemctl is-active chrony
active

端口

[root@rocky-12 ts]# grep 123 /etc/services 
ntp             123/tcp
ntp             123/udp                         # Network Time Protocol

简单演示

help 						#显示帮助信息
accheck 					#检查是否对特定主机可访问当前服务器
activity 					#显示有多少 NTP 源在线 / 离线
sources [-v] 				#显示当前时间源的同步信息
sourcestats [-v] 			#显示当前时间源的同步统计信息
add server 					#手动添加一台新的 NTP 服务器
clients 					#报告已访问本服务器的客户端列表
delete 						#手动移除 NTP 服务器或对等服务器
settime 					#手动设置守护进程时间
tracking 					#显示系统时间信息
[root@rocky-12 ts]# chronyc
chrony version 4.8
Copyright (C) 1997-2003, 2007, 2009-2025 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> tracking
Reference ID    : D21C8204 (time.nju.edu.cn)
Stratum         : 2
Ref time (UTC)  : Sun Jun 28 16:52:26 2026
System time     : 0.000019871 seconds fast of NTP time
Last offset     : -0.000173205 seconds
RMS offset      : 0.000489401 seconds
Frequency       : 16.963 ppm slow
Residual freq   : -0.061 ppm
Skew            : 2.299 ppm
Root delay      : 0.032510120 seconds
Root dispersion : 0.000920276 seconds
Update interval : 64.9 seconds
Leap status     : Normal
属性解析:
server 			#时钟服务器地址,加 iburst 选项表示服务可用时,加快初始同步速度。
pool 		#语法和指令与 server 字段相似,不同之处在于其指定的 NTP 服务可以解析多个 IP 地址
maxsources #<数量>:限制从该池中选择的服务器数量(如 maxsources 3 表示最多用 3 个)。
minpoll/maxpoll:#最小 / 最大同步间隔(单位:秒,以 2 的幂计算,如 minpoll 4 表示 16 秒)
prefer:#标记为优先使用的服务器(当多个源可用时优先选择)
其他属性
driftfile #根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中,会在重启后为系统时钟作出补偿
rtcsync #启用内核模式,系统时间每 11 分钟会拷贝到实时时钟(RTC)
allow #指定可以使用本机服务的设备,格式可以是 IP,子网,网段
deny #指定不可以使用本机服务的设备,格式可以是 IP,子网,网段
cmdallow #指定设备可以通过 chronyd 使用控制指令,cmddeny 指定设备不可以通过 chronyd 使用控制指令
bindcmdaddress #允许 chronyd 监听哪个接口来接收由 chronyc 执行的命令
makestep #强制 chronyd 在调整期大于某个阈值时调整系统时钟
local stratum 10 #即使 server 指令中时间服务器不可用,也允许将本地时间作为标准时间授时给其它客户端

简单实践

[root@rocky-12 ts]# vim /etc/chrony.conf 
[root@rocky-12 ts]# systemctl restart chronyd
[root@rocky-12 ts]# grep aliyun /etc/chrony.conf 
server ntp.aliyun.com iburst

检查效果

[root@rocky-12 ts]# chronyc
chrony version 4.8
Copyright (C) 1997-2003, 2007, 2009-2025 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> activity
200 OK
1 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
chronyc> sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17    60   -761us[-1525us] +/-   16ms

修改时间并查看同步过程

[root@rocky-12 ts]# date -s "-100 day"
2026年 03月 21日 星期六 01:00:30 CST
[root@rocky-12 ts]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? 203.107.6.88                  2   6   177    27   -2400h[ -2400h] +/-   17ms
#结果显示相差了2400个小时

同步可直接重启服务

^? 203.107.6.88                  2   6   177    27   -2400h[ -2400h] +/-   17ms
[root@rocky-12 ts]# systemctl restart chronyd
[root@rocky-12 ts]# chronyc 
chrony version 4.8
Copyright (C) 1997-2003, 2007, 2009-2025 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> activity
200 OK
1 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
chronyc> sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6    17    10    +95us[ -185us] +/-   15ms

自建时间服务器

服务端配置

[root@rocky-12 ts]# vim /etc/chrony.conf 
[root@rocky-12 ts]# grep -Ev "^#|^$" /etc/chrony.conf 
server ntp.aliyun.com iburst
allow 10.0.0.0/24
local stratum 10 
sourcedir /run/chrony-dhcp
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
[root@rocky-12 ts]# systemctl restart chronyd

客户端配置

root@ubuntu-22:~# vim /etc/chrony/chrony.conf 
root@ubuntu-22:~# grep server /etc/chrony/chrony.conf 
# About using servers from the NTP Pool Project in general see (LP: #104525).
server 10.0.0.12 iburst
root@ubuntu-22:~# systemctl restart chronyd
root@ubuntu-22:~# chronyc -n sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 10.0.0.12                     3   6    17    12  +3365ns[  +30us] +/-   16ms

我这里就最配置一台演示 在生产环境中 需要配置对台 实现高可用

查看

[root@rocky-12 ts]# chronyc -n clients
Hostname                      NTP   Drop Int IntL Last     Cmd   Drop Int  Last
===============================================================================
10.0.0.22                       5      0   4   -    62       0      0   -     -
root@ubuntu-22:~# chronyc sources -v

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 10.0.0.12                    10   6    17    21    -19us[  -91us] +/-  231us

  • * current best:当前最优时间源,系统正在以这个服务器校准本地时间(最理想状态)

  • + combined:合格备选源,数据可靠,参与时间加权计算,但不是主同步源

  • - not combined:可用但不参与加权计算,精度较差

  • x may be in error:该源数据疑似存在错误,chrony 不信任它,丢弃该源数据

  • ~ too variable:网络抖动 / 偏移波动太大,数据不稳定,可靠性低

  • ? unusable:完全不可用,连接失败、超时、校验不通过,无法同步

  • ^:这是一台标准 NTP server 服务器

  • *:10.0.0.12 是本机当前正在使用的最优时间同步源

十二 PAM

工作原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

PAM认证首先要确定哪一项的任务,然后加载相应的PAM配置文件(位于/etc/pam.d/),后调用认证文件(/lib64/security/)进行安全认证。

PAM 认证过程示例

  1. 使用者执行/usr/bin/passwd程序,并输入密码
  2. passwd 开始调用 PAM 模块,PAM 模块会搜寻 passwd 程序的 PAM 相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即 PAM 会搜寻/etc/pam.d/passwd此设置文件
  3. 经由/etc/pam.d/passwd设定文件的数据,取用 PAM 所提供的相关模块来进行验证
  4. 将验证结果回传给 passwd 这个程序,而 passwd 这个程序会根据 PAM 回传的结果决定下一个动作(重新输入密码或者通过验证)

在linux中的角色

  • PAM 是 Linux 系统身份认证的安全中枢,作为应用和底层认证机制的中间层,统一管理登录校验、账户权限、会话管控、密码策略,灵活实现单因子 / 多因子认证,抵御暴力破解、弱密码等登录层安全风险。

配置解读

module-path和arguments

配置分类值示例 / 参数名说明
模块路径配置/path/XYZ.so模块文件所在绝对路径
模块路径配置pam_nologin.so模块文件所在相对路径,表示 so 文件在 /lib64/security/ 目录下
配置文件引用规则postlogin有些模块有自己的专有配置文件,这种写法表示直接使用另一个配置
模块通用参数debug该模块应当用 syslog () 将调试信息写入到系统日志文件中
模块通用参数no_warn表明该模块不应把警告信息发送给应用程序
模块通用参数use_first_pass该模块不能提示用户输入密码,只能从前一个模块得到输入密码
模块通用参数try_first_pass该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户输入新密码
模块通用参数use_mapped_pass该模块不能提示用户输入密码,而是使用映射过的密码
模块通用参数expose_account允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用

模块类型

说明
auth帐号的认证和授权
account账户管理,用来设置某些功能和特性,如限制 / 允许用户对某个服务的访问时间等
password用户修改密码时密码复杂度检查机制等功能
session用户会话期间的控制,如最多打开的文件数,最多的进程数等
-type表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用

模块控制标记(control)

说明
required一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,也不会立即通知用户,而是要等到同一 type 中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
requisite一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一 type 内的任何模块,而是直接将控制权返回给应用程序,是一个必要条件
sufficient一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一 type 内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的 required 和 requisite
optional表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
include调用其他的配置文件中定义的配置信息
substack调用其他配置文件中的流程,并将整个运行结果作为该行的结果进行输出

。特别详细解析 requiredrequisitesufficientoptional 之间的处理逻辑与区别。 如何通过 pam_limits.so 模块对特定开发用户的最大打开文件数(open files) and 最大进程数(max user processes)进行控制? 应当在 /etc/security/limits.conf 中如何配置(写出 soft 和 hard 限制的配置语法)? 对于由 systemd 管理的系统服务(如 Nginx、MySQL),为什么在 limits.conf 中的配置可能不生效?此时应该在 systemd 的 service 文件中如何单独配置?

pam_limits.so模块

简介

  • 功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用的内存空间等

查看那些模块使用率该服务

[root@rocky-12 ~]# grep pam_limits /etc/pam.d/*
/etc/pam.d/password-auth:session     required                                     pam_limits.so
/etc/pam.d/runuser:session              required        pam_limits.so
/etc/pam.d/system-auth:session     required                                     pam_limits.so

查看默认资源限制

[root@rocky-12 ~]# ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) unlimited
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 6456
max locked memory           (kbytes, -l) 8192
max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 6456
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

修改打开文件的最大数

[root@rocky-12 ~]# ulimit -n number
[root@rocky-12 ~]# ulimit -n
1024  #默认是1024

ulimit

  • ulimit是Linux shell的内置命令,它具有一套参数集,用于对shell京城及其子进程资源的限制,使用ulimit对参数进行修改,会立即生效,但其修改是临时性的,重新登陆后无效,而且ulimit的修改,只影响当前shell的进程和子进程,没一个进程都有自己独有的limits值。如果想永久生效,可以写在profile文件中

修改进程

[root@rocky-12 ~]# vim /etc/security/limits.conf
[root@rocky-12 ~]# grep wang /etc/security/limits.conf
wang - nproc 10   #表示wang用户只能开启10个进程

root用户查看配置

[root@rocky-12 ~]# ulimit -u
6456
[wang@rocky-12 ~]$ ulimit -u
10

systemd的service的资源需要单独配置

[root@rocky-12 ~]# cat /etc/security/limits.conf 
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
#That means, for example, that setting a limit for wildcard domain here
#can be overridden with a wildcard setting in a config file in the
#subdirectory, but a user specific setting here can be overridden only
#with a user specific setting in the subdirectory.
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
  • 在 Centos7 以上版本中,使用 Systemd 替代了之前的 SysV。/etc/security/limits.conf 文件的配置作用域缩小了。
  • /etc/security/limits.conf 的配置,只适用于通过 PAM 认证登录用户的资源限制,它对 systemd 的 service 的资源限制不生效。因此登录用户的限制,通过 /etc/security/limits.conf 与 /etc/security/limits.d 下的文件设置即可。
  • 对于 systemd service 的资源设置,则需修改全局配置,全局配置文件放在 /etc/systemd/system.conf 和 /etc/systemd/user.conf,同时也会加载两个对应目录中的所有.conf 文件 /etc/systemd/system.conf.d/.conf 和 /etc/systemd/user.conf.d/.conf。
  • system.conf 是系统实例使用的,user.conf 是用户实例使用的。

编辑nginx服务的配置

在这里插入图片描述

限制用户最多打开问价数和进程数,并持久保存

[root@rocky-12 ~]# cat /etc/pam.d/system-auth 
# Generated by authselect
# Do not modify this file manually, use authselect instead. Any user changes will be overwritten.
# You can stop authselect from managing your configuration by calling 'authselect opt-out'.
# See authselect(8) for more details.

auth        required                                     pam_env.so
auth        required                                     pam_faildelay.so delay=2000000
auth        sufficient                                   pam_unix.so nullok
auth        required                                     pam_deny.so

account     required                                     pam_unix.so

password    requisite                                    pam_pwquality.so
password    sufficient                                   pam_unix.so yescrypt shadow nullok use_authtok
password    required                                     pam_deny.so

session     optional                                     pam_keyinit.so revoke
session     required                                     pam_limits.so
-session    optional                                     pam_systemd.so
session     [success=1 default=ignore]                   pam_succeed_if.so service in crond quiet use_uid
session     required                                     pam_unix.so
#用户不能超过运行进程和打开的文件数
[root@rocky-12 ~]# vim /etc/security/limits.conf
[root@rocky-12 ~]# grep -E "mysql|wang" /etc/security/limits.conf 
mysql - nofile 10240
wang -  hard nproc 10

限制wang用户最大的登录次数

[root@rocky-12 ~]# vim /etc/security/limits.conf
[root@rocky-12 ~]# grep wang /etc/security/limits.conf 
wang -  hard nproc 10
wang - maxlogins 2

配置文件格式

在这里插入图片描述
限制类型

soft 软限制,普通用户可以自己修改

hard 硬限制,只有root用户设定,并通过kernel强制生效

配置文件格式

[外链图片转存中…(img-gukpMkfp-1782717878632)]

#<domain>      <type>  <item>        <value>
#应用对象      限制类型 限制的资源    指定具体值

#应用于哪些对象
username                #单个用户
@group                  #组内所有用户
*                       #所有用户
%                       #仅用于限制 maxlogins limit,可以使用 %group 语法。单%相当于*,表示对所有用户的maxsyslogins limit限制,%group 表示限制此组中的所有用户总的最大登录数


#限制的类型
soft                    #软限制,普通用户自己可以修改
hard                    #硬限制,由root用户设定,且通过kernel强制生效
-                       #二者同时限定

#限制的资源
core|data|fsize|memlock|nofile|rss|stack|cpu|nproc|as|maxlogins|maxsyslogins|priority|locks|sigpending|msgqueue|nice|rtprio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值