![如何在 shell 脚本上使用 SetUID 以非 root 用户身份运行?](https://linux22.com/image/587007/%E5%A6%82%E4%BD%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%8A%E4%BD%BF%E7%94%A8%20SetUID%20%E4%BB%A5%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我们公司的服务器运行的是 Ubuntu 12.04 (Precise) 和 Apache 2。我们安装了一个自定义的内部 Web 应用程序。我有一个 bash 脚本,可以将该应用程序的所有更新从源代码控制拉到服务器。系统上只有一个用户(脚本文件的所有者)拥有连接到源代码控制所需的 SSH 密钥,但我希望系统上的任何用户都能运行此脚本来更新应用程序。
我做了一些研究,看起来这正是 setuid 位的设计目的,以便系统上的任何用户都可以运行该脚本,并且该脚本将以脚本所有者的用户 ID 运行。但是,似乎现代发行版忽略了脚本的 setuid 位,因为如果执行 root 拥有的脚本会带来安全风险。
我以为我可以通过将其制作成 perl 脚本来暂时解决这个问题,但从 Precise 开始,也不再有 suid-perl 包了。看起来这个已经被弃用了。
我发现有些网站建议通过将用户添加到 sudoers 文件来解决这个问题,但我的脚本不需要 root 权限即可运行,并且它不会对文件系统的任何部分(网站除外)进行任何更改,因此我宁愿不授予任何人 sudoer 权限。该脚本只需要脚本所有者的权限即可正常运行。
那么,使用(不同的、非root的、非sudo的)用户的UID执行脚本的首选现代方法是什么?
答案1
您可以配置 sudo 以允许人们以特定的非 root 用户身份运行命令,例如在 sudoers 中
user1 (ALL) = (appuser) /path/to/yourapp
将允许用户 user1 以 appuser 身份运行你的应用程序
sudo -u appuser /path/to/yourapp
相似地
%somegroup (ALL) = (appuser) /path/to/yourapp
在 sudoers 中将允许组 somegroup 中的用户以 appuser 身份运行你的应用程序
sudo -u appuser /path/to/yourapp