我有一个脚本,需要在其中安装覆盖层以使 OCI 容器能够访问已安装的只读目录,/nix/store
就像它是可写的一样。
我想让非root/非wheel用户运行这个脚本,最简单的方法是什么?最初,我天真地尝试使用SUID
,然后才意识到这些不起作用,这让我找到了一堆关于SUID
shell 脚本的危险的答案和文章,其中一篇解释了为什么仅仅将其包装在一些 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
这里有一些变量,这取决于您使用的发行版以及它是否将所有用户添加到组中。我正在运行 ubuntu atm,并且我的所有本地用户都是
plugdev
.因此,如果我想允许所有人运行您的脚本,我会将这一行添加到
/etc/sudoers.d/script
:然后,您还应该能够消除
sudo
脚本中的使用(安装和卸载)。显然,您需要将该脚本放在他们都可以看到的路径中,但最好这样他们就无法编辑它。向用户提供挂载/卸载访问权限的适当方法是 via
sudo
,正如脚本中已经实现的那样。sudo wrapper.sh
或者,如果您希望记录较少的系统日志记录,则可以包装脚本并使用。$ man 5 sudoers
提供有关如何正确配置实用程序以满足您的用例的广泛建议。Stack Overflow 对于这个主题也有三个答案。