2009-12-28 6 views
9

프로세스의 특권을 높이기 위해 sudo 프론트 엔드 (gksudo와 같은)를 사용할 수 있습니까? 나는 다음을 수행 할 수 있습니다 알고현재 프로세스를 어떻게 sudo합니까?

sudo cat /etc/passwd- 

그러나 나는이 일에 관심이 있어요 : 나는 파이썬에서 쓰고 있어요

sudo-become-root # magic function/command 
cat /etc/passwd- 

. 내 유스 케이스는 사용자로 실행되는 프로그램이 있지만 루트 소유의 파일을 읽고 쓸 수 있습니다. 나는 패스워드를 물어보고, 루트 권한을 얻고, 내가 원하는 것을하고, 선택적으로 권한을 다시 떨어 뜨리고 싶다.

나는 관리자 논리와 비 관리자 논리를 분리 된 프로세스로 분리 할 수 ​​있고 루트 (일부 통신 - policykit/dbus는 여기에 적합 함)로 관리 프로세스를 실행할 수 있음을 알고있다. 그러나 나는 훨씬 더 단순한 (그러나 더 위험한 것은 사실이지만) 해결책을 기대하고 있었다.

나는 sudo를 통해 Solaris의 ppriv를 실행하여 현재 프로세스의 권한을 수정하는 것과 같은 것을 생각하고 있습니다. 어느 해키 -하지만 실행 가능한 왕복처럼 보인다. 하지만 내가 아는 한, 리눅스는 ppriv를 제공하지 않는다.

(I이 이미 명확하지 않다 놀랍군요, 그것은하려는하지 않은 드문 것 같아 새로운 프로세스의 에스컬레이션을 통해 공정 중 에스컬레이션을 허용하는 보안 구멍으로 보이지 않습니다 .)

+0

sudo가 도움이된다면 su는 어떻게됩니까? – Dani

+0

AFAIK, su는 작업 할 서브 쉘을 제공 할 것입니다. 대화식으로 사용하는 것이 좋습니다. 하지만 쉘 하위 프로세스가 아닌 현재 실행중인 프로세스의 권한을 높이고 싶습니다. –

+0

이것은 실제로 대답이 아니지만 OpenSSH 소스 코드를 권한 조작 및 분리 모델로보고 싶습니다. 그러나 귀하의 cae와는 달리, 나는 ssh 데몬이 높은 권한으로 시작하여 하위 권한이있는 아이들을 선택적으로 포크하는 것으로 생각합니다. –

답변

1

불행히도, 나는 당신이 깔끔하게하고 싶은 일을하는 방법을 모르고 있습니다. 최선의 방법은 프로그램을 setuid (또는 sudo로 실행) 한 다음 더러운 작업을하고 권한을 삭제하거나 fork()하고 한 프로세스에서 권한을 삭제하고 다른 하나는 루트 작업을 수행하는 것입니다. .

당신이 찾고있는 것은 setuid (2)/setreuid (2)/setregid (2)/setgroups (2) 호출이지만 모두 중간 호출 권한을 얻을 수 없도록 유선 연결되어 있습니다. 내가 아는 한 그들을 사용하여 권한을 "포기할"수 있습니다.

+0

Yar, 그럴 것 같습니다. 아 ~. 권한으로 무언가를 다시 호출 할 수있는 것보다 중간 호출을 권한을 얻는 것이 왜 더 나쁜지에 대한 좋은 이유가 있다고 생각합니다. 내가 원하는 것을하는 또 다른 방법을 찾을 것입니다. 모두에게 감사드립니다! –

0

귀하의 마법 기능/명령이 될 수

sudo su 
+0

또는 아마도'sudo $ SHELL' –

+0

대화 형으로 처리하는 것이 좋겠지 만 프로그래밍 방식으로이 작업을 수행해야합니다. –

0
echo 'echo tee; echo hee'|sudo -s 

출력은 다음과 같습니다

,
tee 
hee 
2

프로그램 내에서 관리 권한을 깔끔하게 처리하려면 프로그램을 실행하려는 OS에 따라 sudo가 아닌 PolicyKit을 사용해야 할 수 있습니다.

Python 용 PolicyKit에 대해서는 python-slip을 참조하십시오.

그렇지 않으면 루트가 될 수는 sudo를 호출하는 두 가지 방법이 있습니다 :

sudo -s 

하는 당신에게 루트를 확인하고 (sudo su에 해당)

sudo -i 

당신에게 루트를 만들 것입니다 현재 환경을 유지합니다가와 루트 환경을 제공하십시오 (sudo su -과 동일)

문제를 해결하는 또 다른 방법은 필요한 권한을 부여하고, 프로그램의 사용자가 (sudo/setuid/unix 그룹/다른 것을 사용하여) 프로그램에 권한을 부여하는 방법을 선택할 수있게합니다.

같은 제목의 this question on ServerFault도 참조하십시오.

+0

맞아요,하지만 그건 피하려고하는 admin 코드와 non-admin 코드를 분리해야합니다. –

+4

마이클, 그 분리는 그 자체로 매우 중요합니다. – u0b34a0f6ae

+1

나는 그것이 좋다는 것에 동의합니다. 하지만 지금은 최소한으로 침략하려고 노력 중이며 별거없이 할 수 있다면 궁금합니다. –

2

적성은 "뿌리가됩니다"옵션이 있습니다. 저자가 한 일을 볼 수도 있습니다.

+7

흥미 롭습니다. 외관상으로는 sudo로 재시작됩니다. 그들이 더 나은 해결책을 가지고 있지 않다는 사실은 하나도 없다는 것을 시사합니다. –

0

권한이 낮은 프로세스에서 임의의 명령을 루트 권한으로 실행할 수 있다는 생각이 맘에 안 들어요. 그러나 원하는대로 생각할 수있는 아이디어 중 하나는 허용하려는 명령 만 실행할 수있는 setuidrestricted shell을 유지하는 것입니다. subprocess.Popen 함수를 사용하여 상승 된 권한으로 실행하는이 제한된 쉘을 사용하여 명령을 실행할 수 있습니다. ,

시스템에 다른 그룹을 추가 루트 프로그램과 스크립트를 설치하고의 sudoers 파일이 스크립트가이 그룹에 의해 실행될 수있는 라인을 포함 :이 작업을 할 경우

+0

나는 루트로서 '다른 프로세스를 실행'하는 것을 피하려고하고있다. 현재 프로세스를 루트로 실행하려고했습니다. –

0

이 궁금하다. 마지막으로 스크립트를 실행해야하는 계정 목록에 그룹을 추가하십시오.

그런 다음 스크립트는 루트 또는 시작시 계정 암호를 제공 한 후 그룹 세트에 특수 그룹이있는 계정으로 만 실행할 수 있습니다.

다른 옵션은 Sudo Manual을 참조하십시오.

+1

하지만 질문은 수퍼 유저가되어야합니다 .-) –

0

PAM으로 인증하려고합니다. example here이 있습니다.

+0

만약 당신이 이미 루트라면 (또는 CAP_SETUID를 가지고 있지만 특별한 왜곡을 겪지 않는 한 정상적인 앱은 그럴 수 없습니다) UID를 변경할 수 있습니다. – ephemient

+0

아, PAM의 승인을 받아 일종의 권한을 얻는 예를 보았습니다.나는 루트가 그들 중 하나가 아닌 것 같아요. 나는이 대답을 다른 사람들에게 알려줄 것이다. – LiraNuna