sudo는 내부적으로 어떻게 작동하나요?

sudo는 내부적으로 어떻게 작동하나요?

내부적으로는 어떻게 작동하나요 sudo? 루트와 달리 루트 비밀번호 없이 루트가 될 수 있는 방법은 무엇입니까 su? 이 프로세스에는 어떤 시스템 호출 등이 포함됩니까? 이것은 Linux의 큰 보안 허점이 아닌가(예를 들어 sudo, 일반적인 작업만 수행 sudo하지만 권한이 없는 사용자의 비밀번호를 묻지 않는 대규모 패치 버전을 왜 컴파일할 수 없습니까 ?)

내가 읽고로그인 및 su 내부 구조. 나도 읽었다sudo는 어떻게 사용되나요?하지만 제목에도 불구하고 주로 su와 의 차이점을 다루고 있습니다 sudo.

답변1

실행 파일을 보면 다음과 같습니다 sudo.

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

권한 비트가 있음을 알 수 있습니다 ---s--x--x. 이는 다음과 같이 분류될 수 있습니다.

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

따라서 프로그램에 setuid 비트(SUID라고도 함)가 활성화되어 있으면 누군가 프로그램을 실행할 때 파일을 소유한 사용자의 자격 증명을 사용하여 실행된다는 의미입니다. 이 상황에 뿌리를 내리십시오.

사용자 saml로 다음 명령을 실행하는 경우:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

sudo이것이 실제로 루트로 실행되고 있음 을 알 수 있습니다 .

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

setuid 메커니즘

SUID가 어떻게 작동하는지 궁금하다면 확인해 보세요 man setuid. 다음은 저보다 더 잘 설명하는 매뉴얼 페이지에서 발췌한 내용입니다.

setuid()는 호출 프로세스의 유효 사용자 ID를 설정합니다. 호출자의 유효 UID가 루트인 경우 실제 UID와 저장된 set-user-ID도 설정됩니다. Linux에서 setuid()는 _POSIX_SAVED_IDS 기능을 사용하여 POSIX 버전과 유사하게 구현됩니다. 이를 통해 설정된 사용자 ID(루트 제외) 프로그램은 모든 사용자 권한을 포기하고 특권이 없는 일부 작업을 수행한 다음 원래 유효 사용자 ID를 안전한 방식으로 재사용할 수 있습니다.

사용자가 루트이거나 프로그램이 set-user-ID-root인 경우 특별한 주의가 필요합니다. setuid() 함수는 호출자의 유효 사용자 ID를 확인하여 슈퍼유저인 경우 모든 프로세스 관련 사용자 ID를 uid로 설정한다. 이 일이 발생한 후에는 프로그램이 루트 권한을 다시 얻는 것이 불가능해집니다.

여기서 핵심 개념은 프로그램에 실제 사용자 ID(UID)와 유효 사용자 ID(EUID)가 있다는 것입니다. 이 비트가 활성화되면 Setuid는 유효 사용자 ID(EUID)를 설정합니다.

따라서 커널의 관점에서 볼 때 이 예에서는 saml여전히 원래 소유자(UID)이지만 EUID가 실행 파일의 소유자로 설정되었습니다.

설정

또한 sudo 명령의 권한을 분석할 때 두 번째 비트 세트가 그룹 권한에 사용된다는 점도 언급해야 합니다. 그룹 비트에는 set group id(setgid, SGID라고도 함)라는 setuid와 유사한 항목도 있습니다. 이는 소유자 자격 증명 대신 그룹 자격 증명을 사용하여 프로세스를 실행한다는 점을 제외하면 SUID와 동일한 작업을 수행합니다.

인용하다

답변2

실제 sudo바이너리는setuid 루트, 그리고 이와 같은 파일을 존재하게 설정할 수는 없습니다.

setuid 및 setgid(각각 "실행 시 사용자 ID 설정" 및 실행 시 그룹 ID 설정"의 약어) [1]은 사용자가 각각 실행 파일 소유자 또는 그룹의 권한으로 실행 파일을 실행할 수 있도록 허용하는 Unix 액세스 권한 플래그입니다. . , 디렉토리의 동작을 변경합니다.

답변3

아무도 건드리지 않은 것 같은 시스템 호출에 대한 부분에 답하기 위해 중요한 시스템 호출 중 하나가 setresuid() 또는 setresgid()입니다. 나는 다른 것들이 있다고 확신하지만 이 두 가지는 매우 setuid/sudo에 특정한 것 같습니다.

관련 정보