OpenVPNの「--up」オプションは通常、ルーティングなどに使用されます。そのため、OpenVPNがroot権限をドロップしてnobodyとして実行する前に処理されます。ただし、権限のないユーザーとして実行する必要があるシェルスクリプトを呼び出しています。
それ、どうやったら出来るの?私は Drop Process Privileges 、特に多項式とタイラーの答えを研究しましたが、実装方法がわかりません。 Centos 6.5で作業していますが、 "chmod u + s"と "setuid()"の両方でsuidがブロックされています。
OpenVPNプラグイン(「openvpn-down-root.so」)があり、「-down」オプションによって呼び出されたスクリプトをrootとして実行できます。 「openvpn-up-user.so」のような同等のものがあるかもしれませんが、私はそれを見つけていません。
Edit0
Nikola Koturの答えに従って、私は Ian Meyerのrunit-rpm をインストールしました。 chpstコマンドはターミナルで機能しますが、アップスクリプトでは「コマンドが見つかりません」で失敗します。機能するのは、「Sudo chpst」に加えて、適切な表示と言語を設定することです。参照してください なぜ私の端末はユニコード文字を適切に出力しないのですか? それを考えると、upスクリプトは次の4行を必要とします:
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 &
Edit1
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 &
私は男のsudoersを研究し、私がSudoを単独で動作させるようになったら、更新します。
このようなタスクには runit のchpst
ツールを使用します。たとえば、アップスクリプトから非特権スクリプトを呼び出します。
chpst -u nobody /path/to/script
RunitとSudoのみをカバーすることは、多くのことを逃します。実際にはrunitのようなツールセットのファミリー全体があり、これを正確に実行するためのツールの幅広い選択肢、つまりツールが設計されたまさにそのタスクがあります。
setuidgid
:setuidgidユーザー/home/user/unprivileged.sh
setuidgid
:があります。setuidgidユーザー/home/user/unprivileged.sh
setuidgid
:がありますsetuidgidユーザー/home/user/unprivileged.sh
chpst
:がありますchpst -u user /home/user/unprivileged.sh
runuid
:があります。runuidユーザー/home/user/unprivileged.sh
s6-setuidgid
:s6-setuidgidユーザー/home/user/unprivileged.sh
setuidgid
:を持っていますsetuidgidユーザー/home/user/unprivileged.sh
adding特権のdifferentタスクに混在しない対話モードに陥ることはありません。
ちなみに、あなたの取り掛かっている問題は、sbin
だけでなくbin
をPATH
に含めるのを忘れているだけです。
特権を削除して他のスクリプトを実行するスクリプト(ただし、ここでは私はそれ自体を実行するようにしました):
#!/bin/sh
id=`id -u`
safeuser="nobody"
if [ $id = "0" ]
then
# we're root. dangerous!
Sudo -u $safeuser $0
else
echo "I'm not root"
id
fi
例:
root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)
何について:
Sudo -Eu <user> <command>
以前のコメントで環境について不満を述べたので、出力間の違いを比較することもできます。
Sudo -u <user> printenv
Sudo -Eu <user> printenv
Linuxでは、PAMセッションが必要ない場合は runuser
または setpriv
を使用できます(両方ともutil-linux
):
runuser -u USER [--] COMMAND [ARGUMENTS...]
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)
su
manページから:
suは主に非特権ユーザー向けに設計されており、特権ユーザー(例:rootによって実行されるスクリプト)の推奨ソリューションは、非set-user-IDコマンドを使用することです runuser(1) 認証を必要とせず、個別のPAM構成を提供します。 PAMセッションがまったく必要ない場合は、コマンド setpriv(1) を使用することをお勧めします。