西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页 → 安全中心 → 系统安全 → 服务器硬盘开了 LUKS 加密,重启忘解锁卡住开机脚本15分钟

服务器硬盘开了 LUKS 加密,重启忘解锁卡住开机脚本15分钟

相关软件相关文章发表评论 来源:本站整理时间:2026/11/3 6:05:32字体大小:A-A+

作者:xiix点击:1次评论:0次标签: LUKS 磁盘加密 cryptsetup 服务器数据盘 密钥备份

  • 类型:磁盘工具大小:32.2M语言:多国语言[中文] 评分:10.0
  • 标签:
立即下载

去年有一台跑数据库的云主机,我给它的数据盘加了整盘 LUKS 加密。加密本身一次成功,前前后后不到十分钟。可两周后的一次例行重启,把我按在地上摩擦了 15 分钟:开机脚本卡在等待数据盘挂载,日志里全是 dependency failed,业务是关着的,监控告警一条接一条。

那 15 分钟我干了什么?翻旧笔记、找密码、临时把加密层摘掉、把服务改成裸盘直挂。服务起来之后我第一件事不是庆祝,而是把这套流程重做了一遍,并把密钥备份方案补齐。后来复盘发现,我踩的坑有四个,其中最后一个到现在还在提醒我。

如果你也在给服务器的数据盘做加密,或者正打算给一台老机器上的敏感数据加一层保护,可以先看看这块 terabix(AMD EPYC + RAID-10 NVMe 云服务器) 的配置说明,挑机器时把磁盘类型和冗余方式先看清,再决定要不要在上面叠一层 LUKS加密层和 RAID 是两回事,选错了顺序性能会打折。

先说清楚一件事:LUKS 不是"给硬盘加个密码"

很多人以为 LUKS 就是把盘"锁"了,其实 LUKS2 干的是三件事:把整块设备做成密文容器、用密钥槽(keyslot)管理多把解锁口令、以及把密钥材料存进设备头部的 header 里。

关键就在第三点。LUKS header 在设备的最前面,占 16MB 左右,里面记录着加盐哈希、密钥槽、还有被 master key 包裹的 volume key。所以:

  • 整盘数据(含文件系统、文件名、目录结构)都是加密的,不是只加密某个文件;
  • header 是明文的,所以挂载时系统要先读 header 才能算出真正的解密密钥;
  • 只要 header 还在、密钥槽还在,配上正确的口令就一定能解开反过来说,口令丢了,没有任何后门能救。这一点是后面第四个坑的前提。

Linux 磁盘加密命令行终端操作场景

实操:给一块空白数据盘上 LUKS 的完整流程

我用的是 Ubuntu 22.04 + LUKS2 + ext4,命令很少,但每一步的顺序不能乱。

第一步,确认设备,别搞错盘。 lsblk 看清楚,比如我们要加密的是 /dev/vdb,它是新挂的空盘,没有分区、没有文件系统。这步千万用 lsblk -f 再确认一遍,弄错设备就是数据归零。

第二步,格式化加密容器:

cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 /dev/vdb

它会要求你输入 passphrase。这里输入的是"解锁口令",不是随便设的密码它会被 PBKDF2 反复拉伸后才存进 header,拉伸次数默认好几万次,慢是设计如此,别因为慢就去改低它。

第三步,打开容器,映射出虚拟设备:

cryptsetup open /dev/vdb data_crypt

这会生成 /dev/mapper/data_crypt,它是个块设备但不是真盘,只是加密层的"明文视图"。

第四步,在映射设备上建文件系统:

mkfs.ext4 /dev/mapper/data_crypt

第五步,挂载并写进 fstab:

mount /dev/mapper/data_crypt /data,然后 blkid 拿到 /dev/mapper/data_crypt 的 UUID,写进 /etc/fstab:

UUID=xxxx-xxxx /data ext4 defaults,nofail 0 2

nofail 这两个字母很关键:它表示"这块盘挂不上也别把整个系统拖死",否则 fstab 里一行写错,系统就会卡在 emergency mode 让你进 rescue shell。这是我第二次踩坑时加上的。

服务器重启时等待磁盘解锁密码的场景

让它开机自动解锁:三种做法,我推荐第二种

做法一:initramfs + 内建 keyfile。把解锁密钥塞进 initramfs 镜像里,重启时由 initramfs 自动打开映射设备。优点是全自动,缺点是密钥以明文形式存在于 initramfs 里,任何能读到内存或 initramfs 的人就等于拿到了数据安全性等于没有,属于"防君子不防小人"。

做法二:systemd-cryptenroll + TPM/密钥文件绑定(我现在用的)。用 systemd-cryptenroll --tpm2-device=auto 把密钥槽绑定到 TPM,机器开机的过程由 TPM 放行,配合 PIN 或者 root 口令二次确认。容器化环境里没法用 TPM 时,退一步用 --unlock-key-file=/root/luks.key,但一定要记得给 keyfile 加 chmod 600,并且把它跟加密盘分开存放。

做法三:cloud-init / 云厂商的 disk-encryption。主流云厂商都提供了"用 KMS 管理密钥"的对接方案,数据盘的密钥由云侧 KMS 托管,实例开机时自动解封。这类方案最省心,前提是你的场景在云上,而且用的是支持该功能的机型。

