6.3がありRedhat
、コマンドを有効にしたいsudo
ので、rootユーザーとして次のことを行いました。chown
kill
chmod
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
ここでは必要ありません*
。