setuid 的用途是什么?

3
我最近阅读了一张Powerpoint幻灯片,但是对于setuid的用法没有清晰的概念。以下是幻灯片内容:
"Setuid实例 - 打印文件"
目标: - 每个用户都可以排队文件 - 用户无法删除其他用户的文件
解决方案: - 排队目录由用户printer拥有 - 设置setuid排队文件程序 - 以用户printer的身份创建队列文件 - 以用户joe的身份复制joe的数据 - 同样,设置setuid删除文件程序 - 只允许删除自己排队的文件 - 用户printer通过调停控制用户joe的队列访问
我有几个问题: 1. 如果文件是由用户printer创建的,那么用户joe如何将数据复制到printer拥有的文件中?它是否具有某些特定的权限? 2. 其次,如何确定您和您排队的文件之间的关系? 3. 文件的状态是否显示了一些信息?但文件是由printer拥有的,只能由root更改。这与文件的gid有什么关系?如果是这样,其他用户的gid也可能与该文件相关。 4. 文件上下文是否显示了谁排队的信息?
我的问题比较混乱,我真的没有一个清晰的概念来解决这个问题。
1个回答

3
假设文件存储在/var/spool/pq目录中;目录的权限为printer:printgrp:2700(所有者为printer,组为printgrp,模式为2700-仅所有者可读、写和执行,并且在目录上设置了SGID位,因此在其中创建的所有文件都将属于printgrp组)。
此外,我们假设打印队列程序pq的权限为printer:printgrp:4511(setuid printer,任何人都可以执行它,但只有printerroot才能查看它)。
现在,假设Joe运行pq /home/joe/file,文件的权限为joe:staff:600(只有Joe可以读取或写入该文件)。Joe的umask设置为022(尽管此文件的权限比umask暗示的权限更加严格)。
当程序运行时,进程的实际UID是joe,但有效UID是printer。由于这里不需要setgid操作,因此实际和有效GID都是staff。Joe的辅助组列表不包括printgrp
请注意,进程的有效UID和GID控制其对文件的访问。Joe自己无法看到打印队列中的作业;所示的目录权限甚至不允许他列出文件或访问目录中的文件。请注意,反之亦然;printer用户(或以该用户身份运行的pq程序)本身无法访问Joe的文件。 pq程序可以在打印队列目录中创建文件;它可能为此请求创建两个文件。其中一个将是控制文件,另一个将是要打印的文件的副本。它将通过某种机制确定作业号(例如12345),并可能创建并打开两个写入文件(具有限制性权限-0600甚至0400):
  • /var/spool/pq/c.12345 - 控制文件
  • /var/spool/pq/d.12345.1 - 第一个(唯一的)数据文件
然后程序应将其有效UID重置为真实UID,以便以Joe的身份运行。然后,它可以打开Joe要求打印的文件,并将其复制到数据文件中。它还可以向控制文件写入任何相关信息(日期、时间、谁提交了请求、要打印的文件数量、特殊打印选项等)。当关闭这些文件时,Joe无法再访问它们。但是程序能够将Joe的文件复制到其打印队列中。
因此,这解决了问题1(权限)和2(控制信息),还有问题4(再次是控制信息)。
关于问题3,'root'在类Unix系统上始终是通配符,因为他可以做任何他想做的事情。但是,建议按照答案的其他部分所示,控制文件包含有关打印请求的信息,包括(特别是)谁提交了请求。您可以使用setgid程序代替setuid程序;这些以类似方式工作。但是,在我构想的系统下,组权限基本上没有考虑。 'pq'程序设置了控制文件和数据文件的权限,以使组无法读取它们,并且目录权限还拒绝了组访问。
我们可以构想两个更多的程序:
- 'pqs' - 打印队列状态 - 'pqr' - 打印队列删除
这些程序也将是setuid 'printer'。 'pqs'程序可以读取目录中的控制文件并列出它们的相关信息。 'pqr'程序可以读取控制文件以确保Joe在请求删除作业12345时提交了作业12345。如果程序满意,则可以删除文件。
除这些用户调用的程序外,还将有一个守护程序程序(在这个系统中通常命名为'pqd'),如果尚未运行,则被'pq'启动。它将负责读取目录中的控制文件,并使用该信息将数据文件实际打印到相关的打印机上。如何处理不同的打印机和不同的数据格式的详细信息是守护程序要处理的问题。守护程序也将以'printer'权限运行,并且已授予'printer'访问打印机设备(对于本地连接的打印机)或配置为使用诸如IPP(Internet Printer Protocol)之类的协议与网络通信。Joe可能无法直接使用打印机设备。
请注意,setuid程序具有Joe没有的权限。必须仔细编写这些程序,以确保Joe无法滥用这些额外的权限。任何setuid程序都有一定的危险性;setuid 'root'程序可能是致命的。总的来说,setgid程序较少危险。但是,对于这两种类型的程序,编写此类程序时需要非常小心。

谢谢您的热心回答~,但我还有一个小问题,您是不是指一旦文件以用户打印机模式读取或写入,它也可以被用户Joe访问、读取或写入? - venuswu
是的,一旦文件描述符被打开,程序更改有效UID(或GID)并不重要。重新打开将是另一回事。程序可能会在创建排队区域中的文件之前检查Joe是否可以正常访问命令行上的文件。还有一些特技可以来回切换(saved UID),这样如果Joe在命令行上列出500个文件,您就不会用尽文件描述符。虽然概述是基本操作模式。 - Jonathan Leffler
1
欢迎来到StackOverflow。这里表达“感谢”的首选方式是通过给有帮助的答案点赞(一旦您有足够的声望)并接受其中一个答案作为最有帮助的答案。答案旁边有一个勾号(打钩)。当您接受一个答案时,您的声望也会得到小幅提升。请参阅FAQ,特别是如何在此处提问? - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接