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가 혼자 일할 때 업데이트 할 것입니다.
답변
내가 사용 runit 의 chpst
이 같은 작업 도구를. 예를 들어, 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
방법에 의해.
추가 자료
- Jonathan de Boyne Pollard (2014). 사용자 권한 삭제에 대해 su를 남용하지 마십시오 . 자주 답변.
답변
특권을 삭제하고 다른 스크립트를 실행하는 스크립트 (그러나 여기서는 스스로 실행하도록 만들었습니다) :
#!/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
또는 setpriv
PAM 세션이 (모두에서 필요하지 않은 경우 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) 명령을 사용하는 것이 좋습니다 .