在 shell 脚本上安全获取 SUID 的最简单方法

在 shell 脚本上安全获取 SUID 的最简单方法

我有一个脚本,需要在其中安装覆盖层以使 OCI 容器能够访问已安装的只读目录,/nix/store就好像它是可写的一样。

我想让非root/非wheel用户运行这个脚本,最简单的方法是什么?最初,我天真地尝试使用,SUID然后才意识到这些不起作用,这让我找到了一堆关于SUIDshell 脚本的危险的答案和文章,其中一篇解释了为什么仅仅将其包装在一些 C 程序中并不能解决问题非洁净环境的安全问题。

是否有一个简单的包装器/实用程序可以将脚本包装在其中来处理此类漏洞?

从用户环境中,我只需要一个 ENV,它刚刚传递到 docker 容器,但是,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

这里有一些变量,这取决于您使用的发行版以及它是否将所有用户添加到A团体。我正在运行 ubuntu atm,并且我的所有本地用户都是plugdev.

因此,如果我想允许所有人运行您的脚本,我会将这一行添加到/etc/sudoers.d/script

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

然后,您还应该能够消除sudo脚本中 from 的使用(安装&卸载)。显然,您需要将该脚本放在他们都可以看到的路径中,但最好这样他们就无法编辑它。

答案2

向用户提供挂载/卸载访问权限的适当方法是 via sudo,正如脚本中已经实现的那样。或者,sudo wrapper.sh 如果您希望记录较少的系统日志记录,则可以包装脚本并使用。

我希望非轮子用户也可以运行它

$ man 5 sudoers提供有关如何正确配置实用程序以满足您的用例的广泛建议。 Stack Overflow 对于这个主题也有三个答案。

相关内容