允许特定用户或组在没有密码的情况下 root 访问 /bin/date

允许特定用户或组在没有密码的情况下 root 访问 /bin/date

我想授予用户或组对 /bin/date 命令的完全 root 访问权限,包括手册页中定义的任何形式的参数。

我知道/etc/sudoers需要明确的命令定义,所以目前我有以下内容:

%some_group ALL=(root) NOPASSWD: /bin/date

例如,我希望 some_group 中的任何用户都能够运行:

sudo /bin/date +%T "12:34:56"

再加上无数其他的论点组合。

我想我的问题是,有没有办法使用正则表达式或安全(强调安全!)通配符来实现更细的粒度?

更新

我设法用 Cmnd_Alias 实现了类似的目标。除了有时间进一步阅读sudo和 sudoers的内部工作原理之外,为什么这在没有它的情况下不起作用是一个谜。

您的语法没有被完全接受,但我设法通过以下方式实现了我所需要的:

Cmnd_Alias DATE=/bin/date
%some_group ALL=(root) NOPASSWD: DATE

这正是我作为定义组的成员所需要的。

答案1

如果您使用 GNU/Linux 并且觉得某些“新”(原文如此)pam_cap.so可以为特定用户提供,这应该让普通用户无需或CAP_SYS_TIME即可更改系统时间。您基本上只需将其配置为会话模块,以进行身份​​验证(或其他),添加您想要的用户/功能,然后执行操作即可。不过,pam_cap 还不能进行组操作,因此您必须为要执行此操作的每个用户进行复制/粘贴。sudosusshlogin/etc/security/capability.confsetcap CAP_SYS_TIME+ei /bin/date

如果您希望所有系统用户都能够更改系统时间,您可以忘记所有 pam_cap 内容,只需执行一个setcap CAP_SYS_TIME+ep /bin/date本质上与功能类似的操作,将 setuid 位添加到二进制文件中(同样,您不能在脚本(如果写入可执行文件,则功能标志和 setuid/setgid 位将由内核清除)。

date通过 sudo 运行是相当安全的(除了直接替换之外,你可以尝试利用这样一个简单的实用程序的方法并不多,但攻击者必须找到一种方法来写入只有 root 有写权限的目录),所以就可以了-able,但功能使授予最终用户的权限看起来更加无缝(他们不必认为“哦,我必须对此进行 sudo”,他们只需去做他们想做的事情并且它有效)并且受到限制(您仅授予他们一组特定的提升权限)。 sudo 是一种仅限 setuid 的机制(至少目前如此),并且只能根据这个或那个可执行文件进行思考,无论该文件执行什么操作(无论是二进制文件还是您编写的脚本),它都可以使用完全 root 权限来执行此操作,甚至与您授予用户访问可执行文件的原因无关的权限。

setuid 是一个老旧的老的它基本上已经在大多数 GNU/Linux 和 Unix 实现上消失了。授予完全 root 访问权限是为了鸟儿,如果您只是想让用户更改系统时间,为什么要授予 CAP_SYS_ADMIN 或 CAP_NET_ADMIN 呢?当然,我想不出一种方法来利用它/bin/date来做坏事,但大多数利用都是不直观的,直到它们被发现和演示为止(我的意思是,希望该软件不包含明显的利用)。

如果您使用 *BSD 或 Solaris,它们具有相同的概念,只是称为“权限”而不是“功能”,因为“功能”已经是这些平台上与安全相关的机制的名称(大致类似于 LxC)和/或 SELinux、FWIW)。权限和 Linux 功能之间的实现细节有所不同,但基本概念是相同的(这也是 Solaris 11 实现“​​root 作为角色”安全模型的方式)。

答案2

您可以使用 sudo 命令来完成此操作。如果将以下规则添加到 /etc/sudoers 文件中,如下所示:

作为 root 或从普通用户帐户使用 sudo:

$ sudo visudo

/etc/sudoers这将在 vi/vim 中打开该文件。打开后,添加以下行:

Cmnd_Alias NAMEOFTHIS=/bin/date
ALL ALL=NOPASSWD: NAMEOFTHIS

其中“users”是所有用户都是其成员的 UNIX 组。您可以使用groups <username>命令或查看/etc/groups和文件来确定用户所在的组/etc/passwd

如果您有这样的部分,我会在此处添加上面的规则,如下所示:

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

# my extra rules
Cmnd_Alias NAMEOFTHIS=/bin/date
ALL ALL=NOPASSWD: NAMEOFTHIS

相关内容