잘못된 쉘이 있는 사용자 계정을 사용하여 데몬을 어떻게 실행할 수 있습니까?

잘못된 쉘이 있는 사용자 계정을 사용하여 데몬을 어떻게 실행할 수 있습니까?

나는 이 질문에 대한 답을 찾기 위해 인터넷 검색을 하고 init 스크립트를 정신적으로 분석하여 그것이 어디서 완료되었는지 찾으려고 노력했지만 소용이 없었습니다.

ps방금 임의의 예를 만들었습니다 . 다음과 같은 프로세스가 있습니다.

polkitd 1230 1 0 May07 ? 00:00:00 /usr/lib/polkit-1/polkitd --no-debug

내 /etc/passwd를 보면 다음이 표시됩니다.

polkitd:x:87:87:PolicyKit daemon owner:/var/lib/polkit:/bin/false

테스트로 루트로 명령을 실행했습니다. # su - polkitd -c whoami 예상대로 /bin/false가 셸로 사용되었기 때문에 출력이 반환되지 않았습니다. 또한 # su - polkitd나를 polkitd로 전환하지 않습니다. 이 작업이 올바르게 수행되었는지 확인하기 위해 일반 사용자 계정을 사용하여 두 가지 방법을 모두 테스트했는데 둘 다 예상대로 작동했습니다.

그렇다면 수동으로 아무것도 실행할 수 없는 것처럼 보일 때 프로세스를 실행하기 위해 전용 계정(예: 내 예의 polkitd)을 어떻게 얻습니까?

답변1

root이는 polkitd적절한 시스템 호출을 통해 수행될 수 있습니다.seteuid(2)증명할 수 있다

$ cat becomepolkit.c 
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    // ID obtained via `id polkitd` on a Centos7 system
    // other systems may vary
    seteuid(999);

    printf("look for %d in process list\n", getpid());

    sleep(99999);

    return 0;
}
$ make becomepolkit
cc     becomepolkit.c   -o becomepolkit
$ sudo ./becomepolkit &
[1] 10914
$ look for 10915 in process list

$ ps auwwx | grep '1091[5]'
polkitd  10915  0.0  0.0   4160   340 pts/0    S    22:46   0:00 ./becomepolkit
$ 

일반적으로 rootinit 시스템(예 systemd: ) 을 통해 cron프로세스를 시작한 root다음 해당 프로세스의 사용자를 변경합니다. 이를 위해 쉘 액세스가 필요하지 않습니다. strace프로세스를 실행하거나 다른 추적 도구를 사용하여 프로세스에서 진행 중인 작업을 관찰 할 수 있습니다 .

sudo strace -o blah ./becomepolkit
look for 10968 in process list
^C$ grep 999 blah
setresuid(-1, 999, -1)                  = 0
nanosleep({99999, 0}, {99997, 670178798}) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
$ 

그래서 여기서 Linux는 실제로setresuid(2)polkitd호출되었지만 동일한 차이점이 있는 프로세스는 프로세스 테이블에 표시됩니다 .

답변2

사용자의 로그인 쉘은 사용자가 인증될 때(보통 사용자 이름과 비밀번호를 입력하여) 대부분의 로그인 프로그램이 호출하는 프로그램입니다. 로그인 절차에는 login(텍스트 콘솔 로그인의 경우), sshd(네트워크를 통한 로그인의 경우), su(다른 계정에서 로그인의 경우) 등이 포함됩니다.

로그인 프로그램은 원하는 것은 무엇이든 실행하도록 선택할 수 있습니다. 대부분이 사용자의 로그인 셸을 실행한다는 사실은 기술적인 제한이라기보다는 관리상의 결정입니다. 이 규칙을 따르지 않는 로그인 프로그램 클래스 중 하나는 디스플레이 관리자, 즉 그래픽 모드에서 사용자를 로그인하는 프로그램입니다. 이러한 프로그램은 일반적으로 다음 /bin/sh과 같은 작업을 수행합니다 /etc/X11/Xsession.

시스템 서비스는 일반적으로 로그인 프로그램에 의해 전혀 호출되지 않습니다. 관리자 권한으로 실행되는 데몬 실행 프로그램에 의해 자동으로 호출됩니다. 시스템 서비스를 시작하는 데 인증이 필요하지 않습니다. (사용자의 경우필요하다시스템 서비스를 시작하려면 일반적으로 루트가 되려면 인증이 필요합니다. ) 따라서 로그인 쉘은 전혀 포함되지 않으므로 포함할 이유가 없습니다.

데몬 런처(이 답변에 사용하는 용어)에는 다음이 포함됩니다.체계,시작-중지-데몬,사용자 실행, 등.

관련 정보