无论哪种方式,一定要留一条"人工解锁"的兜底路径:SSH 密钥、控制台 VNC、或者云厂商的 serial console。我那台卡了 15 分钟的机器,密码之所以能输进去,就是因为我留了云控制台的 VNC 通道,不然连试错的机会都没有。

数据盘损坏与云端快照数据泄露风险示意

我踩过的四个坑,按危险程度排

坑一:重启忘了解锁,开机脚本干等 15 分钟。这就是开头那次的现场。systemd 会等 cryptsetup 挂载完成,超时默认 90 秒,但我 fstab 里还挂了一条依赖 /data 的 remote-fs.target,被牵连后一起等,加起来十几分钟。修法有两个:一是给加密映射加 x-systemd.device-timeout=30s,二是给关键服务加 After= 但不要 Requires=,让它们在盘没起来时优雅降级,而不是死等。

坑二:fstab 里写的是 /dev/vdb,不是映射设备的 UUID。云主机重启后盘符可能变(vdb 变成 vdc),或者你把盘从 A 机器迁到 B 机器,写死设备名的结果就是开机挂载失败、数据明明在却"找不到"。只认 UUID,并且在迁移时先更新 fstab 再迁移。

坑三:swap 和内存转储没跟着加密。LUKS 加密的是磁盘上的 swap 文件,但 swap 里的密钥是加盐哈希后的产物,攻击者拿到 swap 镜像后离线爆破的成本远低于你想象。同时 /var/crash 的 kdump 转储里可能直接躺着数据库连接串。所以要么把 swap 也放进加密容器,要么干脆关掉 swap(我用的是后者,配合 vm.swappiness=1),另外记得在 /etc/sysctl.conf 里加 kernel.kexec_dump_max_size=0 或直接禁掉 kdump。

坑四:重装系统前没备份 LUKS header。这个最狠。我们都知道 LUKS 没有后门,header 丢了、口令忘了,数据就是一堆密文。所以密钥备份不是可选项,是必选项:

cryptsetup luksHeaderBackup /dev/vdb --header-backup-file /root/luks-header-backup.bin

备份出来的是 16MB 的 header 二进制,里面含全部密钥槽信息。把它和口令分别放在两个地方我的做法是 header 丢进密码管理器的加密附件,口令打印在纸质应急卡上锁进保险柜(是的,老派但有效)。别把两者放在同一台机器上,那就等于没备份。

运维工程师在机房进行磁盘加密运维操作

性能到底损失多少?实测了一下

我在一台 NVMe 云主机上做了对比:同样的 4K 随机写、1G 大文件顺序读,裸盘与 LUKS 加密后各跑三轮。

顺序读基本无差别;随机写吞吐从 62K IOPS 掉到 58K IOPS,掉了 6% 左右;延迟 P99 从 0.42ms 涨到 0.55ms。原因很简单AES-XTS 在有 AES-NI 指令集的 CPU 上是硬件加速的,瓶颈落在加解密而不是盘上。现代的 EPYC、 Xeon 都有 AES-NI,NVMe 场景下这个开销基本可以接受。

但有两个例外要留意:一是超老的 CPU(没有 AES-NI)会掉到几十个百分点,这时候不如考虑只加密敏感目录;二是某些云厂商的突发型实例(burstable)本身性能抖动大,加密层的额外延迟会让尾延迟更难看,监控阈值要放宽一点。

什么情况下我觉得不值得加密

不是所有服务器都需要 LUKS。以下几种情况我会直接跳过:

其一,纯跑静态资源、无状态服务、代码在 Git 上,机器里没有任何值得偷的数据,加密只是给自己添麻烦。其二,云厂商已经提供托管密钥加密(KMS)并且默认开启,重复加密属于自找麻烦。其三,团队只有一个人、连 SSH 私钥都还没配齐在这种状态下先做密钥管理,收益高得多。

反过来,必须加密的情况也很明确:跑数据库、存用户个人信息或订单、机器会流转或转卖、要寄修或送修硬盘、或者用的是共享的托管机房磁盘。

最后给你一份能直接抄的 checklist

1. 用 lsblk -f 确认目标设备,名字记两遍;
2. luksFormat 之后立刻做 luksHeaderBackup,别拖到"改天";
3. fstab 只写 UUID,带 nofail;
4. 配好自动解锁,同时留一条人工兜底通道;
5. swap 和 kdump 要么一起加密要么直接关;
6. 开机自检时真去重启一次,别假设它能起来我那次出问题就是在例行重启时才发现的;
7. 密钥和 header 分开放,单独记一份在密码管理器里。

磁盘加密不是一次性动作,是一次需要长期维护的承诺。真正难的不是敲那几条 cryptsetup 命令,而是三年后你还找不找得到当初备份的 header 和口令。把这套流程跑顺了,它对数据安全的提升,比你在安全组上多开十条规则要大得多。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶顶
    • 1 难过难过
    • 5 囧囧
    • 3 围观围观
    • 2 无聊无聊

    发表评论

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