如何加密单个文件夹?

假设我有一个文件夹,位于我的文档文件夹中,里面有一些我不希望任何人在没有密码的情况下访问的文件。
有没有办法将这个文件夹锁定,以便它受到密码保护/加密?
事实上,是否可能对任何单独的文件夹进行密码保护?
8个回答

密匙保管盒

警告:最近有报道称CryptKeeper存在通用密码漏洞,可能会使您的数据处于潜在风险之中。此问题在Ubuntu中可能尚未得到解决,使用此解决方案需自担风险。

相关漏洞信息链接:
上游漏洞:https://github.com/tomm/cryptkeeper/issues/23
Debian漏洞:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=852751


 sudo apt-get install cryptkeeper

安装完成后,前往应用程序 -> 系统工具 -> Cryptkeeper

Cryptkeeper 将自动附加到顶部面板。

                   enter image description here

要创建一个加密保护的文件夹,请点击Cryptkeeper小程序,然后选择‘新建加密文件夹’

                   enter image description here

然后输入文件夹名称和保存文件夹的位置,然后点击“前进”。

                   enter image description here

输入密码并点击“前进”。

                   enter image description here

文件夹将被创建并准备好供使用。

                   enter image description here

要访问所有加密文件夹,请在面板上点击Cryptkeeper小程序,并选择每个文件夹。

                   enter image description here

在访问之前,请输入密码以进行挂载。

                   enter image description here

完成

                   enter image description here

要删除文件夹或更改密码,请在面板小程序中右键单击文件夹。

获取更多帮助


