如何授予用户使用 rm 命令的权限,但仅限于某个目录?我尝试将其添加到我的 /etc/sudoers 文件中
myuser ALL = NOPASSWD : /bin/rm ???? /usr/java/jboss/standalone/vfs/*
但是当我以该用户身份登录并执行命令时
/bin/find $JBOSS_HOME/standalone/tmp/vfs -mindepth 1 -mmin +1441 -exec sudo rm -rf {} \;
系统提示我输入密码
[sudo] password for myuser:
我还需要更改什么才能使其正常工作?
答案1
您的 sudoers 中有“stalone”,find 命令中有“standalone”。这可能就是问题所在。
答案2
请记住,使用此 sudo 命令 a/bin/rm -rf /usr/java/jboss/standalone/vfs/file /something_other_might_be_whole_filesystem
也是允许的(类似于 roaima 在评论中所述)。
如果你必须这样做,我建议将整个 find 命令放在 sudoers 下,因为没有通配符。
可能更好的解决方案是更改目录的所有权或放置我的用户在对上述目录具有写权限的组中。
答案3
正如其他人已经指出的那样,您的命令允许用户删除系统上的目录树。要授予用户删除特定目录中文件的权限,您需要编写一个包装脚本。在 sudoers 文件中:
myuser ALL = NOPASSWD: /usr/local/sbin/rm_jboss_vfs
在/usr/local/sbin/rm_jboss_vfs
:
#!/bin/sh
for x do
case "$x" in
*/../*|*/..) echo >&2 "$0: .. forbidden"; exit 3;;
/usr/java/jboss/standalone/vfs/[!.]*) rm -rf -- "$x";;
*) echo >&2 "$0: only absolute paths under /usr/java/jboss/standalone/vfs are permitted"; exit 3;;
done
/usr/java/jboss/standalone/vfs
请注意,如果存在符号链接,用户仍然可以转义。更安全的方法是 chroot 进入目录。使用带有内置命令的 shell rm
,例如窗扇。
#!/bin/sash
set -e
-chroot /usr/java/jboss/standalone/vfs
for x do
case "$x" in
/usr/java/jboss/standalone/vfs/[!.]*) -rm -rf -- "$x";;
*) echo >&2 "$0: only absolute paths under /usr/java/jboss/standalone/vfs are permitted"; exit 3;;
done
密码提示的问题可能是由于文件中存在另一个条目,该条目允许用户在密码提示的情况下运行此命令。如果两个条目匹配,则 sudo 使用最后一个条目,因此将任何NOPASSWD:
条目放在最后。看如何在没有密码提示的情况下以 root 身份运行特定程序?
与其使用权限提升,不如授予用户执行其所需操作的权限。 Unix 权限太粗粒度:授予用户删除目录中文件的权限需要授予他们对该目录的写权限(特别是在那里创建文件的权限)。至少,不要以 root 身份运行删除脚本,而是以某个组的身份运行它jboss_vfs_deleters
,并授予该组写入相关目录的权限。设置目录权限:
setfacl -d -R -m group:jboss_vfs_deleters:rwX /usr/java/jboss/standalone/vfs
setfacl -R -m group:jboss_vfs_deleters:rwX /usr/java/jboss/standalone/vfs
在sudoers
文件中:
myuser ALL = (jboss_vfs_deleters) NOPASSWD: /usr/local/sbin/rm_jboss_vfs
运行sudo -g jboss_vfs_deleters /usr/local/sbin/rm_jboss_vfs …
(您可以将其隐藏在非特权包装脚本中)。
使用组的缺点是您不能再使用chroot
,您必须使用不太健壮的基于命名的过滤方法。
/usr
请注意,在正常操作期间不应修改下面的文件。我不知道这些文件是什么,但如果您在正常操作中修改它们,它们可能应该位于/var
.