[linux] Unix / Linux : 실제 사용자 ID, 유효 사용자 ID 및 저장된 사용자 ID의 차이점

나는 이미 실제 사용자 ID를 알고 있습니다. 시스템에서 사용자의 고유 번호입니다.

내 시스템에서 My uidis

$ echo $UID
1014
$

다른 두 ID의 약자는 무엇입니까? 유효 사용자 ID저장된 사용자 ID
의 사용은 무엇이며 시스템에서 사용하는 위치는 무엇입니까?



답변

실제 사용자 ID와 유효 사용자 ID를 구분하는 이유는 다른 사용자의 ID를 일시적으로 가져와야 할 수도 있기 때문입니다 (대부분의 경우 root이지만 모든 사용자 일 수 있음). 당신은 단지 하나 개의 사용자 ID를 가지고 있다면, 나중에 원래의 사용자 ID로 다시 변경하는 방법이 없을 것 (당연한 말씀을 복용 이외의, 그리고 경우에 당신은 root사용하여 root모든 사용자에게 변화의 권한을).

따라서 실제 사용자 ID는 귀하가 실제로 누구인지 (프로세스를 소유 한 사람)이고 유효 사용자 ID는 운영 체제가 어떤 작업을 수행 할 수 있는지 여부를 결정하기 위해 보는 것입니다 (대부분의 경우 , 몇 가지 예외가 있습니다).

로그인 할 때 로그인 쉘은 실제 사용자 ID와 유효 사용자 ID를 암호 파일에서 제공 한 것과 동일한 값 (실제 사용자 ID)으로 설정합니다.

지금, 또한 당신이이 setuid 프로그램을 실행하는 것이 발생하고, 다른 사용자로 실행 외에 (예를 들어 root)이이 setuid 프로그램이됩니다 또한 귀하를 대신 뭔가를 할 예정. 어떻게 작동합니까?
setuid 프로그램을 실행하면 실제 ID (프로세스 소유자이므로)와 파일 소유자의 유효 사용자 ID (예 root: setuid)를 갖게됩니다.

이 프로그램은 수퍼 유저 권한으로 필요한 모든 마법을 수행 한 다음 사용자를 대신하여 무언가를 수행하려고합니다. 즉, 할 수없는 일을하려는 시도 는 실패해야합니다 . 어떻게하나요? 글쎄, 분명히 유효한 사용자 ID를 실제 사용자 ID로 변경하면됩니다!

이제 setuid 프로그램은 커널이 아는 모든 것이 당신의 ID이고 … 당신의 ID 이기 때문에 다시 전환 할 방법이 없습니다 . 뱅, 넌 죽었어.

이것은 저장된 사용자 설정 ID의 용도입니다.


답변

몇 가지 예를 들어 단계별로 설명하겠습니다.

짧은 배경

각 프로세스는 같은 속성이 포함되어 자신의 ‘프로세스 자격 증명’이 PID1, PPID, PGID, session ID또한 실제와 유효 사용자와 그룹 ID를 :
RUID, EUID, RGID, EGID.

우리는 그것에 초점을 맞출 것입니다.

1 부 : UID 및 GID 이해

이제 내 자격 증명으로 셸에 로그인하고 다음을 실행합니다.

$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash

내 로그 이름 (rotem), UIDGID ( 둘 다 1000) 및 로그인 한 셸과 같은 기타 세부 정보를 볼 수 있습니다.

2 부 : RUID 및 RGID 이해

모든 프로세스에는 소유자가 있으며 그룹에 속합니다 .
쉘에서 지금 실행할 모든 프로세스는 내 사용자 계정의 권한을 상속하고 동일한 UID 및 GID로 실행됩니다.

간단한 명령을 실행하여 확인할 수 있습니다.

$ sleep 10 & ps aux | grep 'sleep'

그리고 프로세스 UID 및 GID를 확인하십시오.

$ stat -c "%u %g" /proc/$pid/
1000 1000

이들은 프로세스실제 사용자 ID ( RUID)와 실제 그룹 ID ( RGID)입니다 .

(*)를 확인 UID를와 GID 볼 수있는 다른 옵션의 한 줄이 얻을 수있는 방법을 .

지금은 사실 동의 EUIDEGID속성이 ‘중복’입니다을 그냥 같음 RUIDRGID무대 뒤에서.

3 부 : EUID 및 EGID 이해

의가 보자 ping예를 들어 명령을 사용합니다.

which명령으로 바이너리 위치를 검색 한 다음 다음을 실행합니다 ls -la.

-rwsr-xr-x  1 root root   64424 Mar 10  2017  ping

파일의 소유자와 그룹이 root입니다. 이는 ping명령이 소켓을 열어야하고 Linux 커널이 이에 대한 root권한을 요구 하기 때문입니다.

하지만 권한 ping이없는 경우 어떻게 사용할 수 root있습니까?
통지 의 ‘ 파일 권한의 소유자 부분에 대신’X ‘의 편지.
이것은 setuid 로 알려진 특정 바이너리 실행 파일 ( ping및 등 sudo)에 대한 특수 권한 비트입니다 .

이것은 어디 EUIDEGID놀이로 제공됩니다.
하면 어떻게됩니까 것은 이 setuid 바이너리처럼 ping이 실행, 프로세스의 유효 사용자 ID (변경 EUID기본에서)을 RUID이 경우에이 특별한 바이너리 실행 파일의 소유자로 –root .
이것은 모두이 파일에 setuid비트 가 있다는 단순한 사실에 의해 수행됩니다 .

커널은 프로세스를 살펴봄으로써이 프로세스에 권한이 있는지 여부를 결정합니다 EUID. 이제를 EUID가리 키기 때문에 root커널에서 작업을 거부하지 않습니다.

주의 : 최신 Linux 릴리스에서는 이 setuid 접근 방식 대신 Linux Capabilities 접근 방식 ping을 채택했기 때문에 명령 출력이 다르게 보일 입니다.

파트 4 : SUID 및 SGID는 어떻습니까?

저장된 사용자 ID ( SUID)는 권한이있는 프로세스가 실행 중이고 ( root예 🙂 권한이없는 작업을 수행해야 할 때 사용됩니다 .

이 경우 EUID이전 의 유효 UID ( )가 내부에 저장 SUID되고 권한이없는 작업으로 변경됩니다. 권한없는 작업이 완료되면 EUID의 값에서 가져 와서 SUID권한있는 계정으로 다시 전환합니다.


답변