CentOS systemd는 `user.slice`(`system.slice` 대신)에 `sudo`로 시작된 서비스 하위 프로세스를 배치합니다.

CentOS systemd는 `user.slice`(`system.slice` 대신)에 `sudo`로 시작된 서비스 하위 프로세스를 배치합니다.

systemd 서비스를 사용하여 생성된 하위 프로세스는 sudo에 배치됩니다 user.slice. 이 동작은 CentOS 8(x86_64 20230606)에서만 관찰되며 해당 하위 프로세스가 배치되는 Ubuntu 20.04.5 LTS에서는 관찰되지 않습니다 system.slice.

이는 주요 서비스 프로세스가 다른 cgroup에 있고 생성된 하위 프로세스가 sudo다른 cgroup에 있게 되므로 큰 문제입니다. 따라서 systemctl stop서비스를 호출하면 생성된 하위 프로세스가 아닌 기본 서비스 프로세스만 중지되므로 sudo결국 중단됩니다.

복사 단계:

  1. 루트가 아닌 사용자(권한 포함)로 sudo로그인합니다 .
$ ssh centos@{ADDR}
  1. script.sh다음 콘텐츠를 포함하는 bash 스크립트를 만듭니다.
#!/bin/bash
sudo sleep 1000
  1. 스크립트를 실행 가능하게 만듭니다.
$ chmod +x script.sh
  1. 스크립트를 시스템 서비스로 실행합니다.
$ sudo systemd-run ./script.sh
Running as unit: run-r16ed2fef94d442b5800035653bcbbe01.service
  1. 상태 확인:
$ sudo systemctl status run-rf4fe2865d42240c1a95f1ed497575494.service
● run-rf4fe2865d42240c1a95f1ed497575494.service - /home/centos/./script.sh
   Loaded: loaded (/run/systemd/transient/run-rf4fe2865d42240c1a95f1ed497575494.service; transient)
Transient: yes
   Active: active (running) since Wed 2023-11-15 10:01:49 UTC; 1min 1s ago
 Main PID: 10587 (script.sh)
    Tasks: 1 (limit: 97480)
   Memory: 1.7M
   CGroup: /system.slice/run-rf4fe2865d42240c1a95f1ed497575494.service
           └─10587 /bin/bash /home/centos/./script.sh

결과 cgroup에 하위 프로세스나 하위 프로세스가 모두 나열되지 않음을 확인할 수 있습니다 sudo. sleepPID 10587을 참고하세요.

  1. 수면 프로세스가 있는지 확인하십시오.
$ ps aux | grep sleep
root       10588  0.0  0.0 333172  8140 ?        S    10:01   0:00 sudo sleep 1000
root       10591  0.0  0.0 217092   848 ?        S    10:01   0:00 sleep 1000
centos     10687  0.0  0.0 221940  1164 pts/0    S+   10:03   0:00 grep --color=auto sleep

sudo생성된 systemd 프로세스를 중지해도 이 두 프로세스 sleep(각각 PID 10588 및 10591) 가 종료되지 않습니다 .

  1. 이러한 프로세스가 속한 시스템 슬라이스를 확인하십시오.
  • 기본 시스템 서비스 프로세스(10587, systemctl status위 참조):
$ cat /proc/10587/cgroup | grep name=
1:name=systemd:/system.slice/run-rf4fe2865d42240c1a95f1ed497575494.service
  • 하위 sudo프로세스(10588):
$ cat /proc/10588/cgroup | grep name=
1:name=systemd:/user.slice/user-0.slice/session-c37.scope
  • 하위 프로세스 sleep(10591)"
$ cat /proc/10591/cgroup | grep name=
1:name=systemd:/user.slice/user-0.slice/session-c37.scope

메인 스크립트 프로세스는 에 속해 있고 system.slice, 하위 프로세스는 에 속해 있음 을 알 수 있습니다 user.slice.

Ubuntu 20.04.5 LTS에서 똑같은 단계를 사용하면 모든 하위 프로세스가 다음 위치에 있는 동일한 cgroup에 배치됩니다 system.slice.

$ sudo systemd-run ./script.sh
Running as unit: run-r09332b0da31a4dd198286a87a917e55f.service
ubuntu@ip-10-0-0-92:~$ sudo systemctl status run-r09332b0da31a4dd198286a87a917e55f.service
● run-r09332b0da31a4dd198286a87a917e55f.service - /home/ubuntu/./script.sh
     Loaded: loaded (/run/systemd/transient/run-r09332b0da31a4dd198286a87a917e55f.service; transient)
  Transient: yes
     Active: active (running) since Wed 2023-11-15 10:06:55 UTC; 7s ago
   Main PID: 1729 (script.sh)
      Tasks: 3 (limit: 18627)
     Memory: 1.4M
     CGroup: /system.slice/run-r09332b0da31a4dd198286a87a917e55f.service
             ├─1729 /bin/bash /home/ubuntu/./script.sh
             ├─1730 sudo sleep 1000
             └─1731 sleep 1000

따라서 서비스를 중지하면 모든 하위 프로세스가 종료됩니다.

그렇다면 CentOS에서는 무슨 일이 벌어지고 있는 걸까요? systemd가 우분투에서와 동일하게 작동하도록 하려면 어떻게 해야 합니까? 하위 프로세스를 동일한 cgroup에 강제로 배치할 수 있습니까 system.slice?

CentOS에서 생성된 서비스의 systemd 매개변수를 확인해 보니 실제로 Ubuntu와 동일합니다. 특히 이 Slice매개변수는 다음과 같이 설정됩니다 system.slice.

$ sudo systemctl show run-rf4fe2865d42240c1a95f1ed497575494.service | grep Slice=
Slice=system.slice

답변1

Systemd 서비스 구성은 하위 프로세스 생성을 인계받지 않으며 하위 프로세스를 다른 곳으로 이동하지도 않습니다. 이는 sudo불필요하게 호출되는 PAM 구성 자체에 의해 수행 됩니다 pam_systemd(원하지 않는 결과를 얻기 위해 고의로 호출되거나 사람들이 루트로 GUI 응용 프로그램을 실행하려고 할 때 대상 사용자에 대해 XDG_RUNTIME_DIR을 설정하려고 하는 것일 수도 있습니다. 그렇지 않습니다. 모른다).

PAM 모듈은 systemd-logind 세션을 생성합니다. 이를 통해 logind는 호출 프로세스를 "세션" cgroup으로 이동하고 자체 쉘 프로세스는 sshd.service에서 이동하거나[이메일 보호됨]로그인할 때.

/etc/pam.d/sudo이 모듈을 비활성화하려면 편집하세요 . 그러나 다른 PAM 구성에서는 이를 비활성화하지 않도록 주의하십시오. 파일에 /etc/pam.d/system-auth(콘솔 및 SSH 로그인에도 사용됨)가 포함되어 있으면 대신 pam_systemd를 그대로 두어야 할 수도 있습니다. 삽입하다pam_succeed_ifPAM을 속여 건너뛰도록 합니다.

session [success=1 default=ignore] pam_succeed_if.so service = sudo
session whatever                   pam_systemd.so

(pam_succeed_if가 PAM_SUCCESS를 반환하는 경우 "success=1"은 다음 모듈 1개를 건너뛰고 "default=ignore"는 다른 모든 결과를 무시하게 합니다.)

관련 정보