17.12. 加密磁盘分区

Contributed by Lucky Green.

FreeBSD 提供了极好的数据保护措施,防止未受权的数据访问。 文件权限和强制访问控制(MAC)(参考 第 15 章 强制访问控制) 可以帮助预防在操作系统处于运行状态和计算机加电时未受权的第三方访问数据。 但是,和操作系统强制受权不相关的是,如果黑客有物理上访问计算机的可能, 那他就可以简单的把计算机的硬件安装到另一个系统上复制出敏感的数据。

无论攻击者如何取得停机后的硬件或硬盘驱动器本身, FreeBSD GEOM Based Disk Encryption (基于 GEOM 的磁盘加密, gbde)geli 加密子系统都能够保护计算机上的文件系统数据, 使它们免受哪怕是训练有素的攻击者获得有用的资源。 与那些只能加密单个文件的笨重的加密方法不同, gbdegeli 能够透明地加密整个文件系统。 明文数据不会出现在硬盘的任何地方。

本章演示如何在 FreeBSD 上使用geligbde创建加密文件系统。

17.12.1. 使用 gbde 对磁盘进行加密

gbde(4) 设施的目标是为攻击者提供一项艰巨的挑战,以访问存储设备的内容。但是,如果计算机在启动和运行时受到攻击,并且存储设备已主动连接,或者攻击者有权访问有效的密码,则它不为存储设备的内容提供保护。因此,在系统运行时提供物理安全性并保护加密机制使用的密码短语非常重要。

此功能提供了几个障碍来保护存储在每个磁盘扇区中的数据。它在CBC模式下使用 128 位AES加密磁盘扇区的内容。磁盘上的每个扇区使用不同的AES密钥进行加密。有关加密设计的详细信息,包括如何从用户密码生成扇区密码,请参阅gbde(4)

FreeBSD 提供了gbde内核模块,使用以下命令将他加载到内核中:

# kldload geom_bde

若使用自定义内核,请在您的内核配置中加入下面一行:

options GEOM_BDE

下面的例子将演示如何将加密分区挂载到/private

