实施加密主目录

作者:Mike Petullo

如果使用得当,加密文件系统可以成为保护存储在计算机上的敏感数据的有效方法。标准的加密软件包,例如 GNU Privacy Guard (GPG),非常适合加密电子邮件。但是,对于希望在其文件生命周期内多次读取或修改的文件进行加密,它们不太方便。

与 GPG 不同,加密文件系统对用户是透明的。在读取文件之前手动解密文件或在修改文件后再次加密文件,没有任何麻烦。潜在的用户遗忘也被减轻了。在介绍一些可用于 Linux 的加密文件系统之后,本文解释了如何创建一个加密主目录,该目录在登录时自动挂载,并在注销时卸载。最后,本文介绍了一些概念,这些概念演示了不正确实施加密技术的危险。

为什么有人会想要加密存储在计算机上的数据?文件系统权限不就是用来保护敏感数据的吗?虽然文件系统权限很有用,但当攻击者完全控制用于保护权限的存储介质时,它们会很快失效。例如,如果有人偷了我的 Linux 笔记本电脑,一台 Apple iBook,那么它的文件系统权限对于可以简单地从邪恶的 CD-ROM 启动的窃贼来说几乎毫无用处。如果我将笔记本电脑送去 Apple 维修,情况也是如此。一个不诚实的员工可能会读取我的文件。正确地加密计算机上的文件是一种安全的保护形式,因为该过程不依赖于加密发生后操作系统的完整性。

我选择仅加密我的 iBook 上的主目录。在我的情况下,由于性能损失和其他因素,加密从根目录开始的整个文件系统是不可接受的。有关实施此技术的信息可以在互联网上找到——它需要使用 Linux 的初始 ramdisk 功能。在我使用基于 x86 的系统的经验中,我选择的加密技术在写入使用缓冲 I/O 的磁盘时,比未加密的 XFS 文件系统慢大约 50%。仅加密主目录显然会留下许多文件(例如系统日志)作为纯文本,但在我的情况下,这些文件并不十分敏感。仅加密主目录对我来说是一个明智的折衷方案。

Linux 支持一些加密文件系统的选项。诸如 Transparent Cryptographic File System 之类的系统为 NFS 服务的 ext2 卷提供了加密扩展。其他文件系统在其设计中包含用于本地使用的集成加密。对于我的应用程序,最好的解决方案似乎是环回加密文件系统的概念。正如您将看到的,环回加密可以用于加密 Linux 支持的任何文件系统类型,包括经过验证的 ext2、XFS 和 ReiserFS。

Linux 环回文件系统支持允许用户将普通文件挂载为设备,例如 /dev/hda1。传统上,这对于执行诸如挂载 CD-ROM 文件系统映像以在刻录到 CD-R 介质或分发可引导软盘映像之前填充和测试之类的操作很有用。Herbert Valerio Riedel 的 GNU/Linux Cryptographic API (CryptoAPI) 和 util-linux 补丁添加了对将加密文件系统映像挂载到环回驱动程序的支持。

在深入研究环回加密文件系统的细节之前,让我们先看看如何创建和挂载一个原始环回文件系统。首先,创建一个文件来包含文件系统。此示例创建一个足够大的文件来托管 20MB 文件系统

dd if=/dev/zero of=plaintext.img bs=1M count=20

其次,将新创建的文件与环回设备关联

losetup /dev/loop0 plaintext.img

接下来,使用新关联的环回设备在文件中创建文件系统

mkfs -t ext2 /dev/loop0

最后,挂载文件系统并像使用任何其他挂载卷一样使用它

mount /dev/loop0 mount point

现在,让我们继续讨论加密的情况。为了使用环回加密文件系统,内核必须支持它们。大多数发行版不包含此功能,因此可能需要自定义构建的内核。类似于我使用的加密 API 包正在合并到主流 2.5 内核中。但是,对于稳定的 2.4 树,GNU/Linux CryptoAPI 补丁是必要的,并且可在 www.kerneli.org 上获得。一旦您应用了 patch-int 和 loop-hvr 补丁,当您配置内核时,加密选项应该是可用的。必须启用以下选项

  • 加密 API 支持 (CONFIG_CRYPTO)

  • 通用环回加密过滤器 (CONFIG_CRYPTOLOOP)

  • 加密密码 (CONFIG_CIPHERS)

您还必须至少启用一个密码。记住您选择的密码。我选择了 AES,最初称为 Rijndael,并在我的示例中使用 AES。

构建并安装新配置的内核。内核的所有加密代码都可以编译为模块。如果您选择构建内核模块,请不要忘记在尝试使用它们的功能之前插入它们。还需要修补 util-linux,编译工具并安装它们。相关的 util-linux 补丁可在 www.kernel.org/pub/linux/kernel/people/hvr/util-linux-patch-int 上获得。您应该发现您最终得到了修改后的 mount 和 losetup 命令。

