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


10

我们有一个数千用户在大约40个群集上运行应用程序的环境,范围从20个计算节点到98,000个计算节点。这些系统上的用户生成由传统的Unix权限控制的海量文件(有时大于1PB)(由于文件系统的特殊性,ACL通常不可用或不实用)。

当前,我们有一个名为“ give”的程序,它是一个suid-root程序,当组权限不足时,该程序允许用户将文件“提供”给另一个用户。因此,用户将键入类似于以下内容的文件以将文件提供给另一个用户:

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

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

> take filename-to-receive

然后,文件的权限将有效地转移到接收用户。

这个程序已经存在多年了,我们希望从安全和功能的角度重新审视事情。

我们当前的行动计划是在我们当前的“ give”实现中消除一点烂点,并将其打包为开源应用程序,然后再将其重新部署到生产中。

当只有传统的unix权限可用时,是否有人使用另一种方法在用户之间传输超大文件?


1
有某些原因为什么您不能仅创建所有用户都可以访问的共享目录?
Zoredache

1
如果存在具有共享访问权限的目录,那么未经许可的用户将可以在共享文件时访问文件。在这种环境下,有时文件名也是敏感的。因此,不幸的是,共享目录不是一个选择。使用共享目录,还可能有第三位用户篡改文件。
乔恩·布林赫斯特

cron作业本身不会复制文件吗?示例:foo用户希望将文件栏提供给uppy用户。因此他创建了专门的目录,该目录由cron作业使用包含接收用户名的“控制”文件进行扫描。cron作业将读取此“控制”文件,如果用户确定,目标目录具有空间,则复制。您仍然可以为'give'创建包装器,以仅创建'control'文件以具有历史兼容性。无需suid-root,您可以在非root用户下复制该文件,然后通过sudo复制以更改所有权。
jirib 2012年

如果您只想更改权限,则chown应该执行此操作。似乎在涉及到的双方都同意后,您也要复制文件。
zebediah49 2012年

@JiriXichtkniha我喜欢控制文件和cron作业的想法。但是,文件太大,无法复制。
乔恩·布林赫斯特

Answers:


1

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

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

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


0

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

如果要实际移动(例如,IE,更改文件位置和权限;由于文件太大而无法复制),则可以使用-x perms移至共享目录(因此没有人可以列出文件),以及相同的chown方法。 mvchown/ mv


0

正如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 ~

0

我建议重写该应用程序,以模仿“ give”和“ take”,而是从受保护的目录中“推”和“拉”它。您的目录只能通过“推/拉”应用程序访问-该应用程序处理文件移动。另外,您的应用程序/脚本可以创建一个随机的临时目录,并且只为发送者和接收者设置权限。

希望拥有更多安全性?您可以PGP加密/签名文件(使用接收者的公钥)。

就从“安全性和功能性观点”重做而言,我强烈建议不要创建SUID程序。如果您没有以适当的方式放弃特权,则可以虚拟访问系统上的任何文件。如果您的程序有错误(缓冲区溢出等),则可以利用它来获取系统的root用户访问权限。


0

这可能对您没有用,但作为参考cp --reflink源目标使用写时复制功能来进行文件的精简副本。

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

据我所知,此功能目前仅在OCFS2和btrfs上可用。我想这确实可以解决您的问题,但由于它的可用性并不广泛,因此可能不会有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.