Shell-Script

如何在 shell 腳本中刪除 root 權限?

  • June 10, 2021

OpenVPN 中的“–up”選項通常用於路由等。因此在 OpenVPN 放棄 root 權限以無人身份執行之前對其進行處理。但是,我正在呼叫需要以非特權使用者身份執行的 shell 腳本。

我怎麼做?我研究了Drop Process Privileges,尤其是多項式和 tylerl 的答案,但我不明白如何實現。我在 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。

我使用runitchpst工具來完成這樣的任務。例如,從 up 腳本呼叫您的非特權腳本:

chpst -u nobody /path/to/script

僅涵蓋 runit 和 sudo 錯過了很多。實際上有一整套工具集,如 runit,以及用於執行此操作的多種工具,它們的設計目的是:

  • Daniel J. Bernstein 的 daemontools 有setuidgid
setuidgid*使用者*/home/*使用者*/unprivileged.sh
  • util-linux(預設安裝在較新的 Debian 上)具有setpriv
setpriv --reuid= *user* --regid= *group* --init-groups --inh-caps=-all /home/ *user* /unprivileged.sh
  • 亞當桑普森的 freedt 有setuidgid
setuidgid*使用者*/home/*使用者*/unprivileged.sh
  • Bruce Guenter 的 daemontools-encore 有setuidgid
setuidgid*使用者*/home/*使用者*/unprivileged.sh
  • Gerrit Pape 的 runit 有chpst
chpst -u*使用者*/home/*使用者*/unprivileged.sh
  • 韋恩·馬歇爾的 perp 有runuid
runuid*使用者*/home/*使用者*/unprivileged.sh
s6-setuidgid*使用者*/home/*使用者*/unprivileged.sh
setuidgid*使用者*/home/*使用者*/unprivileged.sh

它們不會混合添加特權的**不同任務,也不會陷入互動模式。

順便說一句,您附加的問題只不過是您忘記擁有sbin以及bin在您PATH的 .

進一步閱讀

引用自:https://unix.stackexchange.com/questions/132663