[unix] 쉘 스크립트에서 루트 권한을 어떻게 삭제합니까?

OpenVPN의 “–up”옵션은 일반적으로 라우팅 등에 사용됩니다. 따라서 OpenVPN이 루트 권한을 삭제하여 아무도 실행하지 않기 전에 처리됩니다. 그러나 권한이없는 사용자로 실행 해야하는 쉘 스크립트를 호출하고 있습니다.

어떻게해야합니까? 나는 공부 드롭 프로세스 권한 , 특히 다항식의 및 tylerl의 대답을하지만, 내가 구현하는 방법을 이해하지 않습니다. Centos 6.5에서 작업 중이며 “chmod u + s”및 “setuid ()”로 suid가 차단되었습니다.

“–down”옵션으로 호출 된 스크립트를 루트로 실행할 수있는 OpenVPN 플러그인 ( “openvpn-down-root.so”)이 있습니다. “openvpn-up-user.so”와 같은 해당 항목이있을 수 있지만 찾지 못했습니다.

편집 0

Nikola Kotur의 답변에 따라 Ian Meyer의 runit-rpm을 설치했습니다 . chpst 명령은 터미널에서 작동하지만 up 스크립트에서는 “command not found”로 실패합니다. 작동하는 것은 “sudo chpst”와 적절한 디스플레이 및 언어 설정입니다. 터미널이 유니 코드 문자를 올바르게 출력하지 않는 이유를 참조하십시오 . 이를 감안하면 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 &

나는 남자 sudoers를 공부하고 sudo가 혼자 일할 때 업데이트 할 것입니다.



답변

내가 사용 runitchpst이 같은 작업 도구를. 예를 들어, up 스크립트에서 권한이없는 스크립트를 호출하십시오.

chpst -u nobody /path/to/script


답변

runit과 sudo만을 다루는 것은 그리워요. 실제로 runit과 같은 툴셋이 있으며,이를 위해 설계된 툴은 바로 다음과 같습니다.

  • Daniel J. Bernstein의 데몬 툴은 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 사용자 /home/user/unprivileged.sh
  • Wayne Marshall의 perp는 runuid다음과 같습니다.

    runuid 사용자 /home/user/unprivileged.sh
  • Laurent Bercot의 s6에는 s6-setuidgid다음 이 있습니다 .

    s6-setuidgid 사용자 /home/user/unprivileged.sh
  • 내 귀신은 setuidgid:

    setuidgid 사용자 /home/user/unprivileged.sh

권한 을 추가 하는 서로 다른 작업을 혼용하지 않으며 대화식 모드에 빠지지 않습니다.

귀하의 압정으로 고정-에 문제가 좀 더 망각이 가진 것보다 있습니다 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


답변

리눅스에서 당신은 사용할 수 있습니다 runuser또는 setprivPAM 세션이 (모두에서 필요하지 않은 경우 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매뉴얼 페이지

su 는 대부분 권한이없는 사용자를 위해 설계되었으며 권한이있는 사용자 (예 : root에 의해 실행되는 스크립트)에 권장되는 솔루션 은 인증이 필요하지 않고 별도의 PAM 구성을 제공하는 set-user-ID 명령 runuser (1) 를 사용하는 것입니다. PAM 세션이 전혀 필요하지 않으면 setpriv (1) 명령을 사용하는 것이 좋습니다 .


답변