现在,我们准备使用类似于我们用于创建原始环回文件系统的过程来创建环回加密文件系统。首先,为了难以区分加密块和未使用的磁盘空间,将使用 /dev/urandom 而不是 /dev/zero 创建将保存环回文件系统的文件

dd if=/dev/urandom of=ciphertext.img bs=1M count=20

创建主机文件后,必须像以前一样将其临时与环回设备关联。但是,这次我们必须告诉 losetup 环回设备将被加密,在本例中是使用 AES 密码

losetup -e aes /dev/loop0 ciphertext.img

当 losetup 提示时,输入密码,并可能输入您希望用于卷的密钥大小(取决于您决定使用的密码)。

创建文件系统的方式与创建原始环回设备的方式相同。加密是在上一步中设置的,现在由环回驱动程序处理

mkfs -t ext2 /dev/loop0

除了修改 losetup 外,util-linux 补丁还使 mount 命令具有加密感知能力。给定正确的命令参数,挂载加密的环回卷是一个简单的过程

mount -o loop,encryption=aes ciphertext.img \
mount point

mount 会提示您输入密码,并可能提示您输入密钥大小。

既然您已经了解了如何手动挂载和卸载加密的环回文件系统,那么介绍 pam_mount 是合适的。pam_mount 是一个 PAM 模块,它简化了卷的管理,并且应该在用户登录系统时挂载。它可以处理挂载诸如 Samba 托管的卷、Novell 托管的卷和加密文件系统之类的东西。pam_mount 的原始作者是 Elvis Pfutzenreuter。Mukesh Agrawal 编写了第一个添加对环回加密卷支持的补丁。本文的作者现在维护 pam_mount,它可在 www.flyn.org 上获得。

系统管理员无需手动挂载加密卷,而是可以配置 pam_mount 以在用户登录和注销时自动挂载和卸载卷。这可以配置为使系统密码也解锁加密卷,从而基本上创建一个完全透明的加密卷。

pam_mount 可以采用三种不同的技术来解锁加密卷。第一种技术相当枯燥。当加密卷的密钥与系统的登录密码无关时,pam_mount 只是提示用户输入其加密卷的密钥。为了在系统上使用此技术,必须安装和配置 pam_mount.so 和 pmhelper。标准的 ./configure、make 和 make install 命令构建并安装 pam_mount 的二进制文件和配置文件。

您应该在 /etc/security 中找到 stock pam_mount.conf。检查并根据您自己的系统进行定制。stock pam_mount.conf 文件有很好的文档记录。最必要的更改是为应挂载的卷添加到文件末尾的定义。以下是 stock 文件中记录的加密环回文件系统的定义格式

volume user local ignored
loopback file
mount point mount options
fs
key cipher
fs key path

这是一个示例,当 Mike 登录时,在 /home/mike 挂载由 /home/mike.img 托管的 AES 加密环回文件系统

volume mike local - /home/mike.img /home/mike
loop,user,exec,encryption=aes,keybits=256 - -

接下来,添加以下行auth required pam_mount.so try_first_passsession required pam_mount.so try_first_pass到您要支持环回加密文件系统的 PAM 支持服务的配置文件中。例如,这是我笔记本电脑上的 /etc/pam.d/login 文件

auth       requisite  pam_securetty.so
auth       requisite  pam_nologin.so
auth       required   pam_env.so
auth       required   pam_unix.so nullok
account    required   pam_access.so
account    required   pam_unix.so
session    required   pam_unix.so
session    optional   pam_lastlog.so
session    optional   pam_motd.so
session    optional   pam_mail.so standard noenv
password   required   pam_unix.so nullok obscure \
                      min=4 max=8 md5
auth       required   pam_mount.so try_first_pass
session	   required   pam_mount.so try_first_pass

最后,使用加密环回文件系统简介中列出的步骤创建用户的环回加密文件系统。

pam_mount 解锁卷的第二种技术对用户来说更方便。如果在使用与第一种技术相同的方法创建加密卷时,用户指定他或她的登录密码作为卷密钥,则 pam_mount 使用用户输入的相同密码来解锁卷以登录。

第三种技术是最灵活的,需要更复杂的描述。以下是一些术语,可帮助您了解此技术的工作原理

  • sk:系统密钥,用于登录系统的密钥或密码。

  • fsk:文件系统密钥,允许您使用您希望 pam_mount 为您挂载的文件系统的密钥。

  • E 和 D:OpenSSL 支持的同步加密/解密算法,例如 bf-ecb。

  • efsk:加密的文件系统密钥,efsk = E_sk (fsk),存储在本地文件系统上的某个位置(即,/home/user.key)。

