sudo는 정확히 어떻게 작동하나요? [복사]

sudo는 정확히 어떻게 작동하나요? [복사]

나는 항상 "sudo"가 다른 로그인 프로세스를 시작했다고 생각했습니다. 특히 "root"를 사용자 이름으로 사용하고 로그인하려면 비밀번호를 요구했습니다. 프로그램을 실행한 후 종료하고 로그아웃합니다(또는 세션을 잠시 동안 열어두었다가 종료합니다). 어디서 그런 말을 들었는지는 모르겠지만 제 생각엔 그럴싸해 보입니다.

하지만 이제 이 sudoers 옵션을 찾았습니다.

ALL    ALL = (root) NOPASSWD: /my/command

이를 통해 모든 사용자에 대해 루트로 모든 프로그램을 실행할 수 있습니다.아니요비밀번호를 물어보세요. 이것이 나를 궁금하게 만든다:

어떻게 작동하나요? 프로그램은 어떻게 사용자 권한을 얻나요? sudo는 서버(데몬 등으로 루트로 실행)를 가져와 해당 서버에 연결하고 실행해야 할 내용을 보낸 다음 서버가 루트 권한으로 이를 실행합니까?

다른 사용자는 어떻습니까?

이것이 어떻게 작동하는지에 대한 훌륭하고 간단한 설명이 있습니까?

답변1

sudo다음 출력에서 ​​볼 수 있듯이 소위 "SetUID 바이너리"입니다 ls -l.

$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 159016 Mar 21 20:40 /usr/bin/sudo

s네 번째 열(일반적으로 실행 x파일을 찾는 위치)에는 SetUID 비트가 설정되었음을 나타냅니다. 이 비트는 중요한 의미를 갖습니다. SetUID 비트가 설정된 바이너리가 실행되면 호출 사용자의 사용자 ID로 실행되지 않고 바이너리 소유자(이 경우 root)의 사용자 ID로 실행됩니다.

그것이 단서입니다. sudo항상 슈퍼유저 권한(예 root: )으로 실행하십시오. 따라서 sudo허용된 시스템 기능만 호출하는 등 일부 권한 있는 작업을 수행할 수 있습니다 root. 이러한 시스템 호출 중 가장 중요한 것은 setuid(2)and Friends입니다. setuid()프로세스를 호출하면 다음을 수행할 수 있습니다.변화UID를 원하는 UID로 변경합니다(따라서 다른 사용자로 가장).

이것이 하는 일은 sudo:

  • /etc/sudoers호출하는 사용자와 해당 권한을 찾기 위해 읽고 구문 분석합니다 .
  • 호출 사용자의 비밀번호를 묻습니다(일반적으로 사용자의 비밀번호이지만 대상 사용자의 비밀번호이거나 다음과 같이 건너뛸 수도 있음 NOPASSWD).
  • setuid()대상 사용자에 대한 변경이 호출되는 하위 프로세스를 만듭니다.
  • 셸 또는 이 하위 프로세스에서 인수로 제공된 명령을 실행합니다.

답변2

간단한 대답은 바이너리 suid의 플래그 입니다 sudo.

ls -l /usr/bin/sudo
---s--x--x. 1 root root 130712 02-26 13:31 /usr/bin/sudo

실행 파일의 플래그를 사용하면 루트 또는 루트가 아닌 사람을 실행하는 사람에 관계없이 suid바이너리가 시스템 호출을 실행할 수 있습니다 .setuid()

나머지는 개별 바이너리의 지침과 구성에 따라 다릅니다. 의 경우 sudo구성 파일(일반적으로 /etc/sudoers)을 구문 분석하여 업그레이드를 진행할지 여부를 결정합니다.

일부 파일에서는 타임스탬프 정보가 루트 사용자로 제한됩니다. 샘플 서버의 다음 예는 업그레이드가 sudo타임스탬프 정보를 제공할 수 있는 방법을 보여줍니다.

[artur@asus-ux21e ~]$ sudo ls -l /var/db/sudo/artur
total 12
-rw-------. 1 root artur 48 04-24 14:07 0
-rw-------. 1 root artur 48 04-24 11:27 1
-rw-------. 1 root artur 48 04-24 11:26 2

관련 정보