6.3이 있고 Redhat
, 및 명령을 활성화하고 싶기 sudo
때문에 루트 사용자로 다음을 수행했습니다.chown
kill
chmod
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
,*
그것은 의미하지 않는다쉘에서와 같이 "이 디렉토리의 모든 파일"입니다. 오히려 "추가 옵션"을 의미하며 단독으로 사용해야 합니다. 불행하게도 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;
/usr/local/bin/changemodeowner
입력이 단순 하다고 가정할 때 이 스크립트의 sudo 항목은 다음과 같습니다 .
aabuhasna ALL=(ALL) NOPASSWD: /usr/local/bin/changemodeowner
여기서는 필요하지 않습니다 *
.