pam_mount 从本地文件系统读取 efsk,执行fsk = D_sk (efsk)并使用fsk来挂载文件系统。此技术的优点是允许用户更改其登录密码,而无需使用此新密钥重新加密其主目录。如果登录密码已更改,只需使用以下命令重新生成 efsk(即,/home/user.key)efsk = E_newsk (D_oldsk (efsk))。pam_mount 中包含一个名为 passwdehd 的脚本来为您执行此操作。

要实施第三种技术,首先创建文件以托管加密文件系统(与之前一样)

dd if=/dev/urandom of=/home/user.img \
bs=1M count=image size in MB

然后,创建一个文件 (efsk),其中包含使用 /dev/urandom 生成的卷密码 (fsk),并使用用户的登录密码作为密钥进行加密

dd if=/dev/urandom bs=1c count=keysize / 8 | \
openssl enc -bf-ecb > /home/user.key

接下来,创建一个加密的环回文件系统。文件系统的密钥应该是 fsk(使用 /dev/urandom 生成,加密并存储为步骤 2 中的 /home/user.key)。

openssl enc -d -bf-ecb -in /home/user.key | \
losetup  -e aes -k keysize -p0 /dev/loop0 \
/home/user.img
mkfs -t ext2 /dev/loop0
umount /dev/loop0
losetup -d /dev/loop0

最后,在 pam_mount.conf 中,将 fs key cipher 变量设置为用于加密 fsk 的密码,在本例中为 bf-ecb,并将 fs key path 变量设置为 efsk 的路径,在本例中为 /home/user.key。

在他的权威著作 应用密码学 中,Bruce Schneier 说:“软件加密很可怕。”他的意思是,为运行通用操作系统(如 Linux)的计算机设计真正安全的加密软件非常困难。例如,现代操作系统可以随时将内存交换到磁盘,并且此内存可能包含纯文本或加密密钥。如果操作系​​统已将加密卷的密钥写入磁盘,则加密卷将毫无用处。减少这种情况影响的一种方法是加密交换卷。CryptoAPI 仍然无法安全地做到这一点,但它正在开发中。一个类似的项目 LoopAES 已经可以加密系统的交换空间。

再次考虑我将 iBook 送去 Apple 维修的示例。虽然我的主目录已加密,但我的数据可能仍然不完全安全。一个不诚实的员工可以启动他或她邪恶的 CD-ROM,并例如用该员工自己的设计替换我系统上的登录二进制文件。当我的计算机返回并且我登录时,我的加密密钥可能会通过新安装的登录程序发送到远程计算机。入侵检测系统会使这种情况发生的可能性大大降低。

使用 pam_mount 采用加密主目录的系统的另一个可能的弱点是系统的登录密码。由于登录密码直接或间接地用于解锁加密文件系统,因此它必须很强。无数研究表明,用户选择的大多数密码都非常弱。与其盲目增加密码的必需长度,不如花一些时间阅读 Bruce Schneier 的 Secrets and Lies。写下来并存储在钱包中的强密码短语可能比记住的密码更安全。添加物理身份验证令牌可能会更好。请记住,如果您的系统登录密码不安全,那么您的加密文件系统就等于被读取。

最后,加密文件系统可能是一把双刃剑。如果您忘记了加密密钥怎么办?如果您使用上面描述的第三种技术并意外删除了加密文件系统密钥的所有记录怎么办?如果我的或他人的加密相关软件有缺陷怎么办?所有这些问题都可能导致您不得不尝试大约 2128 个不同的加密密钥才能找回您的文件系统。您的数据可能就此丢失了。与任何系统管理工作一样,进行文件系统备份。理想情况下,这些备份是加密的,并且物理锁定在安全的地方。

最重要的是,除了使用像 AES 这样的现代加密算法之外,还需要许多细微的考虑事项和程序来管理一个合理安全的系统。引用 Matt Blaze 对 应用密码学 的贡献

高质量的密码和协议是重要的工具,但就其本身而言,它们并不能很好地替代对正在保护的内容以及各种防御措施可能如何失败的现实、批判性思考(毕竟,攻击者很少将自己限制在学术界清晰、明确定义的威胁模型中)。

阅读本文后,您应该熟悉加密环回文件系统的概念。此外,您应该能够在您管理的系统上部署加密文件系统,并使用 pam_mount PAM 模块管理它们。未来,我希望看到主要的 Linux 发行商支持 CryptoAPI 补丁和 pam_mount。我也希望看到 CryptoAPI 补丁整合到主流的 util-linux 包中。正确管理的加密主目录是一种强大的安全工具。

Mike Petullo 是美国陆军的一名排长,驻扎在德国。他白天跳伞,晚上与 C 代码错误作斗争,并且自 1997 年初以来一直在摆弄 Linux。欢迎您将评论发送至 lj@flyn.org

加载 Disqus 评论