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


14

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가 혼자 일할 때 업데이트 할 것입니다.


@ user66229 님이 남긴 설명 : " sourceforge.net/p/openvpn/mailman으로 이동하여 가장 적합한 목록을 구독하십시오."
slm

감사합니다. 그러나 이것이 OpenVPN 관련 질문이라고 생각하지 않습니다. 왜 그렇게 생각하십니까?
mirimir

답변:


7

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

chpst -u nobody /path/to/script

쿨 :) 감사합니다. 가 github.com/imeyer/runit-rpm이 를 CentOS 6.5에 runit 얻을 수있는 가장 좋은 방법은? Red Hat repos를 사용하더라도 패키지를 찾지 못했습니다.
mirimir

@ mirimir, 예, CentOS 용 runit 패키지를 빌드해야 할 때 해당 리포지를 사용합니다.
Nikola Kotur 2016 년

11

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방법에 의해.

추가 자료


3

특권을 삭제하고 다른 스크립트를 실행하는 스크립트 (그러나 여기서는 스스로 실행하도록 만들었습니다) :

#!/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 -u user"를 사용하면 일부 명령에서 작동하지만 내 목적에 충분한 사용자 환경을 제공하지는 않습니다. "su -l user"는 터미널에서 제대로 작동하지만 스크립트에서는 아무 것도 수행하지 않습니다. 이것이 보안 기능이라고 생각합니다. 그래서 runit을 설치해야 할 것 같습니다.
mirimir

1
@ mirimir : 왜? /etc/sudoers될 수 있습니다 매우 변수에 의해 프로그램 실행에 전달 될 수있는 환경을 특정 sudo등등. man sudoers. 솔직히, 누구든지 사용 sudo을 위해 단지 sudo su -또는 스위치의 사용자 컨텍스트로하는 것은이 멋진 프로그램 뒤에 당신은 개별 프로그램, 사용자, 호스트에 대한 일을 잠글 수 있습니다 얼마나 많은 일에 대해 단서가없는 등 ...
0xC0000022L

@ 0xC0000022L 감사합니다. 나는 sudo를 다시 보았다. 그리고 "sudo -u user"와 디스플레이 및 언어도 작동합니다.
mirimir 2018 년

1
위험하다고 말하면 믿을 수 없습니다 $0. 호출자는 $0문자 그대로 원하는대로 스크립트를 설정할 수 있습니다. 그리고 더 많은 따옴표를 사용하십시오.
찰스 더피

2
스크립트의이 경우 ... $0이다 /directory/name with spaces/script(그리고 그들이 경우에도 사용자가 자신이 소유 한 위치에 임의의 심볼릭 링크를 만들 수 있습니다, 기억 하지 않는 사용 exec -a somename yourscript전화 yourscript로모그래퍼 $0somename다음 얻을 것) sudo -u nobody /directory/name with spaces로, with그리고 spaces당신의 명령에 별도의 인수로 전달 .
찰스 더피

1

는 어때:

sudo -Eu <user> <command>

이전 의견에서 환경에 대해 불평 했으므로 출력 간의 차이점을 비교할 수도 있습니다.

sudo -u <user> printenv
sudo -Eu <user> printenv

1

리눅스에서 당신은 사용할 수 있습니다 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) 명령을 사용하는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.