使用 CFS,加密文件系统
如果您想保护您的个人文件隐私,例如包含电话号码、信件或日记的文件,您可以将它们保存在名为 ~/.private 的隐藏目录中,模式为 0700,这样只有您可以读取这些文件。您还在暗自发笑吗?那么让我们考虑采用更强大的隐私技术:密码学。具体来说,让我们看看 Matt Blaze 为 UNIX 和 Linux 开发的开源加密文件系统 (CFS)。
简而言之,CFS 允许您以加密形式在普通目录中保护您的文件。通过使用密钥(或密码,如果您愿意),您可以暂时解密您的文件为明文形式,以便在您需要使用它们的时间窗口内使用。
CFS 通过本地环回 NFS 挂载使您的明文文件可用;CFS 文档将其称为“attach”。您对明文文件所做的修改将自动反映在加密版本中。您通过“detach”结束您的 CFS 会话,这将使您的明文文件消失,直到您下次 attach 它们。
本文报告了截至 1.4.0beta2 版本的 CFS 的一些优点和使用方法。本文还附带了一些方便的 CFS 工具;请参阅“资源”部分。
还有其他方法可以使用开源工具来提高您的隐私;还有 TCFS(透明加密文件系统)和 OpenSSL 等工具。以下是其中一些工具(包括 TCFS、CFS 和 OpenSSL)的相对优点的简要总结
CFS:在用户空间中运行,不需要内核补丁。CFS 使用普通的 NFS 环回(本地 NFS 导出和本地挂载),这可能会产生一些安全担忧。在导出目录时请谨慎。CFS 最初在 SunOS 和 BSDI 上开发,然后移植到 Linux 和其他操作系统,这预示着其持续的实用性。CFS 支持多种加密算法选择。
TCFS:需要特定于 Linux 的 NFS 模块或内核配置。更紧密的内核绑定和扩展的文件系统属性要求带来了更好的安全性,但可能降低了可移植性。
OpenSSL:在用户空间中运行,不需要内核补丁。OpenSSL 支持各种加密方法,以及对硬件令牌的支持。OpenSSL 可用于 Linux、MS Windows 和其他环境。截至 3.4 版本,OpenSSL 一次只能处理一个流或文件的加密或解密。
OpenSSH:风马牛不相及。您可能会将 OpenSSH 与其他工具结合使用,但 OpenSSH 主要用于交互式会话隐私,而不是存储数据隐私。
Linux 环回设备挂载:Red Hat Linux 自带。目前,DES 似乎是环回设备挂载唯一可用的严肃加密方法。它需要准备固定大小的容器文件,并且需要 root 权限或环回设备文件上的用户权限。请参阅 mount(8) 和 losetup(8)。
源 RPM,cfs-1.4.0.beta2j-6.2a.src.rpm,与本文随附的其他工具一起在 LJ FTP 站点上提供;请参阅“资源”部分。beta2j 版本的 RPM 除了基本 beta2 的组件外,还包括:针对 Linux 的一个安全补丁;两个 Red Hat Linux 友好的设置脚本,cfs.init 和 cfs-setup;以及两个方便的工具,decrypt 和 dpw.py。所有这些都单独列出,供那些不倾向于使用 RPM 的人使用。此 RPM 已在 Red Hat Linux 6.2、7.1 和 7.2 上进行了测试。
始终考虑搜索更高版本的 CFS,无论是 RPM 还是 tarball 形式,并检查安全补丁。截至本文撰写之时,CFS 版本 1.4.1 已经存在(请参阅“资源”部分);它增加了对 NetBSD 的支持,但没有新功能或错误修复。
NFS 是使用 CFS 的先决条件。请非常谨慎地选择与您共享文件系统资源的人员——不要将您的根目录及其下的所有内容导出到全世界。考虑使用个人防火墙来禁止外部访问大多数服务端口,尤其是 NFS 和 RPC 端口映射守护程序使用的端口,分别为 2049 和 111(TCP 和 UDP)。
在以下命令示例中,提示符以粗体显示。# shell 提示符表示 root 权限;$ 是 bash 和 Bourne shell 的普通(非 root)用户的提示符。根据您选择的 shell 进行任何适当的调整。
以 root 身份使用常用的 RPM 命令安装 CFS 源 RPM 包
# rpm -iv cfs-1.4.0.beta2j-6.2a.src.rpm
之后,按如下方式构建并安装 CFS 包,同样以 root 身份
# cd /usr/src/redhat/SPECS # rpm -bb cfs.spec # cd ../RPMS/i386 # rpm -ivv cfs-1.4.0.beta2j.i386.rpm
如果您在安装此特定 RPM 时遇到困难,请务必查找并安装更合适的 CFS 发行版的 RPM 或 tarball。根据您自己的需求和喜好,调整本文随附的增值文件(在 FTP 站点上)。特别注意,需要进行一些 NFS 设置。请参阅本文随附的 cfs-setup 脚本或阅读 Matt Blaze 的文档“CFS Installation and Operation”(请参阅“资源”)。
以下说明适用于 Red Hat Linux 6.2、7.1、7.2 和 7.3;您可能需要根据您的 Linux 变体进行一些调整。
确保 NFS 正在运行
# ps auxww | grep rpc.mountd
如果 rpc.mountd 未运行,则启动 NFS
# /etc/rc.d/init.d/nfs start
然后以 root 身份运行其启动时启动文件来启动 CFS 守护程序 cfsd
# /etc/rc.d/init.d/cfsd start
作为您自己,创建一个私有 notes 目录并 attach 它。我们将演示两种方法
简单的方法是使用本文随附的 decrypt 工具(请参阅“资源”部分)
$ decrypt -init Key: (type your key here to create the private directory, and remember the key) Again: (type your key again here) Key: (retype your key to proceed with the attachment)
创建私有 notes 目录的另一种方法是使用原生 CFS cmkdir 和 cattach 工具
$ mkdir ~/cdata $ cd ~/cdata $ cmkdir notes Key: (type your key here and remember it for future use) Again: (type your key again here) $ cattach notes $LOGNAME-notes Key: (re-type your key)
(在上面的示例中,预定义的环境变量 $LOGNAME 包含您的登录名。它用于避免名称冲突,但您可以随意替换更简单的明文目录名。)
在这两种情况下,CFS 守护程序 (cfsd) 可能需要一两分钟才能使明文目录 $LOGNAME-notes 可用。
接下来,在 attached 的明文目录中创建一个测试文件,如下所示
$ pushd /mnt/crypt/$LOGNAME-notes $ echo "Test." > test.txt $ popd
结束您的 CFS 会话,并查看相关目录中发生了什么
$ cdetach $LOGNAME-notes $ ls /mnt/crypt $ ls -R ~/cdata
~/cdata 的列表应显示您的 test.txt 文件的模糊名称,例如 03fa2aa5242d5a741866a6605de1ae3b。
重新 attach 目录以验证您的测试文件仍然存在。同样,有两种方法可以做到这一点
这是简单的方法,使用 decrypt
$ decrypt Key: (retype your key)
这是正常的方法,使用 CFS 工具 cattach
$ cd ~/cdata $ cattach notes $LOGNAME-notes Key: (retype your key)
接下来,验证您的测试文件仍然存在
$ cat /mnt/crypt/$LOGNAME-notes/test.txt
现在去搜索 CFS 的文档,其中包括 cmkdir、cattach、cdetach、cpasswd 等命令的在线 man 页面。Matt Blaze 的论文“CFS Installation and Operation”和“A Cryptographic Filesystem for Unix”很好地描述了 CFS 的基础知识。使用 nroff -ms /usr/doc/cfs*/notes.ms 阅读这些内容。这些论文中其他有用的信息包括通过修改 NFS rsize 和 wsize 挂载选项来加快 CFS 性能的建议。
之后,查找本文随附的 README 文件(请参阅“资源”部分),并查看 decrypt 和 dpw.py 工具。decrypt 脚本简化了您使用 CFS 管理私有目录的过程。尝试此命令
$ decrypt -help
dpw.py 工具为搜索您使用 decrypt 维护的私有密码文件提供了图形用户界面。运行 dpw.py 并单击帮助按钮。dpw.py 工具需要标准 Python 模块 Tkinter 等。
CFS 的优势包括某些类型的错误减少或错误预防
在使用您的明文文件后,CFS 不需要单独的重新加密步骤,从而避免了使用错误密钥重新加密的问题。
版本控制,至少对于 RCS 而言,不太容易出错。相比之下,如果使用 OpenSSL 单独解密文件,意外签入明文文件会使其暴露。
CFS 支持非活动超时,因此明文文件不会意外地长时间保持可用状态。请务必将超时选项 (-i) 与 cattach CFS 命令一起使用。
使用 CFS 和其他一些隐私工具时要考虑的漏洞
键盘监听可能会在您键入加密或解密的密钥时暴露您的密钥。
特权用户(入侵者或非入侵者)可以通过各种方式窥探您 attached 的明文文件。
您的明文文件可能会以各种方式在网络上暴露。OpenSSH 可以提供一些帮助,但最好将您对 CFS 和 OpenSSL 的使用限制在您未共享的本地主机的直接连接的控制台和键盘上,并将您的私有数据和明文 attach 点限制在您的本地主机的文件系统中。
考虑将一些私有文件保存在单独的私有目录中;这样,并非所有内容都会同时被泄露。
当将版本控制工具应用于您的私有文件时,请仔细考虑如何仅暂时暴露您的明文文件,例如,面对 CVS 的目录复制方法。对于 CFS,请考虑在明文 attach 目录中使用 RCS,如 cd /mnt/crypt/mycleartext && co -l myjournal。
Matt Blaze 的 CFS 文档更彻底地检查了 CFS 的安全问题和设计考虑因素。
我们不应妄自菲薄,认为仅仅依靠 CFS 就能保护我们,如果我们引起了顽固的窥探者的兴趣,或者如果我们对我们的网络安全掉以轻心。我们应该使用 CFS,就像我们在家锁门并加固窗户一样。它不一定能防止最坏的情况发生,但提供一些障碍可能有助于使事情更安全、更持久。
运行 Linux 的移动笔记本电脑很可能是使用 CFS 的绝佳场所。笔记本电脑在很大程度上是独立的和未共享的,当采用其他实际的安全预防措施(例如,建立个人防火墙和禁用不必要的网络服务)时,它提供的漏洞更少。并且在您的笔记本电脑被盗的情况下,您 CFS 加密的私有文件很可能仍然是不可见的。不要忘记备份。
在我希望开源版本的 CFS 改进的愿望清单中,将包括硬件安全令牌支持,也许可以从 OpenSSL 借用。虽然不一定能及时捕获击键,但要求使用硬件安全令牌可以缓解键盘监听导致的密码泄露问题。另一个可取之处是将 CFS 移植到 MS Windows,以便与多重启动主机一起使用。
感谢 Greg Hao 和 Claude Johnson 在 Red Hat Linux 7.x 上测试 CFS 安装说明和随附脚本。还要感谢 Enrico Scholz 提供的基础 SRPM。
本文随附的文件,包括 cfs-1.4.0.beta2j CFS 源代码 RPM、decrypt、dpw.py、cfs-setup 和 README 文件。
基础 SRPM,本文从中创建了 cfs-1.4.0.beta2j 源代码 RPM(请参阅上一项)。
Blaze, Matt. "CFS Installation and Operation". 1997. 本文可在 CFS 文档目录中找到,nroff -ms /usr/doc/cfs*/notes.ms。或者在 C 源文件中查找 notes.ms,例如在 /usr/src/redhat/BUILD/cfs*/ 中。
Blaze, Matt. "A Cryptographic Filesystem for Unix". 1993. 本文也与前一篇论文一起在 notes.ms 中提供。
Mauriello, Ermelindo. "TCFS: Transparent Cryptographic Filesystem". 1997. 可在 Linux Journal 的网站上找到。
Matt Blaze 自己的 CFS 软件分发页面。截至本文撰写之时,最新版本为 cfs-1.4.1,而本文中描述的版本为 cfs-1.4.0beta2。版本 1.4.1 增加了对 NetBSD 的支持,但没有提供新功能或错误修复。对于 Linux,您可以继续使用 cfs-1.4.0beta2j。
www.openssl.org:OpenSSL 的主页
www.openssh.com:OpenSSH 的主页
Jerry Sweet 是美国的系统管理员和程序员。
电子邮件: cfs-tools@akamail.com