シェルスクリプトからSUIDを安全に取得する最も簡単な方法

シェルスクリプトからSUIDを安全に取得する最も簡単な方法

/nix/storeOCIコンテナが書き込み可能なかのようにマウントされた読み取り専用ディレクトリにアクセスできるようにオーバーレイをインストールする必要があるスクリプトがあります。

ルート/ホイール以外のユーザーにこのスクリプトを実行させたいと思います。最も簡単な方法は何ですか?当初、私は素直に試してみましたが、SUIDこれがうまくいかないことに気づきました。これはシェルスクリプトの危険性に対する多くのSUID回答と記事をもたらしました。そのうちの1つは、なぜそれをいくつかのCプログラムでラップしたのか説明しましたが、安全を解決することはできません。クリーンでない環境問題。

これらの脆弱性を処理するためにスクリプトをラップすることができる単純なラッパー/ユーティリティはありますか?

ご使用の環境では、dockerコンテナに渡されたばかりのENVのみが必要ですが、rootユーザーはbashセッションで同じENV変数を持つことになるので、提案がすべてのユーザーエクスペリエンスを無視して代わりにroot 1を使用して機能する場合、私のユースケースには問題ありません。

local temp_dir=$(mktemp -d)

mkdir -p {$temp_dir/store,$temp_dir/upper-store,$temp_dir/work-store}

# Create Overlay
sudo mount -t overlay overlay \
  -o lowerdir=/nix/store,upperdir=$temp_dir/upper-store,workdir=$temp_dir/work-store $temp_dir/store

# Do some sutff with the mounted overlay

sudo umount $temp_dir/store
rm -rf $temp_dir

答え1

これには、使用しているディストリビューションとすべてのユーザーを追加するかどうかに応じて、いくつかの変数があります。グループ。私はubuntu atmを実行しており、すべてのローカルユーザーはですplugdev

したがって、誰もがスクリプトを実行できるようにするには、次の行を追加します/etc/sudoers.d/script

%plugdev  ALL = NOPASSWD: /path/to/script

sudoその後、スクリプトからfromの使用を削除することもできます(インストールする&削除)。明らかに、誰もが見ることができるパスにスクリプトを配置する必要がありますが、可能であれば編集できないようにする必要があります。

答え2

ユーザーにマウント/アンマウントアクセスを提供する適切な方法は、sudoスクリプトにすでに実装されているように使用することです。あるいは、sudo wrapper.sh システムのロギングが少ない場合は、スクリプトをラップして使用することもできます。

ホイールを使用していないユーザーも実行できることを願っています。

$ man 5 sudoersユースケースに合わせてユーティリティを正しく設定する方法について広範なアドバイスを提供します。 Stack Overflowにもこのトピックに3つの答えがあります。

関連情報