我有一个脚本,需要在其中安装覆盖层以使 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
答案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 对于这个主题也有三个答案。