过程 17.3. 使用gbde加密分区
  1. 添加新的硬盘

    添加新的硬盘到系统中可以查看在 第 17.2 节 “添加磁盘” 中的说明。 这个例子的目的是说明一个新的硬盘分区已经添加到系统中如: /dev/ad4s1c。在例子中 /dev/ad0s1* 设备代表系统中存在的标准 FreeBSD 分区。

    # ls /dev/ad*
    /dev/ad0        /dev/ad0s1b     /dev/ad0s1e     /dev/ad4s1
    /dev/ad0s1      /dev/ad0s1c     /dev/ad0s1f     /dev/ad4s1c
    /dev/ad0s1a     /dev/ad0s1d     /dev/ad4
  2. 创建一个目录来保存 gbde Lock 文件

    # mkdir /etc/gbde

    gbde lock 文件包含了 gbde 需要访问的加密分区的信息。 没有 lock 文件, gbde 将不能解密包含在加密分区上的数据。 每个加密分区使用一个独立的 lock 文件。

  3. 初始化 gbde 分区

    一个 gbde 分区在使用前必须被初始化, 这个初始化过程只需要执行一次。此命令将将打开您的编辑器, 提示您去设置在一个模板文件中的配置变量。 若使用 UFS,设置扇区大小为 2048:

    # gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock
    # $FreeBSD: src/sbin/gbde/template.txt,v 1.1.36.1 2009/08/03 08:13:06 kensmith Exp $
    #
    # Sector size is the smallest unit of data which can be read or written.
    # Making it too small decreases performance and decreases available space.
    # Making it too large may prevent filesystems from working.  512 is the
    # minimum and always safe.  For UFS, use the fragment size
    #
    sector_size	=	2048
    [...]

    gbde(8) 将让您输入两次用来加密数据的密钥短语。 两次输入的密钥必须相同。 gbde 保护您数据的能力依靠您选择输入的密钥的质量。如何选择一个安全易记的密钥短语,请参阅 Diceware Passphrase 网站。

    gbde init 命令为您的 gbde 分区创建了一个 lock 文件, 在这个例子中存储在 /etc/gbde/ad4s1c.lock中。 gbde lock 文件必须使用 .lock 扩展名才能够被 /etc/rc.d/gbde 启动脚本正确识别。

    小心:

    gbde lock 文件 必须 和加密分区上的内容同时备份。 如果发生只有 lock 文件遭到删除的情况时, 就没有办法确定 gbde 分区上的数据是否是解密过的。

  4. 把加密分区和内核进行关联

    # gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock

    This command will prompt to input the passphrase that was selected during the initialization of the encrypted partition. The new encrypted device will appear in /dev as /dev/device_name.bde:

    # ls /dev/ad*
    /dev/ad0        /dev/ad0s1b     /dev/ad0s1e     /dev/ad4s1
    /dev/ad0s1      /dev/ad0s1c     /dev/ad0s1f     /dev/ad4s1c
    /dev/ad0s1a     /dev/ad0s1d     /dev/ad4        /dev/ad4s1c.bde
  5. 在加密设备上创建文件系统

    当加密设备和内核进行关联后,可以在此设备上创建文件系统。本例创建一个 UFS 文件系统并在 UFS 开启 soft updates。请确认所选分区名字含有*.bde标识:

    # newfs -U /dev/ad4s1c.bde
  6. 挂载加密分区

    为加密文件系统创建一个挂载点:

    # mkdir /private
    # mount /dev/ad4s1c.bde /private
  7. 验证加密文件系统是否可用

    现在应该能查看和使用该加密文件系统了:

    % df -H
    Filesystem        Size   Used  Avail Capacity  Mounted on
    /dev/ad0s1a      1037M    72M   883M     8%    /
    /devfs            1.0K   1.0K     0B   100%    /dev
    /dev/ad0s1f       8.1G    55K   7.5G     0%    /home
    /dev/ad0s1e      1037M   1.1M   953M     0%    /tmp
    /dev/ad0s1d       6.1G   1.9G   3.7G    35%    /usr
    /dev/ad4s1c.bde   150G   4.1K   138G     0%    /private

每次启动后,必须手动将任何加密文件系统重新附加到内核,检查错误并装载,然后才能使用文件系统。要配置这些步骤,请将以下行添加到/etc/rc.conf

gbde_autoattach_all="YES"
gbde_devices="ad4s1c"
gbde_lockdir="/etc/gbde"

接下来系统将提示您输入在初始化加密的 gbde 分区时所用的密码。输入正确密码后该分区将自动挂载。gbde的其他启动选项可在rc.conf(5)找到。

注意:

sysinstall(8) 是和 gbde 加密设备不兼容的。 在启动 sysinstall(8) 时必须将 *.bde 设备和内核进行分离,否则在初始化探测设备时将引起冲突。 与加密设备进行分离在我们的例子中使用如下的命令:

# gbde detach /dev/ad4s1c

17.12.2. 使用 geli 对磁盘进行加密

Contributed by Daniel Gerzo.

还有另一个可用于加密的 GEOM class ── geli。 它目前由 Paweł Jakub Dawidek 开发。 Geli 工具与 gbde 不同; 它提供了一些不同的功能, 并采用了不同的方式来进行密码学运算。geli(8) 最重要的功能包括:

  • 使用了 crypto(9) 框架 ── 如果系统中有加解密硬件加速设备, 则 geli 会自动加以利用。

  • 支持多种加密算法 (目前支持 AES、 Blowfish, 以及 3DES)。

  • 允许对根分区进行加密。 在系统启动时, 将要求输入用于加密根分区的口令。

  • 允许使用两个不同的密钥 (例如, 一个 个人密钥 和一个 公司密钥)。

  • geli 速度很快 ── 它只进行简单的扇区到扇区的加密。

  • 允许备份和恢复主密钥。 当用户必须销毁其密钥时, 仍然可以通过从备份中恢复密钥来存取数据。

  • 允许使用随机的一次性密钥来挂接磁盘 ── 这对于交换区和临时文件系统非常有用。

