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


104

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

내 시스템에서 My uidis

$ echo $UID
1014
$                 

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


참고 - 위키 백과 페이지에 설명 된대로, 또한 파일 시스템 사용자 ID가 : en.wikipedia.org/wiki/User_identifier
윌렘 반 Ketwich

나는 그가 언급하지 않은 것 같다.
RtmY

답변:


148

실제 사용자 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의 용도입니다.


6
저장된 세트 사용자 ID에 대한 마지막 요점에 대한 자세한 내용은 Wikipedia를
GDP2

대신 Real uid를 확인하는 시스템 호출을 찾을 수있는 몇 가지 판독 값을 알려 주시겠습니까? 감사합니다
mik1904

1
@ mik1904 : 실제 UID 를 실제로 확인 하는 데 사용하는 가장 중요한 것은 access. 그것은 그것의 99.9 %입니다. 또한 setfsuid(하지만 거의 필요하지 않음), 일부 매우 낮은 수준의 기능, 우선 순위 또는 스케줄러를 가져 오거나 설정하기 위해 실제 사용자 ID가 필요합니다 (확인되지 ​​않음) wait. 있는 실제 ID는. execve확인하지 않지만 실제 사용자 ID를 변경하면 실패 할 수 있습니다 . 또한 fork확인하지 않지만 실제 UID의 최대 프로세스 할당량에 도달하면 실패 할 수 있습니다. Google with site:man7.org는 여기에 당신의 친구입니다.
Damon

"ping 명령은 소켓을 열어야하며 Linux 커널은이를위한 루트 권한을 요구합니다." 이것은 정말 정확하지 않습니다. 원시 소켓이 ping필요 합니다. 모든 사용자는 (보통) 소켓을 열고 1024 이상으로 청취 할 수 있습니다.
Daniel Farrell

39

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

짧은 배경

각 프로세스는 같은 속성이 포함되어 자신의 '프로세스 자격 증명'이 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권한있는 계정으로 다시 전환합니다.



1
SUID의 마지막 매개 변수를 제외하고 명확한 대답. 특권 및 특권 태스크와 혼동되었습니다. 예가 제공된 경우 유용합니다. 감사.
Upendra

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