如何允许用户在 Linux 上传输文件给其他用户

如何允许用户在 Linux 上传输文件给其他用户

我们拥有一个由几千名用户组成的环境,他们在大约 40 个集群上运行应用程序,这些集群的规模从 20 个计算节点到 98,000 个计算节点不等。这些系统上的用户会生成大量文件(有时超过 1PB),这些文件受传统 unix 权限控制(由于文件系统的特殊性,ACL 通常不可用或不实用)。

我们目前有一个名为“give”的程序,它是一个 suid-root 程序,允许用户在组权限不足时将文件“赠予”给另一个用户。因此,用户可以输入以下内容来将文件赠予另一个用户:

> give username-to-give-to filename-to-give ...

然后,接收用户可以使用名为“take”的命令(give 程序的一部分)来接收文件:

> take filename-to-receive

然后文件的权限就会有效地转移给接收用户。

该计划已经存在多年,我们想从安全性和功能的角度重新审视它。

我们当前的行动计划是删除我们当前“给予”实施中的位腐烂,并将其打包为开源应用程序,然后再将其重新部署到生产中。

当仅有传统的 unix 权限可用时,是否有其他方法用于在用户之间传输极大文件?

答案1

正如 xryl669 所说,您可以使用目录来实际共享文件。它应该看起来像这样:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

give 命令变为

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

take 命令如下所示:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~

答案2

如果发送者确实愿意放弃文件,您可以使用 SUID 二进制文件将文件移动到所有人都可写且具有粘性位(如/tmp)的目录,然后将所有权更改为新所有者。chown(3)已经为您删除了set-user-IDset-group-ID位。这样,新所有者就可以对文件执行他想执行的操作,包括移动它。

如果您想要使用多个文件系统作为主目录,并且希望确保不跨越文件系统边界,那么这个所有人都可写的目录可以属于用户的主目录,因为这样性能会立即变得很糟糕。在这种情况下,您可能希望确保接收者知道何时提供新文件。

电子邮件可以解决问题。更像 Unix 的解决方案是/etc/profile列出您新发送的文件。如果您提供此功能,则可获得额外奖励pam_echo例如使用file=/tmp/deliveries/%u,请参阅pam_echo(8))。与任何与 PAM 相关的事情一样,您需要首先检查所有实现是否都提供了这样的模块。

答案3

您可以使用具有共享目录的系统(可能没有执行权限),其中给定用户的内容使用特定的文件名结构存档(to-$username_from-$username.tar例如)。 Give 生成​​文件并将chowns其发送给目标用户; take 提取文件并将其删除。

如果您想将其作为实际移动来执行(即,更改文件位置和权限;由于文件大小巨大而无法复制),您可能能够使用 -x perms 移动到共享目录(因此没有人可以列出那里的文件),并使用相同的chown方法。 mvchown/ mv

答案4

这可能对你没用,但可以作为参考cp --reflink 源目标使用写时复制功能对文件进行精简复制。

这意味着您可以直接复制文件,并且实际上只会复制更改的块。与硬链接不同,新文件有自己的 inode 和元数据,这意味着您可以使用标准 chown 操作将文件的副本提供给新用户。

据我所知,此功能目前仅在 OCFS2 和 btrfs 上可用。我想这确实解决了您的问题,但鉴于它的可用性并不广泛,它可能没什么用。

相关内容