Written by Christian Br�ffer.
Swap encryption in FreeBSD is easy to configure and has been available since FreeBSD
5.3-RELEASE. Depending on which version of FreeBSD is being used, different options are
available and configuration can vary slightly. From FreeBSD 6.0-RELEASE onwards, the gbde(8) or geli(8) encryption
systems can be used for swap encryption. With earlier versions, only gbde(8) is available.
Both systems use the encswap rc.d script.
The previous section, Encrypting Disk Partitions,
includes a short discussion on the different encryption systems.
Like the encryption of disk partitions, encryption of swap space is done to protect
sensitive information. Imagine an application that e.g. deals with passwords. As long as
these passwords stay in physical memory, all is well. However, if the operating system
starts swapping out memory pages to free space for other applications, the passwords may
be written to the disk platters unencrypted and easy to retrieve for an adversary.
Encrypting swap space can be a solution for this scenario.
Note: For the remainder of this section, ad0s1b
will be the swap partition.
Up to this point the swap has been unencrypted. It is possible that there are already
passwords or other sensitive data on the disk platters in cleartext. To rectify this, the
data on the swap partition should be overwritten with random garbage:
# dd if=/dev/random of=/dev/ad0s1b bs=1m
If FreeBSD 6.0-RELEASE or newer is being used, the .bde
suffix should be added to the device in the respective /etc/fstab swap line:
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b.bde none swap sw 0 0
For systems prior to FreeBSD 6.0-RELEASE, the following line in /etc/rc.conf is also needed:
gbde_swap_enable="YES"
Alternatively, the procedure for using geli(8) for swap
encryption is similar to that of using gbde(8). The .eli suffix should be added to the device in the respective /etc/fstab swap line:
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b.eli none swap sw 0 0
geli(8) uses the
AES algorithm with a key length of 256 bit by
default.
Optionally, these defaults can be altered using the geli_swap_flags option in /etc/rc.conf.
The following line tells the encswap rc.d script to create geli(8) swap
partitions using the Blowfish algorithm with a key length of 128 bit, a sectorsize of 4
kilobytes and the “detach on last close” option set:
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"
Please refer to the description of the onetime command in the
geli(8) manual page
for a list of possible options.
Once the system has been rebooted, proper operation of the encrypted swap can be
verified using the swapinfo command.
If gbde(8) is being
used:
% swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.bde 542720 0 542720 0%
If geli(8) is being
used:
% swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.eli 542720 0 542720 0%