概括
是否有一种非交互式(无人值守,不需要基于 ncurses 的控制终端)方法来验证 sudo 是否已正确配置以允许从一个非 root 用户帐户到另一个非 root 用户帐户的无密码 sudo?
为什么
我有一个场景,其中某些处理需要在不同的用户帐户上执行,但执行需要在没有任何用户干预的情况下进行,因为没有可用的控制终端(例如,来自后台进程)。
细节
它在 Linux 下运行(特别是 RHEL 5 或 RHEL 6,或大致相当的 CentOS 机器)。没有其他操作系统或 Linux 变体与此问题相关。
为了便于讨论,假设涉及两个用户帐户:userA 和 userB。
我需要一种方法来验证是否可以从 userA 到 userB 执行无密码 sudo,所有操作都来自 userB 帐户。
在该 sudo 调用内的 userB 帐户中执行的命令将用于诸如运行用户空间程序之类的事情(例如,不运行诸如 之类的系统管理命令fdisk
)。
这里的关键限制是该方法应该能够在没有控制终端的后台进程中从 userB 帐户而不是 userA 帐户完成。
该方法应该可以通过使用 sed/awk/etc 在 Bash 脚本中实现。检查文件的命令。
系统管理员不必参与此方法(例如,不需要 setuid 脚本)。
那可能吗?如果是这样,怎么办?
研究
考虑到 sudoers 文件可能难以解析。看着类似的问题如何在没有密码提示的情况下以 root 身份运行特定程序?目前尚不清楚非 root 脚本如何在不使用某些交互机制的情况下检查 sudoers 文件的内容,例如visudo
需要启用 ncurses 的终端,而这不是一个选项。
还https://unix.stackexchange.com/a/260739/21372指示从 userA 到 userB 的无密码 sudo 的正确语法,但我在这里的问题可能只是归结为如何在不运行 ncurses 约束的应用程序(例如 )的情况下查看该配置visudo
,但我不确定它是否那么简单。
答案1
您无法通过解析 sudo 配置文件来完成此操作,因为 sudo 配置只能由 root 读取。即使您可以读取 sudo 配置,也很难可靠地解析它(尤其是处理非本地信息,例如 LDAP 数据库),并且它并不能说明全部情况(例如,可以通过组授予权限)。
唯一实际的检查是以sudo
用户 A 的身份运行。由于您需要从以用户 B 的身份运行的脚本中执行此检查,因此您需要一种方法让用户 B 以用户 A 的身份运行检查。要么编写一个小程序 (不是脚本即 setuid A,或者通过 sudo 授予用户 B 以用户 A 身份运行检查的权限。
如果您无法让管理员参与设置 sudo 规则,允许用户 B 以 A 的身份运行检查,那么 setuid 程序是唯一的解决方案。该程序将调用sudo -u userB -b true
以检查是否允许 Atrue
以用户 B 的身份运行。这是该程序的 C 源代码(警告:未经测试!):
#include <unistd.h>
int main(void) {
execl("/usr/bin/sudo", "sudo", "-u", "userB", "-b", "/bin/true", (char*)NULL);
return 126;
}
编译它并使生成的可执行文件 setuid A (它必须属于 A,然后运行chmod 4755 /path/to/executable
)。
请注意,此解决方案并不完整:只有当 A 凭借用户 A 的身份而被允许以 B 的身份运行命令时,它才会起作用,而当 A 凭借属于某个组而获得此特权时,它就不起作用。如果您需要验证组成员身份,则必须sg
以用户 A 身份运行以获得此组成员身份,然后使其运行sudo
。
答案2
您在这个问题中提出了两个不同的问题。
如何允许/验证 userA 的 sudo 权限
关联到 Sudo 项目主页如何以 userB(而非 root)身份查看 sudo 设置
#1可以通过深入研究 /etc/sudoers 和相关 sudo 文件和命令的文档来实现。我没有限制一个用户作为另一个非 root 用户的命令的经验,所以我不能真正说,除非我知道这是可以做到的。
#2完全是 sudo 配置权限的问题,例如 /etc/sudoers /etc/sudo.conf /etc/sudoers.d/* 等。在我的系统上,这些文件是模式,-r--r-----. root root
您的 userB 将无法读取它们没有:
- 成为根组的成员
- 请求您的系统管理员更改这些权限。
它是如此简单;如果没有发生这两件事之一,userB 将无法读取或解析该文件。