加密swap是防护内存数据泄露的关键,linux通过dm-crypt实现,推荐使用每次启动生成随机密钥的方式(如/etc/crypttab配置/dev/urandom),并确保休眠时resume参数指向加密swap设备。

Linux系统中Swap分区默认不加密,休眠(hibernate)时内存内容会写入Swap,若Swap未加密,攻击者物理接触设备后可能从中提取敏感信息(如密钥、密码、会话令牌等)。因此,加密Swap是内存数据泄露防护的关键一环。
Swap加密的核心机制
Linux通过dm-crypt(设备映射加密层)对Swap设备进行透明加密。常见做法是:将Swap创建在LUKS加密卷上,或使用内核支持的encrypted swap with random key at boot(每次启动生成新密钥,不持久化),后者更轻量且避免密钥管理负担。
- LUKS方式适合与根文件系统共用同一加密密钥(如全盘加密场景),Swap作为LUKS逻辑卷的一部分被统一保护
- 随机密钥方式(如crypttab中配置swap类型+/dev/urandom)更适用于独立Swap分区或LVM LV,每次启动密钥不同,无法从磁盘回溯解密历史Swap数据
- 内核4.16+支持CONFIG_CGROUP_WRITEBACK和zswap压缩交换页,但zswap本身不加密——需配合底层块设备加密才有效
启用随机密钥加密Swap(推荐方式)
以独立Swap分区/dev/sda2为例:
- 禁用当前Swap:sudo swapoff /dev/sda2
- 编辑/etc/crypttab,添加一行:cryptswap1 /dev/sda2 /dev/urandom swap,cipher=aes-xts-plain64,size=256
- 编辑/etc/fstab,注释原Swap行,新增:/dev/mapper/cryptswap1 none swap sw 0 0
- 更新initramfs:sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut -f(RHEL/Fedora)
- 重启生效。验证:swapon --show应显示/dev/mapper/cryptswap1;sudo cryptsetup status cryptswap1可确认活跃加密状态
休眠(Hibernate)场景下的特别注意事项
启用休眠时,内核必须将整个RAM镜像写入Swap,此时Swap加密强度直接决定内存快照安全性:
- 不能使用uswsusp或旧版swsusp的非加密快照机制
- 必须确保休眠目标Swap区域与加密设备严格一致(例如resume=/dev/mapper/cryptswap1需写入内核命令行,并在/etc/initramfs-tools/conf.d/resume中同步配置)
- 若使用LUKS全盘加密,建议将/boot单独分区且不加密(否则initramfs无法读取内核参数),同时确保resume参数指向正确的解密后设备路径
- 测试休眠前务必执行sudo systemctl hibernate并验证唤醒后状态及Swap是否自动重激活
辅助防护:限制内存残留与运行时加固
Swap加密解决静态数据泄露,还需减少内存中敏感数据驻留时间:
- 应用层主动清零关键缓冲区(如用explicit_bzero()替代memset())
- 内核启用CONFIG_ZERO_PAGE_ALLOCATOR(部分发行版默认开启),降低页面复用导致的数据残留风险
- 禁用不必要的服务(如systemd-coredump),防止崩溃时内存转储到磁盘
- 对高敏环境,可考虑启用kernel.kptr_restrict=2和vm.swappiness=1,抑制内核指针泄漏并减少Swap使用频次










