在脚本终止时启动 sudoed 命令?

Kri*_*Dev 4 sudo shell-script privileges

我正在编写一个 bash 脚本:

  • 在初始化时运行一些 sudoed 命令
  • 出于安全目的释放 root 权限 ( sudo -K)
  • 运行一个非特权程序
  • 但终止时需要root权限

我正在寻找一种简单且安全的方法,以避免在脚本终止时再次询问用户密码

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\""
Run Code Online (Sandbox Code Playgroud)

注意:有关信息,这会在只有程序有权访问的命名空间中创建一个私有挂载。unshare -r不是运行程序的选项。

Cel*_*ada 5

我注意到您在普通用户和 root 用户之间来回切换:

  • 切换到root运行 unshare
  • 切换回普通用户运行bash(尽管您似乎没有使用任何 bashisms,因此您也可以运行sh它,这将更便携且可能更轻巧)
  • 在该bashshell 中多次切换回 root以执行更多特权操作

我认为您可以简化此操作并减少需要在用户之间来回切换并同时解决您的问题的次数。

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"
Run Code Online (Sandbox Code Playgroud)

从技术上讲,有一个 root shell 在整个非特权部分的执行过程中持续运行,但 shell 要做的唯一事情就是等待非特权部分完成,没有别的。但是,如果您真的想提前放弃您的sudo特权并且不必要求用户再次授予它们,那么所有替代方案也将涉及一个挥之不去的过程,等待信号以umount某种方式运行命令。

顺便说一句,很高兴你的命令都是自包含的,我在我的建议中保留了这种精神,但老实说,作为命令行选项提供的大块代码sh -c很难编写、阅读和维护,因为所有您必须担心引用的复杂性,我建议将它们分解到自己的脚本中并将整个过程运行为:

sudo unshare -m /usr/local/bin/script-that-does-the-rest-of-the-work
Run Code Online (Sandbox Code Playgroud)

此外,这样做可以更轻松地为允许的命令编写 sudo 规则,除非您完全允许用户运行任何命令,否则很难使用我的建议编写这些规则,这与授予他们完全 root 访问权限相同。在这种情况下,您必须允许编写unshare -m sh -c <huge block> "$MOUNT_DIR"非常具有挑战性的命令Cmnd_Alias