3如果你无法看到面板图标,请运行gsettings set com.canonical.Unity.Panel systray-whitelist "['all']"unity --replace - Jakob
有没有办法在登录时自动挂载这个设置? - naught101
1@Jakob 至少在13.10版本中,com.canonical.Unity.Panel不存在,并且systray-whitelist是所有可用的Unity.模式中无效的键 :( - RedactedProfile
2Cryptkeeper最近在Ubuntu软件中心收到了差评。 - danza
这种方法很有趣,但问题在于我们无法在现有目录上设置密码。 - Sandra Ross

eCryptfs

加密私人目录方法.

Ubuntu官方维基

在Ubuntu软件中心搜索并安装'ecryptfs-utils':

enter image description here

安装完成后,转到“应用程序”->“附件”->“终端”,然后运行以下命令:
ecryptfs-setup-private

enter image description here

你将被要求输入登录密码,并为你的私人文件夹创建一个密码:

enter image description here

当您创建好密码后,请注销并重新登录。

enter image description here

接下来,点击“位置”-〉“主文件夹”。

enter image description here

在您的主目录中应创建一个名为“Private”的新文件夹。该文件夹是加密和密码保护的。将您所有的个人物品移动到这个文件夹中以确保它们的安全性。

enter image description here

没有访问该文件夹权限的用户将被拒绝:

enter image description here

需要更多帮助


如果您想限制其他用户对文件夹的访问,您有两种选择:

  • 加密或创建一个压缩的受密码保护的文件存档。当您需要确保没有人会在不知道密码的情况下查看您的文件时,这种方法(Cryptkeeper)非常适合。

  • 使用计算机文件夹/文件权限来拒绝其他用户对您的文件夹的访问。

第一种方法确保结果在不知道密码的情况下无法被任何用户打开。

第二种方法只会更改文件/文件夹的权限,以便没有权限的用户无法打开它。文件夹仍然存在,可以被系统中具有sudo权限的任何用户或使用LiveCD并读取分区的用户访问。此方法实施起来也更简单,并且不需要每次打开/挂载加密的文件夹/存档时输入密码。

使用chmod快速而简便地更改文件或文件夹的权限。

打开终端并导航到您的文件夹所在的位置,假设文件夹名称为foo,并且我们当前位于该文件夹所在的位置。

chmod 700 foo

将使foo仅对您可见,它并非加密(这也是可能的),但只有您的用户(或具有sudo特权的用户)可以读取或打开该文件/文件夹。

您还可以通过右键单击文件或文件夹并手动更改其权限来以图形方式执行此操作。在下面的示例中,作为所有者的您拥有所有权限,并禁止任何其他组或用户访问、读取或修改该文件/文件夹。

enter image description here

有关文件/文件夹权限的更多信息,请访问Ubuntu的Understanding and Using File Permissions维基页面。

+1 无论如何都不能错过那些难以捉摸却简单明了的解决方案。 - Aaron
听起来很好,但没有太多意义。我怎样才能简单地“更改权限”以供一段时间或文件夹使用? - Gonzoza
你在这里面对的是新手。"使用命令"是什么意思?如果我点击一个文件夹,那么如何"使用命令"呢? - Gonzoza
我已经将这个添加到答案中了,右键点击一个文件夹,然后进入“权限”选项,看一下。给出的示例会使文件/文件夹只能由您或具有sudo权限的用户访问。这与在终端中执行chmod 700 <folder_name>是相同的。 - Bruno Pereira
太棒了。我会试试看。等一下。这只有在别人登录我的电脑时才有效,对吗?现在,我已经登录了,并且是唯一的用户,所以我可以在不输入密码的情况下访问所有这些文件夹。 - Gonzoza
由于问题中提到了“加密”,我在答案中进行了澄清。请随意改进! - lumbric
@lumbric 好的,我稍微改进了一下,谢谢你提醒。 - Bruno Pereira
谢谢。我想知道在Windows和Ubuntu下,对目录设置的权限位是否会被尊重?请参考https://unix.stackexchange.com/questions/446364/will-permission-bits-set-on-a-directory-on-an-external-hard-drive-be-respected-u - Tim


Vault

最后更新:2012年8月4日

你可以试试Vault,这是一个由 ubuntu-gr 成员(希腊本地社区)最新完成的项目。

PPA

sudo add-apt-repository ppa:vault/ppa
sudo apt-get update
sudo apt-get install vault

这是一个用于 encfs(存储库中的软件包)的图形界面实用程序。我引用了软件包的描述:
$ apt-cache show encfs
Package: encfs
[...]
Description-en: encrypted virtual filesystem
 EncFS integrates file system encryption into the Unix(TM) file system.
 Encrypted data is stored within the native file system, thus no
 fixed-size loopback image is required.
 .
 EncFS uses the FUSE kernel driver and library as a backend.
Homepage: http://www.arg0.net/encfs

你可以创建一个挂载点/文件夹,然后可以关闭或删除它。如果你关闭它,需要密码才能打开。

enter image description here


3ppa不再存在。 - user4381

CryFS

你可以使用CryFS

cryfs basedir mountdir

它在KDE Vaults中默认使用,并且如果您通过Dropbox、Freefilesync、rsync或类似软件同步加密内容,那么它尤其有趣,因为它将数据保存在小的加密块中,而更改一个小文件只会导致重新上传少量数据。


我建议不要使用cryfs,因为它不支持(标准的Unix)硬链接。 - arielf
3这不是取决于你的使用情况吗?我猜如果有什么需要硬链接的东西,就别用它了。 - RoundDuckMan
小心!CryFS似乎还不稳定。他们在主页上直接注明了这一点:“当CryFS稳定时,让我们通知您”。例如,GitHub上最近的一个错误是:"cryfs on top of rclone will destroy your data"。README中也有关于稳定性的说明。 - akraf

目录级别的加密是一件冒险的事情,尽可能地选择块设备级别的加密更为可靠。
我认为Giles在这里提到了几个关键点here,我将重述如下:
在块设备级别上使用加密。Linux通过dm-crypt提供此功能。您可以对整个磁盘(引导加载程序除外的一小部分区域)进行加密,或者加密/home或其他分区。如果不对整个磁盘进行加密,请记住机密信息可能出现在其他位置,尤其是交换空间(如果您在任何地方有加密数据,则应加密交换空间)。请注意,如果选择整个磁盘加密,则您的计算机将无法无人值守启动,您必须在键盘上输入密码。
由于整个块设备都被加密,攻击者窃取了磁盘后无法检测到文件内容和元数据的位置。除了在加密区域开头的一个标头外,内容与随机噪声无法区分。攻击者可以通过查看加密数据的多个快照并研究各个扇区随时间的变化来推断出一些信息,但即使如此,要发现有趣的东西也很困难,而且这不适用于在攻击者看到密文后停止修改数据的情况(例如磁盘被盗的情况)。
请注意,如果您只加密家中的某些内容而不是整个家庭,那么除非您非常小心,否则一些常见的程序可能会导致数据泄漏。例如:.bash_history、编辑器会话和撤销历史等。
以下是一些建议:
全盘加密

这个问题的最佳答案描述了如何在非加密安装后使用fscrypt加密您的主目录(安装程序有一个选项可以加密主目录)

eCryptfs手动设置

这个答案描述了Ubuntu的辅助工具(例如ecryptfs-setup-private),但是通过自己挂载,你可以获得更多控制权(例如分离不同的挂载目录)和理解。

eCryptfs 已经是Linux内核的一部分,并且在Ubuntu上默认启用了CONFIG_ECRYPT_FS=y,所以你只需要基本地挂载它。作为内核的一部分通常也是质量和稳定性的积极指标。

我有以下的辅助工具:

export ECRYPTFS_DIR="$HOME/ecryptfs"
export ECRYPTFS_DATA_DIR="$HOME/.ecryptfs-data"

ecry() (
  # Mount ecryptfs.
  if ! mountpoint -q "$ECRYPTFS_DIR"; then
    sudo mount -t ecryptfs \
      -o key=passphrase,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=yes \
      "$ECRYPTFS_DATA_DIR" \
      "$ECRYPTFS_DIR"
  fi
)
ecryu() (
  # Unmount ecryptfs.
  sudo umount "$ECRYPTFS_DIR"
)

GitHub上游

使用方法如下。

首先挂载加密目录:

ecry

现在将要询问您的密码短语:

Passphrase:

假设我们不明智地选择了:

asdf

所以现在它将打印出来:
Filename Encryption Key (FNEK) Signature [87d04721f6b4fff1]:

87d04721f6b4fff1是从我们的asdf密码派生出的一种哈希类型。现在您可以按下回车键,它会显示:

Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_fnek_sig=87d04721f6b4fff1
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=87d04721f6b4fff1
Mounted eCryptfs

这意味着安装成功。
现在让我们创建一些测试加密文件:
echo AAAA > ~/ecryptfs/aaaa
echo BBBB > ~/ecryptfs/bbbb
dd if=/dev/zero bs=1k count=1k > ~/ecryptfs/zzzz

如果我们卸载它:
ecry

如预期所料,该目录为空。
ls -l ~/ecryptfs

eCryptfs的数据本身包含在我们传递给挂载命令的~/.ecryptfs-dat目录中。
无论我们将其挂载到哪里,只要我们将该目录作为数据目录使用,未加密的挂载点的内容将保持一致。
让我们观察它的内容:
ls -lh ~/.ecryptfs-data

这显示了三个加密文件:
-rw-rw-r-- 1 ciro ciro  12K Nov 11 17:15 ECRYPTFS_FNEK_ENCRYPTED.FWa5o2QVxfHzwEQ-GALjie5YM3J8aETCQqcZB.pJ2KyM4SRZWVvHGnAYi---
-rw-rw-r-- 1 ciro ciro  12K Nov 11 17:15 ECRYPTFS_FNEK_ENCRYPTED.FWa5o2QVxfHzwEQ-GALjie5YM3J8aETCQqcZMnVJY0WbH6bqRaee1cD5xU--
-rw-rw-r-- 1 ciro ciro 1.1M Nov 11 17:15 ECRYPTFS_FNEK_ENCRYPTED.FWa5o2QVxfHzwEQ-GALjie5YM3J8aETCQqcZf.vz0tLUzh41PwVFAnHc5k--

所以我们观察到:
- 对于主要的未加密挂载点中的每个文件,我们有一个未加密的数据文件。 - 文件名是加密的。 - 每个文件的最小大小为12KB,即使对于只包含5个字节的小文件,我们刚刚创建的文件,也会导致磁盘使用量大幅增加,如果存在大量这样的小文件。 - 对于1MB的大文件,新的大小为1.1MB,因此除了12KB的最小大小外,还会有约10%的比例大小增加。 - 时间戳被泄露。待办事项:如何避免?(链接1:如何避免?)
现在我们可以检查这些文件是否实际上已加密。
grep aaaa ~/.ecryptfs-data/*
grep AAAA ~/.ecryptfs-data/*

这里没有任何匹配结果,所以很可能是加密的。

关于这些加密文件的存储方式很酷的一点是,你可以通过将它们复制到一个未加密的介质上(使用rsync),在任何地方轻松备份加密文件,并且只会复制过时的文件。在这种情况下,甚至不需要先输入密码!

然而不太酷的一点是,如果攻击者试图证明你拥有某个已知信息的片段,他们可能通过比较文件大小和目录结构布局如Giles所提到的来实现。

现在让我们重新挂载:

ecry

再次,它要求输入密码。
假设您输入了错误的密码:
asdfqwer

现在将打印:

Filename Encryption Key (FNEK) Signature [c55c6f13e73332d3]:
Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_fnek_sig=c55c6f13e73332d3
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=c55c6f13e73332d3
WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key
before. This could mean that you have typed your
passphrase wrong.

Would you like to proceed with the mount (yes/no)? :

所以我们观察到,asdfqwer的FNEK与正确的asdf密码不同:c55c6f13e73332d3
如果我们决定继续挂载,它会询问:
Would you like to append sig [c55c6f13e73332d3] to
[/root/.ecryptfs/sig-cache.txt]
in order to avoid this warning in the future (yes/no)? :

如果我们输入yes,就会像承诺的那样将FNEK添加到/root/.ecryptfs/sig-cache.txt中。暂时先说不。我们可以检查一下那个文件里面包含了什么内容:
sudo cat /root/.ecryptfs/sig-cache.txt

目前它只包含了 asdf FNEK:

87d04721f6b4fff1

所以我们理解这只是已知良好密码的白名单。

现在让我们看看输入错误密码后会得到什么:

ls -l ~/ecryptfs

我们看到目录是空的,正如你所预期的那样。似乎数据目录中的每个文件都必须包含某种密码检查数据,但却没有被挂载。
如果我们卸载并返回正确的密码“asdf”,它将再次要求FNEK确认,这有点烦人。
Filename Encryption Key (FNEK) Signature [87d04721f6b4fff1]:

我们可以通过在如何使用ecryptfs自动指定文件名加密密钥?中添加以下内容来防止这种情况发生:
-o ecryptfs_fnek_sig=

到挂载命令。TODO知道FNEK是否会帮助攻击者破解密码?
最后,当ecryptfs目录被挂载后,我们可以在下面看到它:
grep ecryptfs /proc/mounts 

其中包含一行文字:
/home/ciro/.ecryptfs-data /home/ciro/ecryptfs ecryptfs rw,relatime,ecryptfs_fnek_sig=d066f6dcf72ad65a,ecryptfs_sig=d066f6dcf72ad65a,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs 0 0

在Ubuntu 20.04上进行了测试,使用Linux内核5.4。
ecryptfs与CryFS与EncFS之间的比较
这些都是基于目录级别的方法,因此了解它们的权衡是很重要的。以下是一些比较:
  • https://www.cryfs.org/comparison/

  • https://wiki.archlinux.org/index.php/EncFS#Comparison_to_eCryptFS

    eCryptFS是在内核空间实现的,因此配置起来稍微复杂一些。您需要记住各种加密选项(使用的密码算法、密钥类型等)。而EncFS则不同,因为它将加密元数据信息存储在每个目录的配置文件(.encfs6.xml)中。所以您不需要记住任何东西(除了口令)。

    两者的性能取决于磁盘活动的类型。虽然eCryptFS在某些情况下可能更快,因为上下文切换(内核和用户空间之间)的开销较小,但EncFS在其他情况下具有优势,因为加密元数据是集中存储的,而不是存储在各个文件头中。EncFS项目提供了更多信息和基准测试示例。

安装时进行全盘加密(除了/boot分区)

我找不到关于这个问题的答案,所以在这里进行一个基于QEMU的实验here,使用Ubuntu 20.04.1。
你点击:
  • 擦除磁盘并安装Ubuntu
  • 高级功能
  • 在新的Ubuntu安装中使用LVM
  • 为了安全起见,加密新的Ubuntu安装

screenshot

然后它在下一步要求您输入密码:

screenshot

现在,每次启动时,你看到的第一件事(TODO 在引导程序之前还是之后?)是一个密码提示:

screenshot

而且在这之后,如果您输入正确的密码,它会进入正常启动状态。
登录后,在shell中我们执行以下操作:
lsblk

这就是结果:
sda                     8:0    0      1T  0 disk  
├─sda1                  8:1    0    512M  0 part  /boot/efi
├─sda2                  8:2    0      1K  0 part  
├─sda5                  8:5    0    731M  0 part  /boot
└─sda6                  8:6    0 1022.8G  0 part  
  └─sda6_crypt        253:0    0 1022.8G  0 crypt 
    ├─vgubuntu-root   253:1    0 1021.8G  0 lvm   /
    └─vgubuntu-swap_1 253:2    0    976M  0 lvm   [SWAP]

看起来,位于/boot下的第二阶段引导加载程序本身并没有加密,但根目录和交换空间是加密的。

正如在https://help.ubuntu.com/community/Full_Disk_Encryption_Howto_2019中提到的,这会使您面临风险,即攻击者可以在未经您知情的情况下篡改引导文件夹,并利用此后提取您的解密密钥,如果您继续使用该计算机。

安装时进行全盘加密(包括/boot

截至20.04版本,似乎还没有自动化的方法,但希望能够尽快实现,以下是一些手动指南:

打开笔记本电脑加密安全的紧急开关
好的,我们现在要讨论一个类似CIA/Silk Road级别的操作安全话题:如果你被逮捕时电脑还开着,而你只有一点时间来采取行动,如何迅速确保你的数据无法解密。
首先,挂起到RAM似乎不够安全,休眠是一个更明智的选择:
- [挂起到RAM和加密分区](link1) - [如何在Ubuntu上使挂起到RAM安全(使用全盘加密LVM)](link2) - [如何加密我的系统以便挂起到RAM正常工作且也被加密](link3)
休眠模式似乎会将数据保存在交换分区中,只要您的交换分区是加密的(在加密设置中显然应该是这样,否则您的RAM会泄漏到那里),就应该是安全的。
现在,在笔记本电脑上,最好的方法可能是关闭盖子的操作,例如this post提到:
HandleLidSwitch=hibernate

在`/etc/systemd/logind.conf`上应该可以工作。
或者可以设置一个键盘快捷键或电源按钮操作。如何从CLI休眠:如何在Ubuntu 16.04上休眠?提到:
sudo systemctl hibernate

你也可以使用gocryptfs。根据我的经验,它在处理大型加密共享时比cryfs快得多,但不会隐藏结构(文件大小和文件数量)。根据你的威胁模型,这可能是个问题或者不是问题。
安装方法如下:
apt install gocryptfs

初始化基础目录(一次)

gocryptfs -init basedir

将基于目录(加密版本)挂载到目录(未加密版本)上。
gocryptfs basedir mountdir