ディレクトリに対してsudoを有効にする方法

ディレクトリに対してsudoを有効にする方法

6.3がありRedhat、コマンドを有効にしたいsudoので、rootユーザーとして次のことを行いました。chownkillchmod

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

ユーザーがaabuhasna実行できる追加の行に基づいてすべてのディレクトリまたはファイルをchmod含めますchownが、これを1つのディレクトリに制限したいと思います。たとえば、コマンドを使用すると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

ここでは必要ありません*

関連情報