更多 geli 功能介绍可以在 geli(8) 联机手册中找到。

下面的例子讲描述如何生成密钥文件, 它将作为主密钥 (Master Key) 的一部分, 用于挂接到 /private 的加密 provider。 这个密钥文件将提供一些随机数据来加密主密钥。 同时, 主密钥也会使用一个口令字来保护。 Provider 的扇区尺寸为 4kB。 此外, 这里的讨论将介绍如何挂载 geli provider, 在其上创建文件系统, 如何挂接并在其上工作, 最后将其卸下。

过程 17.4. 使用geli加密分区
  1. 在内核中加入 geli 支持

    geom_eli 内核模块提供了geli支持,若要在系统启动时加载此模块,将这行代码添加到/boot/loader.conf中:

    geom_eli_load="YES"

    现在,加载内核模块:

    # kldload geom_eli

    若使用自定义内核,请确保内核配置文件中有以下两行:

    options GEOM_ELI
    device crypto
  2. 生成主密钥

    The following commands generate a master key (/root/da2.key) that is protected with a passphrase. The data source for the key file is /dev/random and the sector size of the provider (/dev/da2.eli) is 4kB as a bigger sector size provides better performance:

    # dd if=/dev/random of=/root/da2.key bs=64 count=1
    # geli init -s 4096 -K /root/da2.key /dev/da2
    Enter new passphrase:
    Reenter new passphrase:

    同时使用口令字和密钥文件并不是必须的; 您也可以只使用其中的一种来加密主密钥。

    如果密钥文件写作 -, 则表示使用标准输入。 下面是关于如何使用多个密钥文件的例子:

    # cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2
  3. 将 provider 与所生成的密钥关联

    若要访问 Provider,请指定密钥文件、磁盘名称和密码:

    # geli attach -k /root/da2.key /dev/da2
    Enter passphrase:

    这将创建一个带有.eli扩展名的新设备:

    # ls /dev/da2*
    /dev/da2  /dev/da2.eli
  4. 创建新的文件系统

    接下来,使用 UFS 文件系统格式化设备,并将其装载到现有的挂载点上:

    # dd if=/dev/random of=/dev/da2.eli bs=1m
    # newfs /dev/da2.eli
    # mount /dev/da2.eli /private

    加密文件系统现在应该可以使用了:

    # df -H
    Filesystem     Size   Used  Avail Capacity  Mounted on
    /dev/ad0s1a    248M    89M   139M    38%    /
    /devfs         1.0K   1.0K     0B   100%    /dev
    /dev/ad0s1f    7.7G   2.3G   4.9G    32%    /usr
    /dev/ad0s1d    989M   1.5M   909M     0%    /tmp
    /dev/ad0s1e    3.9G   1.3G   2.3G    35%    /var
    /dev/da2.eli   150G   4.1K   138G     0%    /private

一旦在加密分区上的工作完成, 并且不再需要 /private 分区, 就应考虑将其卸下并将 geli 加密分区从内核上断开,并将数据持久化:

# umount /private
# geli detach da2.eli

有个 rc.d 脚本可用于在系统启动时自动挂载geli 加密设备。对于上述例子,请将此行添加到 /etc/rc.conf 文件中:

geli_devices="da2"
geli_da2_flags="-k /root/da2.key"

This configures /dev/da2 as a geli provider with a master key of /root/da2.key. The system will automatically detach the provider from the kernel before the system shuts down. During the startup process, the script will prompt for the passphrase before attaching the provider. Other kernel messages might be shown before and after the password prompt. If the boot process seems to stall, look carefully for the password prompt among the other messages. Once the correct passphrase is entered, the provider is attached. The file system is then mounted, typically by an entry in /etc/fstab. Refer to 第 3.7 节 “挂载和卸载文件系统” for instructions on how to configure a file system to mount at boot time.

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

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

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