![/dev/shm 不适合存储秘密](https://linux22.com/image/19669/%2Fdev%2Fshm%20%E4%B8%8D%E9%80%82%E5%90%88%E5%AD%98%E5%82%A8%E7%A7%98%E5%AF%86.png)
该发行版是运行 2.6.35-30 Linux 内核的 Ubuntu 服务器。
我想要一个完全位于内存中的目录。没有root权限可以实现吗?
答案1
Linux 提供了任何用户都可以使用的 tmpfs 设备/dev/shm
。默认情况下,它不会安装到特定目录,但您仍然可以将其用作目录。
只需在其中创建一个目录/dev/shm
,然后将其符号链接到您想要的任何位置。您可以向创建的目录授予您选择的任何权限,以便其他用户无法访问它。
这是一个支持 RAM 的设备,因此默认情况下内存中存在内容。里面可以创建任何你需要的目录/dev/shm
当然,放置在这里的文件在重新启动后将无法保存,并且如果您的计算机开始交换,对/dev/shm
您也没有帮助。
与 Solaris 类似的/dev/shm
是/tmp
“交换”类型分区,也是基于内存的。与 一样/dev/shm
,任意用户都可以在/tmp
Solaris 上创建文件。
OpenBSD 也能够使用基于内存的挂载,但默认情况下没有可用的挂载。 mount_mfs 命令可供超级用户使用。
我不确定其他 *BSD。
答案2
/dev/shm 不适合存储秘密
...在具有活动的系统上交换!机会是很高您的计算机已启用它。
有一个更好的,保证短暂的,标准替代方案 — ramfs
.ramfs
如果您打算使用 RAM 支持的空间来进行以下操作,则可能需要使用暂时的存储敏感数据,例如私钥、比特币或以太坊钱包等。
ramfs
tmpfs
比数据需要保密时更好,因为ramfs
数据绝不被交换(保存到物理存储驱动器),同时tmpfs
可能被交换。随后获得机器 root 或物理访问权限的第三方可以检查交换空间和提取敏感数据。
解决方案
您可以准备ramfs
挂载,以便任何非特权用户都可以按需挂载/卸载它。
为此,您需要根特权,一次。如果您缺乏 root 权限,请要求系统管理员为您进行设置。
首先,您需要在/etc/fstab
.该行fstab
可能如下所示:
none /mnt/ramfs ramfs noauto,user,size=1024M,mode=1777 0 0
/mnt/ramfs
是一个挂载点,ramfs 文件系统将挂载于此。目录应该存在。noauto
选项阻止自动安装(例如在系统启动时)。user
使得普通用户可以安装它。size
设置此“ramdisk”的大小(您可以在此处使用M
和G
)。但它没有任何影响,因为 ramdisk 会根据需要增长。mode
是很重要,使用八进制代码,1777
任何用户都可以创建文件和目录,但只有这些文件和目录的所有者才能访问它们(您也可以使用您选择的不同代码,但要非常确定!)。
完成此操作后,任何用户都可以按需安装它。
一旦某个用户安装了它,ramfs
就会创建新的文件系统并安装在/mnt/ramfs/
。它将由 拥有root:user
。一旦他/她卸载它,或者系统重新启动,这个基于 RAM 的文件系统将消失和全部它的数据。这很酷。
此外,该文件系统可以由多个用户独立安装,但是不同时,即要准备好由下一个用户安装,前一个用户应该卸载该文件系统。或者您可以为每个用户创建单独的文件系统。
安装:
mount /mnt/ramfs/
卸载:
umount /mnt/ramfs/
PS 如果您尝试以rsync
非 root 用户身份将文件写入新安装/创建的 ramfs 的根目录,您可能会遇到错误rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]
。这完全没问题并且符合预期,因为您的用户不拥有 ram 文件系统的根。解决方案很简单,/mnt/ramfs/copied/
例如,只需在那里创建一些目录,然后rsync
放入其中即可。
PPS 在 Debian 9 上进行了测试。很确定它也可以在 Ubuntu 上运行。
PPPS 虽然安全得多,但基于 RAM 的存储仍然脆弱一些精心设计的攻击,例如冷启动攻击。因此,如果您真的很重视数据的安全性,请务必身体上的保护您的 PC/笔记本电脑,锁定机箱和内存条,或者更好的是,考虑使用将 RAM 直接焊接到主板上的计算机(大多数高端超便携式笔记本电脑都是这种情况)。如果您不打算在接下来的一个小时左右使用计算机,还可以考虑完全关闭计算机。甚至可能完全禁用睡眠/休眠功能。
答案3
您的系统可能已经有一个可用的;最近的Linux系统总是基于Glibc安装了 tmpfs/dev/shm
。
如果您的系统没有或太小,那么未由 root 挂载的文件系统几乎意味着保险丝。在 Ubuntu 上,您需要加入fuse
组才能使用 FUSE。翻翻可用的 FUSE 文件系统,我只看到拉姆弗斯,不幸的是被遗弃在上游。
答案4
一般来说,不可以,文件系统只能由 root 挂载。如果您允许用户任意放置文件系统,那么本质上就是授予他们 root 权限。 (简单方法:在 /etc 上挂载一个,将您自己的密码和影子放在那里,使用您刚刚创建的新 root 密码进行 su,卸载)
如果您想要在特定位置有 tmpfs,您可以将其添加到/etc/fstab
,带有 标志noauto,user
,然后用户将能够安装它(但不是特别清楚为什么您不只是自动安装它)
如果用户需要任意 tmpfs,那么您有几个选择:
- 使用一个 tmpfs 的子目录。也许是最好的方法。您确实可能不需要多个 tmpfs。
- 创建一个脚本,该脚本将创建一个目录并在其上安装 tmpfs,然后打印出它放置的位置。用于
sudo
允许用户运行它。确保你这样做不是允许用户选择任意路径。