나는 이미 실제 사용자 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), UID 및 GID ( 둘 다 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 볼 수있는 다른 옵션 과 의 한 줄이 얻을 수있는 방법을 .
지금은 사실 동의 EUID와 EGID속성이 ‘중복’입니다을 그냥 같음 RUID과 RGID무대 뒤에서.
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)에 대한 특수 권한 비트입니다 .
이것은 어디 EUID와 EGID놀이로 제공됩니다.
하면 어떻게됩니까 것은 이 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권한있는 계정으로 다시 전환합니다.
