나는 이미 실제 사용자 ID를 알고 있습니다. 시스템에서 사용자의 고유 번호입니다.
내 시스템에서 My uid
is
$ 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의 용도입니다.
access
. 그것은 그것의 99.9 %입니다. 또한 setfsuid
(하지만 거의 필요하지 않음), 일부 매우 낮은 수준의 기능, 우선 순위 또는 스케줄러를 가져 오거나 설정하기 위해 실제 사용자 ID가 필요합니다 (확인되지 않음) wait
. 있는 실제 ID는. execve
확인하지 않지만 실제 사용자 ID를 변경하면 실패 할 수 있습니다 . 또한 fork
확인하지 않지만 실제 UID의 최대 프로세스 할당량에 도달하면 실패 할 수 있습니다. Google with site:man7.org
는 여기에 당신의 친구입니다.
ping
필요 합니다. 모든 사용자는 (보통) 소켓을 열고 1024 이상으로 청취 할 수 있습니다.
몇 가지 예를 들어 단계별로 설명하겠습니다.
짧은 배경
각 프로세스는 같은 속성이 포함되어 자신의 '프로세스 자격 증명'이 PID
1, 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
권한있는 계정으로 다시 전환합니다.