pet*_*ter 9 security permissions sudo
我想授予用户或组对 /bin/date 命令的完全根访问权限,包括手册页中定义的任何方式的参数。
我知道/etc/sudoers
需要明确的命令定义,所以目前我有以下几点:
%some_group ALL=(root) NOPASSWD: /bin/date
Run Code Online (Sandbox Code Playgroud)
例如,我希望 some_group 中的任何用户都能够运行:
sudo /bin/date +%T "12:34:56"
Run Code Online (Sandbox Code Playgroud)
加上无数其他参数组合。
我想我的问题是,有没有办法使用正则表达式或安全(强调安全!)通配符来实现更精细的粒度?
更新
我设法用 Cmnd_Alias 实现了类似的功能。除了有时间进一步阅读sudo
sudoers的内部工作原理之外,为什么这不起作用是一个谜。
您的语法不太被接受,但我设法通过以下方式实现了我所需要的:
Cmnd_Alias DATE=/bin/date
%some_group ALL=(root) NOPASSWD: DATE
Run Code Online (Sandbox Code Playgroud)
这正是我作为定义组成员所需要的。
Bra*_*ley 15
如果您使用的是 GNU/Linux 并且觉得pam_cap.so
可以为特定用户提供“新”(原文如此)的东西CAP_SYS_TIME
,这应该让普通用户在没有sudo
或 的情况下更改系统时间su
。您基本上只需将其配置为会话模块,无论它们进行身份验证(ssh
或login
其他方式),添加您想要的用户/功能,/etc/security/capabilities.conf
然后执行操作setcap CAP_SYS_TIME+ei /bin/date
,您就可以开始了。但是,pam_cap 还不能做组,因此您必须为每个要执行此操作的用户复制/粘贴。
如果您希望所有系统用户都能够更改系统时间,您可以忘记所有 pam_cap 内容,只需执行一个setcap CAP_SYS_TIME+ep /bin/date
本质上是 Capabilities 的模拟,将 setuid 位添加到二进制文件中(同样,您不能在脚本,如果您写入可执行文件功能标志和 setuid/setgid 位被内核清除)。
date
通过 sudo 运行是非常安全的(除了通过完全替换之外,没有多少方法可以尝试利用这样一个简单的实用程序,但是攻击者必须找到一种方法来写入只有 root 具有写入权限的目录),这样就可以了- 能够,但功能使授予最终用户的权限看起来更加无缝(他们不必认为“哦,我必须对此进行 sudo”,他们只是去做他们想做的事情并且它有效)并且受到限制(您只能为他们提供一组特定的提升权限)。sudo 是一种 setuid-only 机制(至少目前是这样),只能考虑这个或那个可执行文件,无论该文件做什么(无论是二进制文件还是您编写的脚本),它都可以以完全的 root 权限执行,
setuid的是一个旧旧的旧机制,它基本上是其对大多数GNU / Linux和Unix实现的出路。给予完全的 root 访问权是为了鸟类,如果你只是想让用户改变系统时间,为什么要给 CAP_SYS_ADMIN 或 CAP_NET_ADMIN 呢?当然,我想不出一种利用漏洞/bin/date
来做坏事的方法,但大多数漏洞利用在被发现和证明之前都是不直观的(希望该软件不包含明显的漏洞利用,我的意思是)。
如果您使用的是 *BSD 或 Solaris,它们具有相同的概念,它们只是被称为“权限”而不是“功能”,因为“功能”已经是这些平台上与安全相关的机制的名称(大致类似于 LxC和/或 SELinux,fwiw)。权限和 Linux 功能之间的实现细节有所不同,但基本概念是相同的(这也是 Solaris 11 实现“root as role”安全模型的方式)。
您可以使用 sudo 命令来完成此操作。如果将以下规则添加到 /etc/sudoers 文件中,如下所示:
以 root 身份或从普通用户帐户使用 sudo:
$ sudo visudo
Run Code Online (Sandbox Code Playgroud)
这将/etc/sudoers
在 vi/vim 中打开文件。打开后,添加以下行:
Cmnd_Alias NAMEOFTHIS=/bin/date
ALL ALL=NOPASSWD: NAMEOFTHIS
Run Code Online (Sandbox Code Playgroud)
其中“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
Run Code Online (Sandbox Code Playgroud)