加密、安全与时间同步
在这个网络安全事故频出的时代,搞运维的不懂加密,就像开车的不系安全带。今天这篇文章,把加密、CA、SSH、sudo、Chrony 这些运维必备的安全技能,用讲故事的方式串起来。
前言:安全这件事,为啥要你管?
你可能想:我就是个运维,安全不是安全团队的事吗?
错。运维是系统安全的第一道防线。
SSH 免密配不对 → 服务器被登录
NTP 时间不准 → 证书验证失败,业务挂了
密码明文传输 → 被中间人一把梭
sudo 配不好 → 普通用户搞瘫生产环境
所以这节课学的,不是"安全理论",而是你每天都要用的保命技能。
一、密码学三兄弟:对称、非对称、单向
🧑🤝🧑 对称加密 — 一把钥匙开一把锁
原理:加密用啥密钥,解密也用啥密钥。
明文 + 密钥 → 加密 → 密文 密文 + 密钥 → 解密 → 明文
类比:你和朋友共用一个保险箱,谁手里都有那把钥匙。锁门开门都用同一把。
常见算法:DES、3DES、AES(当前主流)
优点:速度快,适合加密大量数据缺点:密钥怎么安全地交给对方?这是个大问题——你不可能跟每个人都面对面交换钥匙。
👫 非对称加密 — 公钥锁、私钥开
核心:密钥成对出现,公钥公开,私钥自留。
两把钥匙,两种玩法:
| 玩法 | 操作 | 保证什么 | 类比 |
|---|---|---|---|
| 公钥加密→私钥解密 | 别人用你公钥加密,你私钥解密 | 数据机密性(只有你能看) | 邮箱口是公开的,钥匙在你手里 |
| 私钥加密→公钥解密 | 你用私钥签名,别人用公钥验证 | 身份真实性(确认是你发的) | 你在合同上签了名,谁都能对笔迹 |
常见算法:RSA、DSA、ECC
致命伤:速度慢。加密1MB数据比对称加密慢几个数量级,所以一般不直接用来加密大数据。
实际做法:让非对称加密来保护对称密钥,让对称密钥来保护数据。两个兄弟配合干活。
🔒 单向加密(哈希) — 指纹识别
特性:
任意长度输入,固定长度输出
改一个字符,结果天翻地覆(雪崩效应)
不可逆——你无法从指纹反推出原数据
# 实战命令 md5sum /etc/fstab # 128位指纹 sha256sum /etc/fstab # 256位指纹,更安全 sha512sum /etc/fstab # 512位指纹,更更安全
类比:就像人的指纹——你可以从我手指取指纹,但不可能从指纹还原出我整个人。只要数据被改了一丁点,指纹就会大变。
🧩 三个兄弟联合作战
综合加密流程(既安全又能验明正身):
A 发数据给 B: ① A 对原始数据计算哈希值 → 得到"指纹" ② A 用自己的私钥加密这个指纹 → 得到"数字签名" ③ A 生成一个临时对称密钥 → 加密"数字签名+原始数据" ④ A 用 B 的公钥加密这个对称密钥 → 发送出去:【B公钥加密的对称密钥】+【对称密钥加密的数据包】 B 收到后反向操作: ① B 用自己的私钥解密 → 得到对称密钥 ② 用对称密钥解密 → 得到"数字签名+原始数据" ③ 用 A 的公钥解密数字签名 → 得到原始哈希值 ④ 对原始数据重新算哈希 → 对比两个哈希值 ⑤ 一致 → 数据完整 + 身份确认
这一套组合拳,就是HTTPS 安全通信的底层逻辑。
🤝 DH 密钥交换:在"裸奔"的网络上建立秘密
Diffie-Hellman解决了一个看似不可能的问题:两个人从没接触过,如何在完全公开的信道上,协商出一个只有他们俩知道的秘密?
核心是利用数学中的离散对数难题——就算三个数在公网上传输,想从其中两个反推出第三个,计算量大到无法实现。
你现在每一次 HTTPS 访问,背后都在发生 DH 交换。
二、CA 证书:互联网世界的"身份证"
为啥需要 CA?
非对称加密有个死穴:你怎么确定你手里那个"公钥"真的是对方的?
万一中间人把他自己的公钥塞给你呢?
这就是中间人攻击(MITM)——你以为是跟银行通信,其实对面是个骗子,他转发你的数据,两头骗。
CA(证书颁发机构)就是来解决这个问题的——它像公安局,给服务器发"身份证"(证书)。
自建 CA 实操(手把手)
CA 的逻辑很简单:找一个大家都信任的机构,给服务器签名认证。
# 第1步:CA 自己先搞一套身份 openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048 # 第2步:CA 自签名(自己给自己发身份证) openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem \ -days 3650 -out /etc/pki/CA/cacert.pem # 会问:国家(CN)、省份、城市、公司、部门、Common Name # 第3步:服务端生成私钥和签名请求 openssl genrsa -out /data/test.key 2048 openssl req -new -key /data/test.key -out /data/test.csr # 第4步:CA 给服务端签名 touch /etc/pki/CA/index.txt echo 0F > /etc/pki/CA/serial openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100
看证书信息:
openssl x509 -in test.crt -text -noout
证书吊销(开除)
如果服务器的私钥泄露了,证书就得作废:
openssl ca -revoke /etc/pki/CA/certs/test.crt # 吊销 echo 01 > /etc/pki/CA/crlnumber # 第一次需要 openssl ca -gencrl -out /etc/pki/CA/crl.pem # 生成吊销列表
PEM vs CRT:证书的"包装"问题
| 格式 | 长啥样 | 特点 |
|---|---|---|
| PEM | Base64文本,-----BEGIN开头 | 可包含证书、私钥、证书链 |
| CRT | PEM 或 DER(二进制) | 纯X.509证书,含公钥+身份信息 |
转换命令备忘:
# CRT → PEM openssl x509 -in cert.crt -outform PEM -out cert.pem # DER格式的CRT → PEM openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem
HTTPS = HTTP + SSL/TLS
TLS 握手(简化版):
① 客户端说:"我来了,我能用的加密方式有这些……" ② 服务端返回:"选好了,这是我的证书,你看看" ③ 客户端验证证书(CA签名有效吗?过期了吗?域名对得上吗?) ④ 密钥交换(DH 走一波) ⑤ 开始加密通信
一句话总结:证书让你确认"对面是真的",加密让你和对面说的话"别人听不懂"。
三、OpenSSL 工具箱
日常运维够用的几条命令:
openssl genrsa -out my.key 2048 # 生成RSA私钥 openssl rsa -in my.key -pubout -out my.pub # 从私钥提取公钥 openssl req -new -key my.key -out my.csr # 生成证书签名请求 openssl x509 -in cert.crt -text -noout # 查看证书内容 echo -n "hello" | openssl base64 # Base64编码 echo -n "aGVsbG8=" | openssl base64 -d # Base64解码
subj 参数速记:
CN(Common Name)——域名或用户名,最重要的字段O(Organization)——公司/组织名
四、SSH:运维人的"另一双手"
4.1 SSH 是啥?
说人话:安全的远程登录工具。没有它,你就得跑到机房插显示器键盘。
默认端口:TCP 22
当前主流版本:SSH2.0
软件实现:OpenSSH(CentOS/Ubuntu默认安装)
4.2 SSH 通信原理(能看懂就行)
① 客户端连过来 ② 服务端丢过来:"这是我公钥,这是本次会话ID" ③ 客户端生成一对临时密钥(用完就扔,不留文件) ④ 客户端用自己的临时公钥异或会话ID → 算出一个值,用服务端公钥加密发过去 ⑤ 服务端用私钥解密 → 算出客户端的临时公钥 ⑥ 双方从此都知道对方的公钥,后面的通信全部加密
类比:就像两方在公共场所对暗号——先互相确认身份,然后再聊机密内容。
4.3 远程登录
# 基础操作 ssh root@192.168.1.100 ssh -p 2222 root@192.168.1.100 # 指定端口 ssh root@192.168.1.100 "hostname -I" # 远程执行命令
4.4 免密登录(密钥认证)— 运维必备
为什么要配?你写脚本批量管理几十台服务器,每台都输密码?神经病啊。
流程(理解即可):
① 本地生成密钥对(ssh-keygen) ② 把公钥复制到远程服务器(ssh-copy-id) ③ 以后登录,服务器用公钥加密随机字符串,客户端用私钥解密发回 ④ 匹配 → 放行
实战:
ssh-keygen # 回车到底,生成 ~/.ssh/id_rsa + id_rsa.pub ssh-copy-id root@10.0.0.13 # 传公钥到远端,需要输入一次密码 ssh root@10.0.0.13 # 以后直接进,不用密码
4.5 文件传输
SCP — 临时传个文件
# 本地→远程(推) scp test.txt root@10.0.0.13:/tmp/ # 远程→本地(拉) scp root@10.0.0.13:/tmp/test.txt ./ # 传目录加 -r scp -r /backup root@10.0.0.13:/opt/
rsync — 同步大杀器
和 SCP 最大的区别:rsync 只传差异部分。
# 第一次:全量传输 rsync -av /var/log/ root@10.0.0.13:/backup/log/ # 第二次:只传新增和变化的部分(秒级完成) rsync -av /var/log/ root@10.0.0.13:/backup/log/
常用选项:
| 选项 | 作用 |
|---|---|
-a | 归档模式,保留权限/时间等属性 |
-v | 显示详细信息 |
-z | 压缩传输 |
--delete | 删除目标端多余的文件 |
-n | 试运行,不真的传(先看看会有什么变化) |
路径末尾的/是个大坑:
rsync -av /root/0525 /tmp/ # 复制 0525 目录本身 rsync -av /root/0525/ /tmp/ # 复制 0525 里的所有内容
选型建议:临时传一两个文件用 SCP,频繁备份/同步用 rsync。
4.6 sshpass — 给脚本里塞密码(不推荐但有时候不得不用)
yum install sshpass # 安装 # 三种方式指定密码 sshpass -p '123456' ssh root@10.0.0.13 "hostname" sshpass -f pwd.txt ssh root@10.0.0.13 "hostname" export SSHPASS='123456'; sshpass -e ssh root@10.0.0.13
注意:把密码明文写在命令行里不安全,生产环境还是配密钥认证比较好。
五、sudo:给普通用户"临时开个后门"
5.1 理念
Linux 的安全原则是最小权限——平时用普通用户干活,需要管理员权限时sudo临时借一下。
5.2 配置文件
visudo # 编辑 /etc/sudoers,语法错了会提示,不会让你锁死系统
格式:
用户名|%组名 主机名=(以谁的身份) 标签: 命令列表
常见场景:
# ① 给 mage 全部root权限(要输入密码) mage ALL=(ALL) ALL # ② 给 mage 全部root权限(不要密码) mage ALL=(ALL) NOPASSWD: ALL # ③ 给 wheel 组所有用户root权限 %wheel ALL=(ALL) ALL # ④ 只允许 mage 重启服务和系统 mage ALL=(ALL) /usr/bin/systemctl, /usr/bin/reboot # ⑤ 允许 mage 以 sswang 的身份执行命令 mage ALL=(sswang) ALL
5.3 有效期
默认 5 分钟不用重新输密码——5分钟后又要再输一次。可以用NOPASSWD:跳过这个限制。
六、时间同步:服务器时间的"对表"
6.1 为啥时间这么重要?
你以为时间不准就是"显示错了"?看看这些场景:
数据库:两个节点时间差 30 秒 → 数据写入顺序错乱
SSL 证书:证书有效期的判断依据是本机时间 → 时间不对,证书直接提示过期
日志分析:A 服务器说 10:00 出的事,B 服务器说 10:05 → 根本没法排查
Kerberos 认证:时间差超过 5 分钟直接认证失败
6.2 Chrony vs systemd-timesyncd
| Chrony | systemd-timesyncd | |
|---|---|---|
| 定位 | 全功能 NTP 实现 | 轻量级 NTP 客户端 |
| 精度 | 高(微秒级) | 一般(毫秒级) |
| 能做 NTP 服务器 | ✅ 可以 | ❌ 只能当客户端 |
| 适合谁 | 服务器、集群环境 | 桌面电脑、笔记本 |
一句话:生产环境用Chrony,桌面环境用 timesyncd 够了。
6.3 Chrony 实操
# 配置文件:/etc/chrony/chrony.conf # 配置上游时间服务器(选一个离你近的) pool ntp.aliyun.com iburst maxsources 4 # 或 server ntp.aliyun.com iburst # 配置为本网段提供时间服务(自建NTP服务器时) allow 10.0.0.0/24 # 离线时仍可提供时间服务 local stratum 10 # 重启并验证 systemctl restart chronyd.service chronyc sources # * 开头表示已同步 chronyc sourcestats
源状态怎么看?
^* ntp.aliyun.com → * 已同步,^ 是NTP服务器(最佳状态) ^- xxx → 被排除,但可用 ^? xxx → 没连上 ^x xxx → 出错了
6.4 自建 NTP 时间服务器
场景:内网服务器不能上外网,但所有机器时间必须一致。
服务端(能上外网的机器):
# /etc/chrony/chrony.conf server ntp.aliyun.com iburst allow 10.0.0.0/24 local stratum 10 systemctl restart chronyd.service
客户端(内网机器):
# Rocky vim /etc/chrony.conf # pool 2.rocky.pool.ntp.org iburst ← 注释掉 server 10.0.0.13 iburst ← 指向内网NTP服务器 # Ubuntu vim /etc/chrony/chrony.conf server 10.0.0.13 iburst systemctl restart chronyd.service chronyc -n sources
七、常见安全攻击(面试会用上)
搞运维不一定要会攻击,但一定要知道攻击怎么发生的,才能去防御。
| 攻击类型 | 通俗解释 | 简单防御 |
|---|---|---|
| DDoS | 一群僵尸电脑同时访问你的网站,把你带宽打满 | CDN、限流、WAF |
| XSS跨站脚本 | 在评论区写<script>alert('你被黑了')</script> | 输入过滤、输出转义 |
| SQL注入 | 登录框里输入' OR 1=1 --绕过密码 | 参数化查询、过滤特殊字符 |
| 中间人攻击 | 骗子坐在你和银行中间,两头传话两头骗 | HTTPS + 证书验证 |
| 暴力破解 | 不断试密码,直到蒙对 | 限制登录次数、fail2ban |
| 会话劫持 | 偷你的 Cookie 冒充你登录 | HTTPS、Session 绑定IP |
八、PAM:Linux 认证的"插件系统"(扩展了解)
8.1 概念
PAM(Pluggable Authentication Modules)——把"认证"这件事做成插件式。
原本的 Linux 认证方式是硬编码的——每个程序自己管认证,你要改就得改程序。PAM 把认证抽出来,变成可配置的模块。
8.2 配置格式
配置文件:/etc/pam.d/服务名(如 sshd、login、sudo) 模块文件:/lib64/security/*.so
四字段格式:
type control module-path arguments
8.3 type(模块类型)
| type | 管什么 |
|---|---|
auth | 你是谁?(密码对不对) |
account | 你现在能不能用?(时间限制、账号过期?) |
password | 密码够不够复杂? |
session | 登录后要干啥?(记录日志、设置资源限制) |
8.4 control(控制标志)
| 标志 | 作用 | 类比 |
|---|---|---|
required | 必须通过,不通过最终失败 | 门禁卡+指纹,哪个不过都不行 |
requisite | 必须通过,不通过立即失败 | 保安一看你没工牌,直接拦下,不等你刷卡 |
sufficient | 通过了就放行 | 你有 VIP 卡就直接进 |
optional | 过不过无所谓 | 顺手记个名字而已 |
8.5 两个实用模块
pam_nologin.so:
touch /etc/nologin # 创建这个文件后,普通用户无法登录(root 除外)
pam_limits.so — 限制用户资源:
# /etc/security/limits.conf * soft nofile 1024 # 所有用户,打开文件数软限制 * hard nproc 10 # 所有用户,进程数硬限制 # 查看当前限制 ulimit -a ulimit -n 10240 # 临时修改
结语
这一章的内容看着散,但其实有一条主线:
安全 = 加密 × 认证 × 授权 × 时间
| 环节 | 对应技术 | 一句话 |
|---|---|---|
| 加密 | 对称/非对称/哈希 | 让别人看不懂你的数据 |
| 认证 | CA证书、SSH密钥 | 证明"你真的是你" |
| 授权 | sudo | 给你钥匙也得告诉你哪个门能开 |
| 时间 | Chrony | 大家戴同一块表,不然对不上话 |
以后你会发现,加密原理、证书签发、SSH配置、时间同步——这些不是你学完就忘的"理论课",而是你每天排查问题、部署系统、写自动化脚本时反复用到的看家本领。
动手建议:拿两台虚拟机,一台做 CA 服务器给另一台签发证书,再配 SSH 免密 + Chrony 时间同步,一条龙走一遍,比你背三遍笔记都管用。