programing

스크립트 사용자에게 루트와 같은 권한이 있는지 확인하는 가장 좋은 방법은 무엇입니까?

nasanasas 2020. 11. 24. 08:04
반응형

스크립트 사용자에게 루트와 같은 권한이 있는지 확인하는 가장 좋은 방법은 무엇입니까?


/ etc에서 파일 이동, apt-get으로 설치 등과 같이 루트 수준 권한이 필요한 많은 작업을 수행 할 Python 스크립트가 있습니다. 나는 현재 :

if os.geteuid() != 0:
    exit("You need to have root privileges to run this script.\nPlease try again, this time using 'sudo'. Exiting.")

이것이 수표를 수행하는 가장 좋은 방법입니까? 다른 모범 사례가 있습니까?


"허가보다 용서를 구하기가 더 쉽다"원칙에 따라 :

try:
    os.rename('/etc/foo', '/etc/bar')
except IOError as e:
    if (e[0] == errno.EPERM):
       print >> sys.stderr, "You need root permissions to do this, laterz!"
       sys.exit(1)

당신이 당신의 비 이동성에 대해 염려 os.geteuid()한다면 아마도 /etc어차피 장난하지 말아야 할 것 입니다.


os.geteuid유효한 사용자 ID를 얻습니다. 정확히 원하는 것이므로 이러한 검사를 수행하는 더 좋은 방법을 생각할 수 없습니다. 불확실한 한 가지는 제목의 "루트와 유사 함"입니다. 귀하의 코드는 그것에 대해 정확히 root , "좋아요"가 없는지 확인 하며 실제로 "루트와 유사하지만 루트가 아님"이 무엇을 의미하는지 알 수 없습니다. , "정확히 뿌리"가 아닌 다른 것을 의미한다면, 아마도 분명히 할 수 있습니다. 감사합니다!


사용자에게 sudo 액세스를 요구할 수 있습니다.

import os, subprocess

def prompt_sudo():
    ret = 0
    if os.geteuid() != 0:
        msg = "[sudo] password for %u:"
        ret = subprocess.check_call("sudo -v -p '%s'" % msg, shell=True)
    return ret

if prompt_sudo() != 0:
    # the user wasn't authenticated as a sudoer, exit?

sudo -v스위치 업데이트는 사용자의 캐시 된 자격 증명 (참조 man sudo).


다양한 Linux 구성에서 코드를 강력하게 유지하려면 누군가가 SELinux, 파일 시스템 ACL 또는 Linux 커널에있는 "기능"기능을 사용하는 경우를 고려하는 것이 좋습니다. v. 2.2 정도부터. 귀하의 과정과 같은, SELinux를 사용하고있다 일부 래퍼, 또는 리눅스 기능 라이브러리에서 실행 될 수 libcap2의 libcap-ng를 , 또는 fscaps 또는 elfcap 닐스 프로 보스 '멋진 슬프게에서-평가와 같은 이국적인 무언가를 통해 은 Systrace의 시스템입니다.

이 모든 방법은 코드가 비 루트로 실행될 수 있지만 프로세스가 EUID == 0없이 작업을 수행하는 데 필요한 액세스 권한을 위임 받았을 수 있습니다.

따라서 예외 처리 코드와 관련된 권한 또는 기타 문제로 인해 실패 할 수있는 작업을 래핑하여 코드를 Python 방식으로 작성하는 것을 고려하는 것이 좋습니다. 다양한 작업 (예 : subprocess모듈 사용)을 수행하기 위해 외출하는 경우 이러한 모든 호출에 접두사를 지정할 수 있습니다 (예 : sudo명령 줄, 환경 또는 .rc 파일 옵션). 대화 형으로 실행되는 경우 다음을 사용하여 권한 관련 예외를 발생시키는 명령을 다시 실행하도록 제안 할 수 있습니다 sudo(선택적으로 sudoos.environ [ 'PATH']에서 찾은 경우에만 해당 ).

전반적으로 대부분의 Linux 및 UNIX 시스템은 여전히 ​​'루트'권한이있는 사용자가 대부분의 관리를 수행합니다. 그러나 그것은 구식이며 프로그래머로서 우리는 새로운 모델을 지원하려고 노력해야합니다. 작업을 시도하고 예외 처리가 작업을 수행하도록하면 필요한 작업을 투명하게 허용하는 모든 시스템에서 코드가 작동 할 수 있으며이를 인식하고 사용할 준비가되어 sudo있는 것은 좋은 터치입니다 (지금까지 가장 널리 퍼진 제어 된 시스템 권한 위임 도구).


질문의 두 번째 부분에 대한 답변

(댓글 상자가 너무 작아서 죄송합니다)

Paul Hoffman, 맞습니다. 저는 intrinsics를 다루는 질문의 한 부분 만 다루었지만 처리 할 수 ​​없다면 가치있는 스크립팅 언어가 아닐 것 apt-get입니다. 선호하는 라이브러리는 다소 장황하지만 작업을 수행합니다.

>>> apt_get = ['/usr/bin/apt-get', 'install', 'python']
>>> p = subprocess.Popen(apt_get, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> p.wait()
100                 # Houston, we have a problem.
>>> p.stderr.read()
'E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)'
'E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?\n'

그러나 Popen일반화 된 도구이며 편의를 위해 래핑 할 수 있습니다.

$ cat apt.py
import errno
import subprocess

def get_install(package):
    cmd = '/usr/bin/apt-get install'.split()
    cmd.append(package)
    output_kw = {'stdout': subprocess.PIPE, 'stderr': subprocess.PIPE}
    p = subprocess.Popen(cmd, **output_kw)
    status = p.wait()
    error = p.stderr.read().lower()
    if status and 'permission denied' in error:
        raise OSError(errno.EACCES, 'Permission denied running apt-get')
    # other conditions here as you require
$ python
>>> import apt
>>> apt.get_install('python')
Traceback ...
OSError: [Errno 13] Permission denied running apt-get

이제 예외 처리로 돌아갑니다. 나는 서브 프로세스 모듈의 자바와 같은 과도한 일반성에 대해서는 언급하지 않겠다.


환경 변수에서 sudo를 확인하고 싶습니다.

os.environ.keys ()에서 'SUDO_UID'가 아닌 경우 :
  print "이 프로그램에는 수퍼 유저 권한이 필요합니다."
  sys.exit (1)

내 앱은 다음 코드로 작동합니다.

import os
user = os.getenv("SUDO_USER")
if user is None:
    print "This program need 'sudo'"
    exit()

Linux의 경우 :

def is_root():
    return os.geteuid() == 0

그것은 모두 당신이 원하는 앱의 이식성에 달려 있습니다. 비즈니스를 의미하는 경우 관리자 계정이 항상 0이 아니라고 가정해야합니다. 이는 euid 0을 확인하는 것으로 충분하지 않다는 것을 의미합니다. 문제는 하나의 명령이 마치 루트 인 것처럼 작동하고 다음은 권한이 거부되어 실패하는 상황이 있다는 것입니다 (SELinux & co를 생각해보십시오). 따라서 적절할 때마다 정상적으로 실패하고 EPERM errno를 확인하는 것이 정말 좋습니다.

참고 URL : https://stackoverflow.com/questions/2806897/what-is-the-best-way-for-checking-if-the-user-of-a-script-has-root-like-privileg

반응형