假设用户“qqq”有文件 /home/qqq/bigfile.dat,并想在无需 root 帮助的情况下将其传递给用户“aaa”(它需要归“aaa”所有)。用户“qqq”和“aaa”应该怎么做?
天真的方式:
uid=qqq$ mv bigfile.dat /home/aaa/
uid=aaa$ chown aaa /home/aaa/bigfile.dat # Operation not permitted
当然也可以通过使用 ACL(uid=qqq$ setfacl u:aaa:rw- /home/aaa/bigfile.dat
)或创建临时副本(uid=aaa$ mv bigfile.dat bigfile.dat_ && cat bigfile.dat_ > bigfile.dat && rm bigfile.dat_
)来实现,但是这两种方式似乎都有缺点。
两个用户都同意(可以发出一些命令)“传递”文件。它应该很快,保留 inode 和其他属性等。
怎样才能干干净净呢?
答案1
旧的 unix 系统允许任何用户将自己的文件 chown 到任何目标。大多数系统不再这样做,因为这会造成一些安全问题:
如果有磁盘使用配额,用户 A 可以将文件存储在私人目录中,由用户 B 承担费用。用户 B 永远不会知道,除非将可见的磁盘使用量与配额进行比较,并且无法找到配额窃贼。
一些特权程序(set[ug]id 可执行文件或守护程序)假设如果某个文件归某个用户所有,则该用户已批准其内容。如果用户 A 可以将文件 chown 给用户 B,则 A 可以诱骗特权程序接受任何数据。(无论如何,这是一种不安全的设计,因为即使 A 确实编写了该文件,A 也可能没有批准将其用于此特定目的;但此类程序确实存在,禁止 chown 确实可以降低风险。)
非 root 用户执行的 chown 操作无法撤消。请注意,这是您可能要承担的风险(事实上,在 unix 文件系统上,您还可以执行其他操作,但只有其他用户配合才能撤消)。
据我所知,在大多数现代 unix 系统中,没有 root 的配合,是不可能更改文件的所有权的。root 可以执行 chown 或通过 sudo 授予 A 或 B 执行此操作的权限,但这需要比通常需要的更有针对性的 root 干预。
如果启用了 ACL,正如您所注意到的,这会产生 chowning 的大部分实际效果。
如果工作流程确实要求 A 在某个时间点成为所有者,而 B 在其他时间点成为所有者,那么您可以探索其他选项。
答案2
您能否将文件移动到两个用户都有写访问权限的某个共享空间(或者 Linux 上不存在这种东西?),然后让所有者将其 chmod 为接收者?
我的思维根植于 Mac OS X,因此这对您可能有用,也可能没用。
答案3
这取决于您所说的“无需 root 的帮助”是什么意思。如果您可以让 root 将 aaa 和 qqq 添加到某个新组(任何名称都可以),并确保该文件对新组至少具有 r-- 权限...(它可以为用户 aaa 保留 rwx - 因此您获得 => aaa:newgroup rw-r----- )那么无需 root 的进一步帮助,aaa 就可以修改并且 qqq 可以读取同一个文件。
如果您想“违背 root 的意愿”来做这件事,那么如果您找到任何可行的方法,我会认为这是一个错误。我们花了很多心思来阻止这种情况,因为如果 aaa 可以将木马放入 qqq 可以访问的目录中并可能“意外”运行,那么这是一个安全问题。
答案4
其中一种方法是创建一个 ssh-key,允许用户QQ连接为AAA。 作为QQ做
ssh-keygen -t rsa
并决定是否要使用无密码密钥。
然后将新创建的密钥添加到AAA通过运行QQ:
ssh-copy-id -i ~/.ssh/id_rsa.pub aaa@localhost
之后你可以像这样移动文件:
scp bigfile.dat aaa@localhost:
(或者使用你最喜欢的 sftp 客户端)
这样 sshd 就会负责更改所有权。
使用 scp/sftp 进行本地传输可能听起来很奇怪,但至少它是有效的!:)