나는 항상 "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