从 FreeBSD 5.3-RELEASE 开始, FreeBSD 提供了易于配置的交换区加密机制。 随所用的 FreeBSD 版本, 可用的配置选项会有所不同, 而配置方法也会有一些差异。 从 FreeBSD 6.0-RELEASE 开始, 已经可以使用 gbde(8) 和 geli(8) 两种加密系统来进行交换区的加密操作了。 在更早的版本中, 则只提供了 gbde(8)。 前面所说的这两种加密系统, 都用到了 encswap 这个 rc.d 脚本。
在前面的小节 如何加密磁盘分区 中, 已经就不同的加密系统之间的区别进行了简单的讨论。
与加密磁盘分区类似, 加密交换区有助于保护敏感信息。 为此, 我们不妨考虑一个需要处理敏感信息的程序, 例如, 它需要处理口令。 如果这些口令一直保持在物理内存中, 则一切相安无事。 然而, 如果操作系统开始将内存页换出到交换区, 以便为其他应用程序腾出内存时, 这些口令就可能以未加密的形式写到磁盘上, 并为攻击者所轻易获得。 加密交换区能够有效地解决这类问题。
注意: 在本节余下的部分中, 我们约定使用 ad0s1b 作为交换区。
到目前为止, 交换区仍是未加密的。 很可能其中已经存有明文形式的口令或其他敏感数据。 要纠正这一问题, 首先应使用随机数来覆盖交换分区的数据:
# dd if=/dev/random of=/dev/ad0s1b bs=1m
如果使用 FreeBSD 6.0-RELEASE 或更新的版本, 则 /etc/fstab 中与交换区对应的行中, 设备名应追加 .bde 后缀:
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b.bde none swap sw 0 0
对于 FreeBSD 6.0-RELEASE 之前的版本, 还需要在 /etc/rc.conf 中加入:
gbde_swap_enable="YES"
另一种方法是使用 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"
For systems prior to FreeBSD 6.2-RELEASE, use the following line:
geli_swap_flags="-a blowfish -l 128 -s 4096 -d"
请参见 geli(8) 联机手册中关于 onetime 命令的说明, 以了解其他可用的选项。
在重启系统之后, 就可以使用 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>.