我最近阅读了一张Powerpoint幻灯片,但无法明确了解setuid的用法。 这是幻灯片的内容。
Setuid示例 - 打印文件
- 目标
- 每个用户都可以排队文件
- 用户无法删除其他用户的文件
- 解
- 用户打印机拥有的队列目录
- Setuid队列文件程序
- 将队列文件创建为用户打印机
- 以用户joe
复制joe的数据- 另外,setuid删除文件程序
- 仅允许删除排队的文件
- 用户打印机介导的用户joe的队列访问。
以下是我的问题。 我不清楚如何通过“setuid”来解决这个问题。
我的问题很乱,我对解决方案的确没有明确的概念。
答案 0 :(得分:3)
我们假设文件存储在/var/spool/pq
目录中;目录printer:printgrp:2700
(所有者printer
,组printgrp
,模式2700的权限 - 仅对所有者进行读取,写入,执行,并且在目录上设置的SGID位表示在它将属于组printgrp
)。
此外,我们假设打印排队程序pq
具有权限printer:printgrp:4511
(setuid printer
,任何人都可以执行它,但只有printer
或{{1可以看看它。)
现在,假设Joe运行root
,并且该文件的权限为pq /home/joe/file
(只有Joe可以读取或写入该文件)。 Joe的umask设置为022(尽管此文件具有比umask隐含的更多限制权限。)
程序运行时,进程的实际UID为joe:staff:600
,但有效UID为joe
。由于此处不需要setgid操作,因此实际和有效GID均为printer
。 Joe的辅助组列表不包括staff
。
请注意,它是控制其对文件的访问权限的进程的有效UID和GID。 Joe自己无法看到打印机队列中的作业;显示的目录权限甚至不允许他列出文件,或访问目录中的文件。请注意,反过来适用; printgrp
用户(或以该用户身份运行的printer
程序)本身无法访问Joe的文件。
pq
程序可以在打印机队列目录中创建文件;它可能会为此请求创建两个文件。一个是控制文件,另一个是要打印的文件的副本。它将通过某种机制(比如12345)确定一个作业号,它可能会创建并打开两个文件进行写入(具有限制权限 - 0600甚至0400):
pq
- 控制文件/var/spool/pq/c.12345
- 第一个(唯一的)数据文件然后它应该将其有效UID重置为真实的UID,因此它作为Joe运行。然后它可以打开Joe要求打印的文件,并将其复制到数据文件中。它还可以写出它认为与控制文件相关的任何信息(日期,时间,提交请求的人,要打印的文件数,特殊打印选项等)。当它关闭这些文件时,Joe无法再访问它们。但该程序能够将Joe的文件复制到其打印队列中。
因此,它解决问题1(权限)和2(控制信息),以及4(再次控制信息)。
关于问题3,/var/spool/pq/d.12345.1
在类Unix系统上总是一张外卡,因为它可以做任何他想做的事情。但是,正如答案的其余部分所建议的那样,控制文件包含有关打印请求的信息,包括(特别是)提交它的人。您可以使用setgid程序而不是setuid程序;这些以类似的方式工作。但是,在我假设的系统下,组权限基本上没有出现在图片中。 root
程序设置控制文件和数据文件的权限,使组无法读取它,目录权限也拒绝组访问。
我们可以假设另外两个程序:
pq
- 打印机队列状态pqs
- 打印机队列删除这些程序也将是setuid pqr
。 printer
程序可以读取目录中的控制文件,并列出相关信息。 pqs
程序可以读取控制文件,以确保Joe在请求删除作业12345时提交作业12345.如果程序满足,则可以删除文件。
除了这些用户调用的程序之外,还有一个守护程序(在此系统中通常命名为pqr
),如果它尚未运行,它将由pqd
启动。它将负责读取目录中的控制文件,并使用该信息将数据文件实际打印到相关的打印机。如何处理不同打印机和不同数据格式的细节是守护进程要处理的问题。守护程序也将以pq
权限运行,并且printer
将被授予对打印机设备的访问权限(对于本地连接的打印机)或配置为通过网络与IPP(Internet打印机)等协议进行通信协议)。 Joe可能无法直接使用打印机设备。
请注意,setuid程序具有Joe没有的权限。必须仔细撰写,以确保乔不能滥用这些额外的权力。任何setuid程序都有点危险; setuid printer
程序可能是致命的。通常,setgid程序不那么危险。但是,对于这两种类型的程序,在编写此类程序时需要非常小心。