web-dev-qa-db-ja.com

所有者の権限でシェルスクリプトを実行する

Debian(5.0.3)サーバーには、特定のシェルスクリプトを所有するユーザーsvnsyncがいます。

-rwsrwsr-x 1 svnsync users  119 Dec 21 13:45 mirror-svn.sh

usersグループの全員がsvnsyncの権限でこのスクリプトを実行できるようにしたいと思います。これは、コミット後のスクリプトから「svnsync synchorize」コマンドをトリガーすることに関連しています。引用 svnbook

[...]コミット後およびrevprop-change後のフック実装の一部として、プライマリリポジトリに変更を1つ以上の祝福されたミラーにプッシュさせたい場合があります。これにより、ミラーを可能な限りリアルタイムに近い状態で最新の状態にすることができます。

とにかく、Linux/Debianは ここ と呼ばれる最新のUnixシステムの1つであるため、SUIDを機能させることができません。

最近のUNIXシステムの中には、この理由でシェルスクリプトのSUIDビットとSGIDビットを無視するものがあります。

このSFの質問 は同じことを示唆しています:「シェルスクリプトにSUIDルートを使用することはできません」。それで、これが私のフォローアップの質問です:

私が本当に本当に所有者の特権でスクリプトを実行したい場合、潜在的なリスクに関係なく、手間のかからない方法はありますか? スクリプトをバイナリにコンパイルすることは 推奨 でしたが、可能であればもっと簡単な方法をお勧めします。たとえば、シェルスクリプトを呼び出すのはどうですか。 Perlスクリプト(私は実際にこれを試しましたが、動作させることができませんでした)? sudoersファイルに全員を追加する も実際には良いオプションではありません。

UpdatePerl-suidx89を推奨 としてインストールし、次のようなPerlラッパースクリプトを使用して機能させました。

#!/usr/bin/suidperl -T
$ENV{PATH} = "/bin:/usr/bin";
system("/path/to/mirror-svn.sh");

chmod +sはこのラッパースクリプトに設定されています。また、スクリプトで$ENV{PATH}を設定する必要があることにも注意してください。そうしないと、 安全でない であるという苦情が表示されます。

1
Jonik

新しいバージョンのdebianには、Perlスクリプトのこの問題に対処するPerl-suidというパッケージがあります。おそらく、5.0.3でも利用可能です。

スクリプトにSUIDビットを与えることに関するセキュリティの問題は、シェルスクリプトに限定されず、解釈される言語に影響します。これが、Perlからスクリプトを呼び出す最初の試みが機能しなかった理由です。 SolarisのスクリプトにSUIDビットを設定することは可能のようですが、スクリプトの周りにCラッパーを記述したくないので、Solarisへの移行はオプションではありませんか? ;-)。

2
0x89