SUDO:sudoers 文件中的用户名条件

SUDO:sudoers 文件中的用户名条件

我试图允许我的用户(通过sudo,在脚本中启动)将文件从他们的主目录复制到 Web 目录。

命令是:

sudo cp /home/$LOGNAME/file_source /var/www/$LOGNAME_file_dest

所以我在 sudoers 文件中添加了以下行:

%users ALL=(ALL)NOPASSWD:/bin/cp /home/$LOGNAME/file_source /var/www/$LOGNAME_file_dest

这不太有效,因为sudo要求我输入密码,但它不应该。我猜这是变量的问题,$LOGNAME该变量未在 sudoer 文件或类似文件中解释。

我差点忘了提,我是一个控制狂,这必须是一个非常严格的条件,没有*或其他任何事情都可以容忍。

有没有人可以解决这样的问题,或者我应该采取痛苦的方式并允许 1 by 1 用户将cp他的文件添加到/var/www目录中?

答案1

Shell 变量由您的 shell 解释,并且 sudo 或使用它们启动的任何其他程序都不会看到它。也就是说,在执行 时foo=bar; echo "$foo"echo永远不知道它传递的数据来自名为“foo”的变量,因为 shellecho甚至在执行之前就对其进行了扩展。因此,不可能使 shell 变量在 sudoers 文件中透明地工作。

另外,由于$LOGNAME可以是任何东西,所以您想要做的基本上相当于/home在您的后面使用一个星号sudoers,无论您是否使用它。我不建议这样做,因为您基本上可以以 root 身份将任何内容复制到任何地方,这是一个巨大的安全风险(因为$LOGNAME可以包含..)。最终,您说您不想使用*,但您想要采取的操作同样危险。

最好的选择是允许/home/$LOGNAME/file_source这些用户对任何内容进行读访问,并对其进行写访问/var/www。您可以有一个www-logs组,分别对这些路径进行组读取和组写入。

答案2

乔尔戴维斯有正确的答案,非常感谢大家的帮助!这就是“POSIX ACL 的脚本化应用程序”!

和: https://stackoverflow.com/questions/869536/linux-directory-permissions-read-write-but-not-delete

示例:(创建文件,一旦写入,它们是只读的,但可以被所有者删除,但不能被其他人删除。)

setfacl --set u::rwxs,g::rwx /controlled
setfacl -d --set u::r-x,g::r-x,o::- /controlled

这正是我需要做的。

非常感谢大家的帮助,我应该以不同的方式问这个问题。

答案3

创建一个脚本,在任何必要的检查后执行复制,并授予sudo访问权限。

请注意,特权 shell 脚本被认为是不好的做法;您可能想要使用 Python 或 Perl 等替代方案。

创建的环境sudo应该已经阻止用户覆盖库路径等,但您可能需要采取一些额外的步骤来固定它,以便只允许最小的系统库路径集。

相关内容