Swap 分区不利于系统安全。当 RAM 中的数据被写入到硬盘等永久存储设备时,就会面临更高的数据泄漏风险。如果内存中的密钥恰好被写入到了 Swap 中,就大大降低了攻击者的难度,只需要简单得进行数据恢复,无论是什么加密算法都不在话下。不过,随着现在的计算机内存容量越来越来,Swap 的使用已经没有那么广泛了。
不过,很多情况下 Swap 依然是非常有用的,这时候我们可以使用 cryptsetup 对 Swap 加密一下消除安全隐患,整个过程非常简单,也不需要记忆任何的密钥。作为副作用,这意味着系统无法在关机后解密 Swap,因此无法休眠了,此外,写入 Swap 时的 CPU 占用率也会有所上升,但如果你的 CPU 支持 AES 指令集,影响会十分有限。
思路非常简单,首先,我们使用 cryptsetup 使用一个随机密钥打开 Swap 分区或文件,然后,再将 cryptsetup 在 /dev/mapper/
中创建的抽象设备作为 Swap 使用。由于密钥是随机的,因此每次抽象设备中的数据也都是完全随机的,我们在使用之前还需要重新 mkswap
创建 Swap。
我们假设已经有一个 Swap 文件位于 /swap
,因此抽象设备将是 /dev/mapper/swap
。如果你使用其他文件或分区自然没有问题,记得手工执行 cryptsetup
并观察一下 /dev/mapper
里的设备叫什么名字。如果你想自己创建 /swap
,别忘了在创建后使用 chmod 600 /swap
保护原始文件。
cryptsetup open --type plain /swap swap --key-file /dev/urandom
chmod 600 /dev/mapper/swap
mkswap /dev/mapper/swap
swapon /dev/mapper/swap
创建此脚本,赋予可执行权限,并执行此脚本,Swap 立刻可以使用了。由于这是一个一次性 Swap,我们并不需要关闭它,但如果测试需要,可以这样:
swapoff /dev/mapper/swap
cryptsetup close /dev/mapper/swap
为了方便,我使用了一个 Systemd
的 Unit 文件来做到自动挂载。
[Unit]
Requires=swap.target
[Service]
ExecStart=/usr/local/sbin/encrypted-swap
Type=oneshot
[Install]
WantedBy=multi-user.target
其中 Requires=swap.target
代表此脚本在 Systemd 执行内建的 swap
服务后执行,避免可能的竞态条件;/usr/local/sbin/encrypted-swap
代表脚本的位置;Type=oneshot
代表此服务只运行一次,然后立刻退出。首先关闭现有的 Swap,把此文件命名为 encrypted-swap.service
,并 systemd start encrypted-swap
看看是否正常,若正常便可 systemctl enable encrypted-swap
开机自启动了。如果你有现有的自动挂载 Swap 配置,如 /etc/fstab
,你需要手工取消,避免冲突。
此外,cryptsetup 加密 plain 文件的默认算法是 aes-cbc-essiv:sha256
,没有安全问题。你可以使用 cryptsetup --help
查看默认的 plain 类型加密算法。
2017年03月02日 — 09:39
没有折中的方案么?比如利用TPM储存密钥从而可以休眠的或者把密钥RSA加密后要求用智能卡解密
2016年11月29日 — 14:19
可以可以~回头试试
2016年10月17日 — 00:17
这都武装到swap了啊。为了安全,也是拼了