프로세스가 특정 그룹으로 실행될 때 Linux 권한은 어떻게 작동합니까?


12

이것은 내가 많은 정보를 찾을 수 없었으므로 도움을 주시면 감사하겠습니다.

내 이해는 따라서입니다. 다음 파일을 가져 가십시오.

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

사용자 phil는이 파일에 액세스 할 수 없습니다 :

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

이 그룹에 phil추가 adm되면 다음을 수행 할 수 있습니다.

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

경우, 그러나, 프로세스를 명시 적으로 설정하면서 시작 user:groupphil:phil파일을 읽을 수 없습니다 그것. 프로세스는 다음과 같이 시작되었습니다.

nice -n 19 chroot --userspec phil:phil / sh -c "process"

프로세스가로 시작 phil:adm되면 파일을 읽을 수 있습니다.

nice -n 19 chroot --userspec phil:adm / sh -c "process"

따라서 문제는 실제로 다음과 같습니다.

프로세스가 해당 사용자의 보충 그룹이 소유 한 파일에 액세스 할 수 없도록하는 특정 사용자 / 그룹 콤보로 프로세스를 실행하는 데있어 특별한 점은 무엇입니까?


쉘은 이와 관련이 없습니다. 쉘은 권한을 처리하지 않습니다. 새로운 쉘을 작성하여 루트를 얻을 수있는 경우.
ctrl-alt-delor

답변:


9

프로세스는 UID와 함께 실행됩니다. 모두 권한이 할당되어 있습니다. 사용자 및 그룹의 userspec을 사용하여 chroot를 호출 할 수 있습니다. 여기서 사용자는 실제로 해당 그룹에 없습니다. 그런 다음 사용자 uid 및 지정된 그룹 gid로 프로세스가 실행됩니다.

예를 참조하십시오. 이라는 사용자 user가 있고 그룹에 있습니다 student.

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

다음과 같은 파일이 있습니다.

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

그는 그것을 읽을 수 없습니다 :

user@host:~$ cat file
cat: file: Permission denied 

이제 cat사용자 user와 그룹 의 맥락 에서 프로세스를 실행할 수 있습니다 root. 이제 cat 프로세스에 필요한 권한이 있습니다.

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

뭐라고 말하는지 흥미 롭습니다 id.

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

흠,하지만 사용자 user가 해당 그룹에 없습니다 ( root). id정보를 어디서 얻습니까? 인수없이 id호출하면 시스템 호출 getuid(), getgid()및을 사용 getgroups()합니다. 따라서 프로세스 컨텍스트 id자체가 인쇄됩니다. 우리가 변경 한 맥락 --userspec.

인수와 함께 호출되면 id사용자의 그룹 할당 만 결정합니다.

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)

귀하의 질문에 :

프로세스가 해당 사용자의 보충 그룹이 소유 한 파일에 액세스 할 수 없도록하는 특정 사용자 / 그룹 콤보로 프로세스를 실행하는 데있어 특별한 점은 무엇입니까?

프로세스가 수행해야하는 모든 작업을 해결하는 데 필요한 보안 프로세스 컨텍스트를 설정할 수 있습니다. 모든 프로세스에는 그가 실행하는 UID와 GID가 있습니다. 일반적으로 프로세스는 호출 사용자 uid 및 gid를 컨텍스트로 "취합니다". "테이크 (takes)"는 커널이하는 것을 의미합니다. 그렇지 않으면 보안 문제가됩니다.

따라서 실제로는 사용자가 아니며 파일을 읽을 권한이 없으며 프로세스 권한 ( cat)입니다. 그러나 프로세스는 호출하는 사용자의 uid / gid로 실행됩니다.

따라서 프로세스를 uid 및 해당 그룹의 그룹과 함께 실행하기 위해 특정 그룹에 있지 않아도됩니다.


2
프로세스에는 일반적으로 기본 그룹의 자격 증명 만 있습니다. EUID를 호출 하면 보조 그룹의 자격 증명에 액세스 할 수 있습니다 initgroups(3). 그러나 initgroups(3)모든 그룹을 열거해야하기 때문에 비교적 비싼 작업입니다. 이러한 이유로 프로세스 initgroups(3)는 특정 이유가있는 경우 에만 호출 합니다.
lcd047

6

사용 --userspec에 대한 옵션 chroot을 실행할 때 지정 사용자와 하나의 그룹은 사용합니다 chroot. 보충 그룹을 정의하려면 --groups옵션도 사용해야합니다 .

기본적으로 프로세스를 실행하는 사용자의 기본 및 보조 그룹을 상속하지만 사용하여 --userspec당신에게있는 거 이야기를 chmod하나의 그룹을 사용하여 지정된 것을 오버라이드 (override) 할 수 있습니다.

Linux 사용 권한에 대한 자세한 설명서는 credentials(7)맨 페이지 에서 제공됩니다 .


2

Linux에 로그인하면 phil 로 로그인 할 수 있는지 확인한 후 로그인 프로세스 ¹ 는 phil의 uid와 그 그룹이 속한 프로세스를 쉘로 시작하는 프로세스로 설정합니다. UID, GID 및 보조 그룹은 프로세스의 속성입니다.

그 이후에 시작된 이후의 프로그램은 해당 셸의 자손이며 단순히 해당 자격 증명의 복사본을받습니다. * 이것은 사용자의 권한을 변경해도 실행중인 프로세스에 영향을 미치지 않는 이유를 설명합니다. 그러나 다음에 로그인하면 변경 사항이 적용됩니다.

* setuid 또는 setgid 비트가 설정된 프로그램은 예외이며 유효 사용자 ID 가 다릅니다 . 예를 들어 su (1)에서 사용 되므로에 root의해 실행될 때도 권한으로 실행될 수 있습니다 phil.

추가 한 후 phil받는 adm그룹, 그는 실행할 수 su philsu루트 레벨 그는 실제로 필 암호를 제공하는지 확인하고 필이 속한 GID UID 및 보조 단체와 쉘로 그를 땅으로 -running됩니다. 그리고 이것은 사용자를 그룹에 추가 한 후에 이루어 지므로 해당 셸은 이미 adm그룹에 있습니다.

다른 사용자로 실행 하기에 가장 적합한 chroot (1) 프로그램을 고려하지는 않지만 확실히 작업을 완료합니다. 이 매개 변수 --userspec phil:phil는의 uid phil와 gid와 함께 실행됩니다 phil. 제공 할 추가 그룹이 설정되지 않았습니다 --groups. 따라서 어린이 프로세스는 adm그룹에 없습니다 .

필처럼 프로세스를 실행하는보다 일반적인 방법은 다음과 같습니다 su phil -c "process". 로 su로드 UID, 사용자 데이터베이스 정보와 GID 및 보충 그룹은 process사용자가 현재 가지고있는 동일한 자격 증명을해야합니다.

¹ login (1) , sshd, su, gdb 또는 기타 프로그램 일 수 있습니다. 또한 pam 모듈을 통해 관리되고있을 것입니다.

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