如何在 shell 腳本中刪除 root 權限?
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。
我使用runit的
chpst
工具來完成這樣的任務。例如,從 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
- Laurent Bercot 的 s6 有
s6-setuidgid
:s6-setuidgid*使用者*/home/*使用者*/unprivileged.sh
- 我的小吃有
setuidgid
:setuidgid*使用者*/home/*使用者*/unprivileged.sh
它們不會混合添加特權的**不同任務,也不會陷入互動模式。
順便說一句,您附加的問題只不過是您忘記擁有
sbin
以及bin
在您PATH
的 .進一步閱讀
- 喬納森·德博因·波拉德 (2014)。不要濫用 su 刪除使用者權限。經常給出答案。