web-dev-qa-db-ja.com

シェルスクリプトでroot権限を削除するにはどうすればよいですか?

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を単独で動作させるようになったら、更新します。

14
mirimir

このようなタスクには runitchpstツールを使用します。たとえば、アップスクリプトから非特権スクリプトを呼び出します。

chpst -u nobody /path/to/script
7
Nikola Kotur

RunitとSudoのみをカバーすることは、多くのことを逃します。実際にはrunitのようなツールセットのファミリー全体があり、これを正確に実行するためのツールの幅広い選択肢、つまりツールが設計されたまさにそのタスクがあります。

  • ダニエルJ.バーンスタインのデーモンツールには setuidgid
    setuidgidユーザー/home/user/unprivileged.sh
  • Adam Sampsonのfreedtにはsetuidgid:があります。
    setuidgidユーザー/home/user/unprivileged.sh
  • Bruce Guenterのdaemontools-encoreには setuidgid :があります
    setuidgidユーザー/home/user/unprivileged.sh
  • Gerrit Papeのrunitには chpst :があります
    chpst -u user /home/user/unprivileged.sh
  • ウェインマーシャルのperpには runuid :があります。
    runuidユーザー/home/user/unprivileged.sh
  • Laurent Bercotのs6には s6-setuidgid
    s6-setuidgidユーザー/home/user/unprivileged.sh
  • 私のnoshは setuidgid :を持っています
    setuidgidユーザー/home/user/unprivileged.sh

adding特権のdifferentタスクに混在しない対話モードに陥ることはありません。

ちなみに、あなたの取り掛かっている問題は、sbinだけでなくbinPATHに含めるのを忘れているだけです。

参考文献

11
JdeBP

特権を削除して他のスクリプトを実行するスクリプト(ただし、ここでは私はそれ自体を実行するようにしました):

#!/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)
3
yaroslaff

何について:

Sudo -Eu <user> <command>

以前のコメントで環境について不満を述べたので、出力間の違いを比較することもできます。

Sudo -u <user> printenv
Sudo -Eu <user> printenv
1
thiagowfx

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) を使用することをお勧めします。

1
dcoles