sudo의 내부는 어떻게 작동합니까?


74

sudo내부적으로 어떻게 작동합니까? 어떻게 루트 암호없이 루트가 될 수 su있습니까? 이 프로세스에는 어떤 시스템 콜 등이 포함됩니까? 리눅스에서 벌어진 보안 구멍이 아닌 (예 이유는 크게 패치 컴파일 할 수없는 sudo단지 무엇이든 정기했다는 것을 sudo않았지만, 권한이없는 사용자의 암호를 물어 보지 않았다)를?

나는 login과 su internals를 읽었다 . 또한 sudo는 어떻게 사용되어야합니까?를 읽었습니다 . 하지만 제목에도 불구하고, 그들은 주로의 차이점을 처리 su하고 sudo.

답변:


80

실행 파일을 보면 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 버전과 같이 구현됩니다. 이렇게하면 set-user-ID (root 이외의) 프로그램이 모든 사용자 권한을 삭제하고 권한이없는 일부 작업을 수행 한 다음 원래의 유효한 사용자 ID를 안전한 방식으로 다시 사용할 수 있습니다.

사용자가 root이거나 프로그램이 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와 동일합니다.

참고 문헌


4
쓸모없는 사용이기 때문에 sudo -s대신 사용해야합니다 . :)sudo susu
Totor

4

실제 sudo바이너리는 setuid root 이며, 이런 식으로 설정된 파일 만 존재할 수는 없습니다.

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


그래, 내 질문의 일부에 대답합니다. sudo가이 비트를 사용하는 방법과이 비트가하는 일에 대해 좀 더 자세히 설명하고
싶다면

2

아무도 손대지 않은 것 같은 syscall에 대한 부분에 대답하기 위해 중요한 syscall 중 하나는 setresuid () 또는 setresgid ()입니다. 나는 다른 것들이 있다고 확신하지만,이 2는 setuid / sudo에 매우 특이한 것처럼 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.