进一步阅读

进一步阅读

OpenVPN 中的“--up”选项通常用于路由等。因此,它会在 OpenVPN 放弃 root 权限以无人身份运行之前进行处理。但是,我正在调用需要以非特权用户身份运行的 shell 脚本。

我怎么做?我学过删除进程权限,特别是多项式和泰勒尔的答案,但我不明白如何实现。我在 Centos 6.5 中工作,suid 被阻止,无论是“chmod u+s”还是“setuid()”。

有一个 OpenVPN 插件(“openvpn-down-root.so”),它允许由“--down”选项调用的脚本以 root 身份运行。可能有一个等效的,例如“openvpn-up-user.so”,但我还没有找到它。

编辑0

根据 Nikola Kotur 的回答,我已经安装了Ian Meyer 的 runit-rpm。尽管 chpst 命令可以在终端中运行,但在 up 脚本中它会失败并显示“未找到命令”。有效的是“sudo chpst”加上设置正确的显示和语言。请参见为什么我的终端不能正确输出 unicode 字符?鉴于此,up 脚本需要以下四行:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

编辑1

根据 0xC0000022L 的评论,我发现“sudo -u user”与“sudo chpst -u user -U user”一样有效:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

我将研究 man sudoers 并更新如果/当我让 sudo 单独工作时。

答案1

仅覆盖 runit 和 sudo 会遗漏很多内容。实际上有像 runit 这样的一整套工具集,并且有多种工具可以用来完成此任务,而这些工具正是为这些任务而设计的:

  • Daniel J. Bernstein 的 daemontools 有setuidgid:
    设定值用户/家/用户/非特权.sh
  • util-linux(在较新的 Debian 上默认安装)有setpriv:
    setpriv --reuid=用户--regid=团体--init-groups --inh-caps=-all /home/用户/非特权.sh
  • Adam Sampson 的 freedt 具有setuidgid
    设定值用户/家/用户/非特权.sh
  • Bruce Guenter 的 daemontools-encore 有setuidgid:
    设定值用户/家/用户/非特权.sh
  • Gerrit Pape 的 runit 有chpst:
    chpst-u用户/家/用户/非特权.sh
  • 韦恩·马歇尔的犯人有runuid:
    运行用户ID用户/家/用户/非特权.sh
  • Laurent Bercot 的 s6 有s6-setuidgid:
    s6-setuidgid用户/家/用户/非特权.sh
  • 我的小吃有setuidgid:
    设定值用户/家/用户/非特权.sh

他们不混合在不同的的任务添加特权,并且永远不会陷入交互模式。

顺便说一句,你附加的问题只不过是你忘记拥有sbin以及bin你的。PATH

进一步阅读

答案2

我用运行chpst工具来完成此类任务。例如,从 up 脚本调用您的非特权脚本:

chpst -u nobody /path/to/script

答案3

在基于 Linux 的系统上,您可以setpriv(从util-linux):

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

使用runuser如果需要 PAM 会话(也来自util-linux)

runuser -u USER [--] COMMAND [ARGUMENTS...]

来自su手册页:

主要是为非特权用户设计的,对于特权用户(例如root执行的脚本)推荐的解决方案是使用non-set-user-ID命令运行用户(1)不需要身份验证并提供单独的 PAM 配置。如果根本不需要 PAM 会话,那么推荐的解决方案是使用命令设置权限(1)

答案4

关于什么:

sudo -Eu <user> <command>

您在之前的评论中抱怨了环境,因此您还可以比较输出之间的差异:

sudo -u <user> printenv
sudo -Eu <user> printenv

相关内容