19.17. 对交换区进行加密

原作 Christian Brüffer.

FreeBSD 提供了易于配置的交换区加密机制。 随所用的 FreeBSD 版本, 可用的配置选项会有所不同, 而配置方法也会有一些差异。 可以使用 gbde(8)geli(8) 两种加密系统来进行交换区的加密操作。 前面所说的这两种加密系统, 都用到了 encswap 这个 rc.d 脚本。

在前面的小节 如何加密磁盘分区 中, 已经就不同的加密系统之间的区别进行了简单的讨论。

19.17.1. 为什么需要对交换区进行加密?

与加密磁盘分区类似, 加密交换区有助于保护敏感信息。 为此, 我们不妨考虑一个需要处理敏感信息的程序, 例如, 它需要处理口令。 如果这些口令一直保持在物理内存中, 则一切相安无事。 然而, 如果操作系统开始将内存页换出到交换区, 以便为其他应用程序腾出内存时, 这些口令就可能以未加密的形式写到磁盘上, 并为攻击者所轻易获得。 加密交换区能够有效地解决这类问题。

19.17.2. 准备

注意:

在本节余下的部分中, 我们约定使用 ad0s1b 作为交换区。

到目前为止, 交换区仍是未加密的。 很可能其中已经存有明文形式的口令或其他敏感数据。 要纠正这一问题, 首先应使用随机数来覆盖交换分区的数据:

# dd if=/dev/random of=/dev/ad0s1b bs=1m

19.17.3. 使用 gbde(8) 来加密交换区

/etc/fstab 中与交换区对应的行中, 设备名应追加 .bde 后缀:

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1b.bde         none            swap    sw              0       0
      

19.17.4. 使用 geli(8) 来加密分区

另一种方法是使用 geli(8) 来达到加密交换区的目的, 其过程与使用 gbde(8) 大体相似。 此时, 在 /etc/fstab 中交换区对应的行中, 设备名应追加 .eli 后缀:

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1b.eli         none            swap    sw              0       0
      

geli(8) 默认情况下使用密钥长度为 256-位的 AES 加密算法。

当然, 这些默认值是可以通过 /etc/rc.conf 中的 geli_swap_flags 选项来修改的。 下面的配置表示让 rc.d 脚本 encswap 创建一个 geli(8) 交换区, 在其上使用密钥长度为 128-位 的 Blowfish 加密算法, 4 kilobytes 的扇区尺寸, 并采用 最后一次关闭时卸下 的策略:

geli_swap_flags="-e blowfish -l 128 -s 4096 -d"

请参见 geli(8) 联机手册中关于 onetime 命令的说明, 以了解其他可用的选项。

19.17.5. 验证所作的配置能够发挥作用

在重启系统之后, 就可以使用 swapinfo 命令来验证加密交换区是否已经在正常运转了。

如果使用了 gbde(8), 则:

% swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ad0s1b.bde    542720        0   542720     0%
      

如果使用了 geli(8), 则:

% swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ad0s1b.eli    542720        0   542720     0%
      

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.