使用 sudo 安全地使用 find

Tro*_*vin 10 linux find sudo

在 Linux 服务器上,我需要从一组用户中删除 root 权限。但是这些用户有正当理由能够使用“查找”实用程序根据文件名、修改日期和其他元数据搜索文件。

在服务器上,文件名不敏感,但文件内容可能敏感。

我想使用 sudo 来允许用户搜索服务器上任何地方的文件。“find”实用程序很棒,但它会产生各种副作用,例如使用“-exec”生成任意命令。

我可以find在我的限制下工作吗?

Mat*_*Ife 21

根据 man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).
Run Code Online (Sandbox Code Playgroud)

这对我有用。(以 '#' 开头的行是 root,那些以 '$' 开头的行是非 root)在这种情况下,非 root 用户在wheel组中。

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =
Run Code Online (Sandbox Code Playgroud)

鉴于该功能所授予的功能,它完全符合您的需求。我没有彻底检查是否find有允许您读取文件内部字节的功能,但是LD_PRELOAD由于 Linux 中 setuid 检查的性质,诸如库填充攻击和库填充攻击之类的明显东西不应该起作用,并且功能位没有得到由子进程继承(与原始 setuid 不同),这是另一个好处。

请记住,您想要做的事情确实会引起有关临时文件创建或访问的可能隐私问题,并且该程序可以用作安装竞争条件/特权升级尝试的基础(针对创建众所周知的文件名的程序)但不要做正确的安全检查)。

此外,一些编写不佳的应用程序可能依赖文件元数据或树结构作为传达含义或隐藏数据的一种方式。这可能会导致发布受限信息或泄露不为人知的特权文件(我知道通过默默无闻来确保安全,但不幸的是,这是闭源供应商特别喜欢做的事情)。

因此,在做这件事时要小心谨慎,要明白即使明显的事情不起作用,仍然存在与此相关的风险。

哦,我很想知道是否有人进行了概念验证攻击,该攻击使用此机制作为评论中特权升级的基础!

  • 这确实看起来很有趣! (5认同)
  • 我可以看到的最大问题是,在不可搜索目录下的世界可写目录可能会突然被写入。 (4认同)
  • @TroelsArvin 这不一定是件坏事。如果您将类似 setuid 的功能添加到不是为这些功能而设计的现有实用程序中,那么在您确认更新的实用程序可以安全地与您的非标准工具一起使用之前,您不希望对基础实用程序进行任何更新能力。想象一下在这种情况下,如果更新要让 `find` 能够直接执行一些用户提供的代码,类似于 `awk` 可以做的。 (2认同)

Len*_*iey 19

什么定位

locate 读取一个或多个由 updatedb(8) 准备的数据库,并将至少匹配一个 PATTERN 的文件名写入标准输出,每行一个。如果未指定 --regex,则 PATTERN 可以包含通配符。如果任何 PATTERN 不包含通配符,则 locate 的行为就像模式是PATTERN 一样

默认情况下,locate 不检查在数据库中找到的文件是否仍然存在。locate 永远不会报告在相关数据库的最新更新之后创建的文件。

或者甚至slocate

Secure Locate 提供了一种安全的方式来索引和快速搜索系统上的文件。它像 GNU locate 一样使用增量编码来压缩其数据库以加快搜索速度,但它还会存储文件权限和所有权,以便用户不会看到他们无权访问的文件。

本手册页记录了 slocate 的 GNU 版本。slocate 使系统用户能够搜索整个文件系统而不显示未经授权的文件。

  • @TroelsArvin:`locate` 不需要`sudo`;只有它的 `updatedb` 作业需要特殊权限。因此,您的用户不应该运行或能够运行 `sudo locate`。 (2认同)