考虑sudo
两个用户的配置:
mary ALL = (ALL) NOPASSWD: /bin/ls, /bin/cat
bob ALL = (ALL) PASSWD: /bin/sort
现在,当用户mary
执行不在列表中的任何命令时,她每次都必须进行身份验证。
$ sudo sort
[sudo] password for mary:
Sorry, user mary is not allowed to execute '/bin/sort' as root on eagle.
如果mary
再次尝试执行其他不允许的命令,系统会要求她输入密码。然而,对于 来说情况并非如此bob
,它只会被询问一次,直到超时为止。mary
当她最近已经能够正确提供密码时,为什么还要一次又一次地进行身份验证?
我确实找到了至少一个类似的问题但答案/评论似乎不够澄清。那里的问题是输入密码sudo -v
,这里的问题是关于配置不允许的命令。是的,规则PASSWD
与标签的交互NOPASSWD
是相似的。
答案1
简而言之,这是一个安全问题。您说过,玛丽可以在不提供密码的情况下运行某些命令。如果失败,则采取“默认操作”。去询问密码,然后记录失败的尝试。
无需了解可怕的技术,这就是身份验证和授权之间的分离。
- 玛丽是否正在尝试运行命令 - 通过询问是否是 ls 或 cat 来检查是否,如果是其他命令则检查默认方式。
- 找不到授权玛丽的方法。假装。 -- 身份验证失败,尝试运行 foo 时无法对 mary 进行身份验证
相对于
- 这是鲍勃吗,无论用什么密码检查
- 这是鲍勃,鲍勃是否可以运行 foo
- 不,bob 无法运行 foo —— 通过密码进行身份验证是可以的,缓存它。但无法授权该命令。
基本上,你说的
- 使用密码 bob 可以运行排序,
- 没有密码,玛丽可以运行 ls
- 如果 Mary 尝试运行 foo,那么她无法进行身份验证(没有方法)
- 如果 bob 尝试运行 foo,他可以进行身份验证,但未获得授权。
提示 Mary 输入密码的原因与提示用户 bar 的原因相同。因此,用户无法通过对 sudo 运行常用命令字典来通过检查命令的输出来确定哪些命令是不允许的。
或者另一种看待它的方式。因为“使用密码进行身份验证时可以运行什么”变量对于 Mary 来说为空,那么她永远无法使用密码进行身份验证。因为“使用密码进行身份验证时可以运行什么”变量对于 bob 来说不为空,那么他可以使用密码进行身份验证,但无权运行某些东西。
答案2
我sudo
从以下位置下载了 SRPM这里,从内部编译并运行它,gdb
以便有更深入的了解。这提示对调试 setuid root 程序非常有价值。
问题是,仅当用户被授权运行该命令并且也已通过身份验证时,才会sudo
创建/更新时间戳文件(位于 内部)。/var/db/sudo/<user>
身份验证涉及输入密码和/或调用聚丙烯酰胺模块。授权是指验证是否允许用户运行给定的命令。注意这里有两个条件。
该标记的含义NOPASSWD
是避免对列出的命令进行身份验证。因此,如果用户(例如mary
)在配置中没有任何PASSWD
条目,那么对于成功运行的命令,他不需要进行身份验证。由于用户未经身份验证,因此未创建时间戳文件。否则,如果这样的用户运行他未被授权的命令,那么就会进行身份验证。但由于授权失败,该文件再次没有被创建。
因此,对于具有条目的用户PASSWD
,仅当他成功运行该列表中的至少一个命令时,才会创建时间戳文件。当尝试运行其他未经授权的命令时,不会创建该文件,并且sudo
每次都会尝试进行身份验证。