如何为一个目录启用 sudo

如何为一个目录启用 sudo

我有Redhat6.3,我想启用、和sudo的命令,因此在 root 用户下我执行了以下操作:chownkillchmod

visudo
#add the following line
aabuhasna ALL=(ALL) NOPASSWD: /usr/bin/kill, /bin/chmod, /bin/chown

基于添加的行,用户aabuhasna可以执行chmod, 以及chown任何目录或文件,但我想限制一个目录,例如,如果我使用该命令,chown aabuhasna:aabuhasna /test_dir/*它可以工作,但如果我使用chown aabuhasna:aabuhasna /opt/*它失败,则同样适用于chmod.

答案1

sudo 命令中的通配符有点冒险。他们可能看似为您提供安全保障,但实际上却没有这样做。至sudo* 并不意味着“此目录下的任何文件”,就像在 shell 中一样。相反,它意味着“任何附加选项”并且必须独立。不幸的是,您不能在 sudo 中限制部分参数,而且,它也不安全(因为用户可以指定../../哪个会破坏您的意图)。

因此,您要做的就是:编写一个脚本来仔细验证命令行参数并确保它们不包含诸如../.然后该脚本将包含在用户的 sudo 中。还有一点:在这种情况下 bash 是一个糟糕的选择,因为恶意用户可以通过多种方式破坏您的意图。所以这是一个我已经测试过的 perl 示例,应该适合您的需求(定制后,并替换echo为空字符串)。

#!/usr/bin/perl -w
my $user = "aabuhasna";
my $group = "aabuhasna";
my $prefix = "/test_dir";

$mode=shift @ARGV or die "Please provide a mode for the new file";
die "Invalid chmod input: $mode" unless $mode =~ /^[0-9]+$/;
$mode = oct($mode);
die "Invalid permissions in mode: $mode" if $mode != ($mode & 0777);
my $uid = (getpwnam($owner))[2] or die "Unknown user: $user";
my $gid = (getpwnam($group))[2] or die "Unknown group: $group";
foreach (@ARGV) {
   die "Invalid Directory Argument: $_" if m:\.\./:;
   next if -l $prefix."/".$_;
   push @files,$prefix."/".$_;
}
die "No files specified!" unless @files;

chmod $mode, @files;
chown $uid, @gid, @files;

该脚本的 sudo 条目,假设您输入的内容/usr/local/bin/changemodeowner很简单:

aabuhasna ALL=(ALL) NOPASSWD: /usr/local/bin/changemodeowner

这里不需要*

相关内容