私はPythonプログラミング入門プロセスの調教として働いています(すべての作業は端末で行われます)、プロジェクト提出スクリプトを書いています。理想的には、次のようなディレクトリ設定が必要です。
submissions/
user1/
project1/
...
user2/
project1/
...
...
理想的には、すべてのユーザーがコミットディレクトリのすべての内容を読み書きできるようにし、すべての操作を正しい場所にコピーするコミットスクリプトを提供します。
現在のサブミットを実行して使用するときに動作する小さなPerlスクリプトがありますが、生徒がスクリプトを実行したときにエラーが発生しないように権限(またはスクリプト)を設定するには(サブミットディレクトリへpermission denied
の書き込み権限が必要です)が、書き込み権限もありますありませんか?
ベストアンサー1
完全性のために、これが最も簡単な解決策です。私はバージョン管理システムがなぜ不適切なのかという私の視点に従います。
私は提出された実行可能ファイルでsetuidビット(chmod 4755)を有効にして、学生がそれを実行したときにプログラムが私と同じように実行するようにしました。すべてのファイルをコピーすると、所有権が私に転送され、生徒がディレクトリ全体にアクセスできないようにすることができます。これには、Perlによって追加されたsetuidセキュリティのいくつかの障害(汚染入力なし、汚染PATHなし)を克服することが含まれていましたが、最終的にはうまくいきました。最終スクリプトの長さは約20行でした。
バージョン管理システムが許可されない理由は、これがプログラミングの最初のプロセスであるためです。学生はターミナルを使ったことがなく、SSH経由でサーバーに接続し、ファイルを送受信するという考えに非常に混乱していました。バージョン管理システムの詳細は、上位クラスのクラスに適しています(特に学生が端末のスペルエラーに脆弱な場合!)。今日、このコースの中で、実際にバージョン管理システムの学習が必要なコースがどれだけ多いかを知れば驚きます(私は学部の時に4つのコースを受講しました)。バージョン管理システムを設定できない重要性の低い理由は、サーバーに対するスーパーユーザー権限を持っておらず、バージョン管理システムを把握できないという理由だけで、教授にバージョン管理システムの設定を要求しないからです。愚かなsetuidビット。
この過程で私が望んだのは、プライベートポジションに簡単な1段階の提出だけでした。問題は私のソリューションの構造ではなく、私の実装とUnix権限の知識の欠如(setuidビットを知らない)にあります。したがって、Sean C.のコメントはヒントでしたが、最初はスクリプトをrootとして実行したいと思っていました。
これは実際の作業スクリプトとその権限です。あなたが発見したセキュリティの脆弱性を表示してください。
-rwsr-xr-x 1 260s12ta 260s12ta 600 2012-01-16 23:19 submit
#!/usr/bin/perl
use File::Copy;
$ENV{"PATH"} = "/usr/bin"; # appease the perl-suid security for shell calls
my $username = getlogin() or die "Couldn't access user login: $!\n";
my $dir = "/home/260s12ta/labs/$username/";
foreach (@ARGV) {
if ($_ =~ /([\w-]+\.tar\.gz)/) { # untaint the given filename
$filename = $1;
} else {
die "\nInvalid submission: $_ is not a .tar.gz file.\n";
}
print "Submitting $filename... ";
copy($filename, $dir) or print "Submission failed: $!\n";
chmod(0600, "$dir/$filename") or print "Submission failed: $!\n";
print "OK!\n";
}