mod_wsgi에 대한 문서를 읽으면서 작업자 프로세스가 실행될 그룹을 선택할 수 있다는 것을 알았습니다.
파일의 그룹 소유권과 해당 그룹에 속한 사용자만 해당 파일에 대한 그룹 권한을 얻을 수 있는 방법을 이해할 수 있지만 이것이 실행 중인 프로세스에 어떻게 적용되는지는 이해하지 못합니다.
그렇다면 프로세스 GID는 무엇이며 어떤 용도로 사용됩니까?
답변1
이는 실제로 Unix 프로세스의 구성 요소에 따라 다릅니다. 프로세스는 두 가지 방법 중 하나로 구성될 수 있습니다. 이 함수를 통해 또는 C의 함수 fork()
중 하나를 통해.exec()
fork()
fork()
기본적으로 현재 프로세스를 복제하고 새 프로세스 ID(PID)를 할당합니다. 원래 프로세스의 하위 프로세스입니다. 다음 출력에서 이 관계를 볼 수 있습니다 ps
.
$ ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1 5255 1964 1964 ? -1 Sl 500 0:39 gnome-terminal
5255 5259 1964 1964 ? -1 S 500 0:00 \_ gnome-pty-helper
5255 18422 18422 18422 pts/1 18422 Ss+ 500 0:01 \_ bash
5255 30473 30473 30473 pts/4 30473 Ss+ 500 0:00 \_ bash
30473 782 782 30473 pts/4 30473 Sl 500 1:14 | \_ evince s.pdf
gnome-terminal
여기서는 이것이 상위 프로세스(PID = 5255)이고 bash
하위 프로세스(PID = 18422, PPID = 5255) 임을 알 수 있습니다 .
노트:PPID = 상위 프로세스 ID.
프로세스가 상위 프로세스에서 분기되면 상위 프로세스가 현재 가지고 있는 열려 있는 파일에 대한 모든 파일 설명자 복사본과 상위 프로세스의 사용자 및 그룹 ID와 같은 특정 항목을 "상속"합니다.
노트:마지막 두 가지는 파일 시스템에 액세스할 때 프로세스가 갖게 될 파일 및 그룹 권한을 결정하는 것입니다.
그렇다면 프로세스가 상위 프로세스로부터 사용자 및 그룹 ID를 상속받는다면 루트나 단일 사용자가 모든 것을 소유하지 않는 이유는 무엇일까요? 이것이 들어오는 곳입니다 exec()
.
exec()
1 부
특히 이 exec()
기능 계열은 execve()
현재 프로세스 이미지를 새로운 프로세스 이미지로 "대체"합니다. "프로세스 이미지"라는 용어는 실제로는 디스크의 실행 파일인 파일일 뿐입니다. 이것이 bash 스크립트가 하는 일입니다 /usr/bin/time
.
사용자 ID와 그룹 ID는 어떻습니까? 먼저 '페르소나'의 개념을 알아보겠습니다.
페르소나
언제든지 각 프로세스에는 유효 사용자 ID, 유효 그룹 ID 및 보충 그룹 ID 세트가 있습니다. 이러한 ID는 프로세스의 권한을 결정합니다. 이들을 통칭하여프로세스의 역할, "누구"가 액세스 제어 목적인지 결정하기 때문입니다.
exec()
2 부
따라서 "프로세스 이미지"를 교체할 수 있을 뿐만 아니라 exec()
사용자 및 그룹 ID를 원래 "실제" ID에서 "유효한" ID로 변경할 수도 있습니다.
한 가지 예
이 데모에서는 기본 UID/GID로 셸에서 시작한 다음 보충 GID 중 하나를 사용하여 하위 셸을 생성하여 하위 셸에 유효한 GID로 만들 때 어떤 일이 발생하는지 보여 드리겠습니다.
이를 위해 나는 유닉스 명령을 사용할 것이다 newgrp
. newgrp
새 셸을 생성하고 이를 유효한 GID로 원하는 보조 그룹에 전달할 수 있습니다.
초보자의 경우:
$ id -a
uid=500(saml) gid=501(saml) groups=501(saml),502(vboxusers),503(jupiter)
이 셸이 현재 기본 UID/GID saml
& 로 구성되어 있음을 알 수 있습니다 saml
. 일부 파일을 터치하면 다음과 같은 경우도 있음을 알 수 있습니다.
$ touch afile1
$ touch afile2
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile2
jupiter
이제 보충 그룹을 유효한 GID로 만듭니다 .
$ newgrp jupiter
$ id -a
uid=500(saml) gid=503(jupiter) groups=501(saml),502(vboxusers),503(jupiter)
이제 일부 파일을 터치하면 다음과 같습니다.
$ touch afile3
$ touch afile4
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile2
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile3
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile4
쉘의 유효 GID는 jupiter
이므로 디스크와의 상호 작용으로 인해 jupiter
일반 기본 그룹 대신 파일이 생성됩니다 saml
.
인용하다
답변2
사용자는 파일에 액세스하지 않습니다. 단지 입력하고 이동하고 마우스를 클릭하기만 하면 됩니다. 프로세스만 파일에 액세스할 수 있습니다. 사용자는 프로세스를 시작하고 프로세스는 사용자(기본 및 보조 그룹 포함)와 관련된 권한을 갖습니다.
답변3
프로세스의 권한은 프로세스의 속성을 기반으로 합니다. 이는 /etc/passwd
합계 항목을 직접적으로 기반으로 하지 않습니다 /etc/group
. 이 파일은 사용자가 로그인한 경우에만 읽혀지며 세션 초기화 프로세스가 실행되는 uid 및 gid를 결정합니다. 동일한 세션의 후속 프로세스(이 초기 프로세스의 하위 프로세스 또는 일반적으로 하위 프로세스)는 이러한 uid 및 gid를 상속합니다(예외setuid/setgid프로그램).
대부분의 경우 프로세스의 GID는 프로세스가 액세스할 수 있는 파일을 결정합니다. 프로세스의 uid가 파일의 소유자인 경우 소유자 권한이 적용됩니다. 그렇지 않으면 프로세스의 gid(유효 또는 보충) 중 하나가 파일의 그룹 소유자인 경우 그룹 권한이 적용되고 그렇지 않으면 "기타" 권한이 적용됩니다.