私はbashスクリプトを書いています。
- 初期化時にいくつかのsudoedコマンドを実行する
- セキュリティのためにroot権限を解除する(
sudo -K
) - 権限のないプログラムの実行
- ただし、終了時にルート権限が必要です。
私は〜を探していますスクリプトが終了したときにユーザーにパスワードを再度要求するのを防ぐ簡単で安全な方法。
sudo -K
私は用語信号をキャッチするのを待つ前に分岐を検討しています。これが最もエレガントで安全なソリューションであるかどうかはわかりません。
コードは次のとおりです。
sudo unshare -m \
sudo -u "$USER" -g `id -g -n "$USER"` \
bash -c \
"sudo mount --bind \"$MOUNT_DIR\" \"$MOUNT_DIR\"; \
sudo mount --make-private \"$MOUNT_DIR\"; \
sudo -K; \
<unprivilegied program here>; \
sudo umount \"$MOUNT_DIR\""
注:注:これにより、プログラムのみがアクセスできる名前空間にプライベートマウントが作成されます。unshare -r
プログラムを実行するオプションではありません。
ベストアンサー1
一般ユーザーとrootユーザーを切り替えることがわかりました。
- ルートに切り替えて実行
unshare
- 実行するには、通常のユーザーに戻ります
bash
(たとえあなたがbashismを使用していないように見えるので、sh
より携帯性が高く、より軽いかもしれません)。 bash
より多くの権限を持つ操作を実行するには、そのシェル内でルートに何度も切り替えます。
これを簡素化し、ユーザーを切り替えると同時に問題を解決するために必要な回数を減らすことができると思います。
sudo unshare -m sh -c '
mount --bind "$1" "$1";
mount --make-private "$1";
exec sudo -u "#$SUDO_UID" -g "#$SUDO_GID" sh -c "
sudo -K;
<unprivilegied program here>
"
' - "$MOUNT_DIR"
技術的に権限のない部分の実行中に継続的に実行されるルートシェルがありますが、シェルが行うことは、権限のない部分が完了するのを待つだけで、他の操作は実行しません。ただし、実際に権限を早期に放棄し、sudo
ユーザーに権限を再付与するように要求する必要がない場合は、すべての選択肢には何らかの方法でコマンドをumount
実行するためのシグナルを待つ遅延処理も含まれます。
さて、コマンドが独立しているのは大丈夫です。私の提案にもその精神を維持しました。しかし、正直なところ、コマンドラインオプションで提供されるコードの塊は、書き込みsh -c
、読み取り、保守が困難です。参照は複雑なので、それを独自のスクリプトに分割し、プロセス全体を次のように実行することをお勧めします。
sudo unshare -m /usr/local/bin/script-that-does-the-rest-of-the-work
これにより、許可されたコマンドのsudoルールを簡単に作成できます。これは、ユーザーがコマンドの実行を許可しない限り(フルrootアクセス権を付与するのと同じ)、私の提案では作成するのが難しいでしょう。この場合、コマンドを許可する必要がありますが、これはunshare -m sh -c <huge block> "$MOUNT_DIR"
非常に困難です。Cmnd_Alias