2011-02-14 7 views
3

私はApache経由またはコマンドラインで呼び出されるPerlスクリプトを持っています。cgi-binとして使用するとsetuid()でPerlスクリプトをうまく実行するには?

テスト目的のために、私はPerlスクリプトが動作するようにするユーザ名を渡します。を使用してuidを設定します。

私は、コマンドラインからスクリプトを実行する場合uidが適切に設定され、その後:

use CGI::Pretty qw/:standard/; 
use POSIX qw(setuid getuid); 

... 
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment, 
    $pwGcos, $pwHome, $pwLogprog) = getpwnam($username); 

if ((defined $pwUid) && (getuid() == $pwUid)) { 
    setuid($pwUid); 
    print header; 
    print Dumper $<; 
} 
else { 
    print header(-status => 401); 
    print "Could not setuid to correct uid (currently:)".getuid()."\n"; 
} 

コマンドライン出力は、指定された$usernameの正しいuidを示し、代わりのテストアカウントのuidスクリプトの実行を開始しました。

私がApache経由でスクリプトを呼び出すと、uidapacheユーザーのIDに設定されたままになり、変更されません。

、ドキュメントを読んだ後ので、私は、私はここにsuExecを使用することができるとは思わない:

  1. 私はすべての$usernameためhttp://www.example.com/~usernameには、このスクリプトのコピーを置くことができません。スクリプトは1か所から実行する必要があり、スクリプト内からuidを指定する必要があります。

  2. スクリプトを実行時に指定したユーザー名として実行する必要があり、Apache構成ファイルの仮想ホスト・ディレクティブで1回指定したユーザー名ではありません。新しいユーザーがこのスクリプトを実行するたびにこの設定ファイルを変更し、Apacheを再起動することは現実的ではありません。 setuid()を使用しているとき、私は、CGI-binに正しくuidを変更すると実行しているPerlスクリプトを取得するにはどうすればよい

+1

あなたのコマンドラインユーザーはおそらくそのUIDを変更する権利を持っています。あなたのWebサーバーユーザーはおそらくそうではありませんか? – Konerak

答えて

4

setuidを任意のuidに割り当てる唯一の方法は、rootとして実行することです[1]

私はあなたについてよくわかりませんが、ルートとして動作しているCGIプログラムのアイデアは私に悪夢を与えてくれます。

uidを変更した後に実際に実行するはずのこのコードは何ですか?おそらく、setuidを使わずにこれを達成する方法がありますか?

[1]コード​​とそのセキュリティモデルによっては、ユーザーのパスワードを収集し、別のコマンドラインプログラムを実行してWeb外で実際の操作を実行することができる場合があります(su/sudo [2]しかし、su/sudoはsuid rootであり、実行中のCGIコードに関係する問題の大半またはすべてをrootとして残してしまうため、これを行うことができます。あなたが無効なユーザー名としてrootを除外したとしても、任意のユーザーが乱用の機会をたくさん開くので、マスカレードすることができます。

[2] sudoは、パスワードを必要とせずに許可するように設定することもできますが、そのパスの下にドラゴンが存在します。試してみると、自分が行っていることを知っていることを確認してください。

+0

このcgi-binは、Ajax呼び出しで使用されます。スクリプトは指定されたユーザーとして実行され、Webサーバーにアクセス可能なファイルシステム上のファイルのリストへのユーザーのアクセスを制限します。 –

+0

私はディレクトリリストを提供するために使用しているコードを分割し、提供されたユーザー名のuidに基づいて結果をフィルタリングする必要があると思います。 –

+1

@Alex - 後者(ユーザーIDに基づいてCGIフィルタ結果をフィルタリングする)は、実際にはこの問題の最良の解決策です。 – DVK

関連する問題