2011-09-23 3 views
4

일부 스크립트를 실행하기위한 플랫폼을 구축하려고합니다. 이 스크립트는 각 사용자의 홈 폴더에 있습니다. 에 의해os.setuid()를 사용하여 "작업을 허용하지 않음"[파이썬]

Traceback (most recent call last): 
    File "launcher.py", line XX, in <module> 

OSError: [Errno 1] Operation not permitted 

:이 예외를 발생

user_id = pwd.getpwnam(user)[ 3 ] 
user_home = pwd.getpwnam(user)[ 5 ] 

os.chdir(user_home) 
os.setuid(user_id) 

subprocess.Popen(shlex.split("user_script.py")) 

하지만, 파이썬 할려고는 os.setuid(user_id)을 할 때 모든 발사는이, 각 사용자에 대한 각 사용자 ID 그래서, 내가 뭘 함께 할 수 있어야 그런데이 스크립트를 시작한 사용자는 루트 그룹 (GNU/Linux OS)에 있으며 모든 루트 권한을가집니다.

내가 다른 오류 얻을 루트 사용자와 동일한 코드를 실행하려고하면 : 누군가가 나를 제발 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있다면 ...

OSError: [Errno 13] Permission denied 

+0

도움이 될 수 있습니다 : http://stackoverflow.com/questions/4692720/ –

답변

4

만 뿌리는 작업을 수행 할 수 있습니다 setuid, 루트 그룹에 속하면 충분하지 않습니다.

+0

루트 사용자 만'os.setuid'를 할 수 있지만,'root' 사용자를 사용하려고 시도한 경우에는 시스템의 나는이 코드를 "데몬 프로세스"에 추가해야한다고 생각한다. 이것이 문제 다. 나는 그것을'os.fork'하고 자식에서'os.setuid'와'subprocess.Popen'을하는 것으로 해결했습니다. – carlesh

2

수퍼 유저 만이 느낌이들 때마다 uid를 변경할 수 있습니다. 사용자를 루트 그룹에 추가하는 것만으로는 충분하지 않습니다. 예를 들어

setuid(2)는 언급 : 파이썬이 직접이를 구현하는 경우

Under Linux, setuid() is implemented like the POSIX version with the 
    _POSIX_SAVED_IDS feature. This allows a set-user-ID (other than root) 
    program to drop all of its user privileges, do some un-privileged work, and 
    then reengage the original effective user ID in a secure manner. 

내가 알지도 못하는, 그러나 당신이 어쨌든 원하는 것을 정확히 아니다 :

리눅스에
The setuid() system call is permitted if the specified ID is equal to the 
real user ID or the effective user ID of the process, or if the effective 
user ID is that of the super user. 

,이 또한있다.

간단한 대답은 다음과 같습니다. 루트로 초기 프로세스를 시작하십시오.

보안이 걱정된다면 루트 권한으로 하나, 권한이없는 사용자 권한으로 두 프로세스를 시작하고 권한이없는 프로세스가 소켓이있는 루트 프로세스와 통신하게하십시오. 이것은 더 고급 설정이지만 ...

+0

프로세스를 root (또는 uid 0)로 시작할 필요는 없으며 충분하게 권한이있는 사용자가 수행하게됩니다. 그러나, 사용자가'setuid'를 허용하면 그녀는 뿌리가 될 수 있으므로 사실상 똑같습니다. – phihag

0

OSError: [Errno 1] Operation not permitted은 스크립트를 시작한 사용자에게 충분한 권한이 없다는 것을 나타냅니다. 루트 그룹에 속하면 충분하지 않습니다. 실제로는 CAP_SETUID의 기능이 필요합니다.

OSError: [Errno 13] Permission denied은 아마도 관련이없는 오류입니다. stacktrace를 살펴 봐야합니다.

0

라인

subprocess.Popen(shlex.split("user_script.py")) 

는 매니 폴드 방식으로 나를 혼란.

  1. shlex.split()은 분할 할 것이 없으므로 중복되는 것처럼 보입니다.
  2. Popen()의 매개 변수를 목록에 넣는 것이 더 좋습니다.
  3. user_script.py에 실행 권한이없는 경우에도 루트 권한으로도 실행할 수 없습니다.
+0

'shlex.split'이 중복되는 것은 사실입니다. 상황의 예입니다. 실제 사례에서 "호출 프로세스"가 인수를 갖거나 갖지 않을지 알 수 없으므로, 제 의견으로는 'shlex.split'이 필요합니다. 당신의 대답과 당신의 인내심에 감사드립니다. – carlesh

0

또한 setuid 권한을 사용합니다.즉,

 chmod 4755 script.py 

평범한 사용자라도 프로그램을 실행해도 그 특정 용도로 전환됩니다. 권한 문제가 발생하지 않습니다.