이 서비스에는 systemd
다음과 같은 속성이 있습니다 PIDFile
.
PIDFile=/home/john/.pm2/pm2.pid
파일이 이 디렉터리에 있을 것으로 예상할 수 있습니다 /run
. 아쉽게도 그런 상태여서 직접 변경할 수는 없습니다(하지만 난 노력하고 있어).
그래서 서비스를 시작하면 이런 오류가 발생합니다.
SELinux is preventing systemd from read access on the file pm2.pid.
(제가 생각하는) 관련 정보는 다음과 같습니다.
Source Context system_u:system_r:init_t:s0
Target Context system_u:object_r:user_home_t:s0
으로 대상 컨텍스트를 업데이트하고 싶습니다 chcon
. 세 번째 비트(일명 유형)를 업데이트해야 할 것 같은데 무엇을 설정해야 할지 모르겠습니다.
오류가 사라지도록 PID 파일의 보안 컨텍스트를 어떻게 변경합니까?
답변1
새로운 SELinux 규칙이 필요하지 않은 다른 옵션을 추가하세요.
systemd
시작된 파일을 편집 pm2
하고 PIDFile 의 대체 위치를 지정합니다 pm2
. 두 가지 변경 사항을 적용해야 합니다. 하나는 pm2
PIDFile을 저장할 위치를 지정하고 다른 하나는 PIDFile systemd
을 찾을 위치를 지정하는 것입니다. 기존 PIDFile 줄을 다음 두 줄로 바꿉니다.
Environment=PM2_PID_FILE_PATH=/run/pm2.pid
PIDFile=/run/pm2.pid
새 SELinux 규칙을 추가할 수 있는 권한이 있으면 systemd
이 파일을 편집할 수 있는 권한도 있어야 합니다.
답변2
아직 파악하지 못한 이유로 SELinux는 차단 pm2
하지만 올바르게 기록하지 않습니다(모든 로그를 표시하도록 구성을 변경한 후에도). 따라서 audit2allow
.
반나절을 보낸 후 마침내 내 솔루션은 pm2
원하는 사용자로 실행되는 사용자 정의 .sh를 만든 다음 해당 .sh를 실행하는 서비스를 만드는 것이었습니다.
다음 작업은 루트 사용자로 완료됩니다.
- 디렉터리 생성
mkdir /usr/bin/pm2-startup
nano pm2-startup.sh
다음 내용으로 스크립트 파일을 만듭니다.#!/bin/bash runuser -l [insert desired username here] -c 'pm2 resurrect'
nano /etc/systemd/system/pm2.service
다음 내용으로 서비스 파일을 만듭니다.[Unit] Description=Resurrect PM2 as [desired username] After=network.target [Service] Type=simple ExecStart=/usr/bin/pm2-startup/pm2_startup.sh TimeoutStartSec=0 [Install] WantedBy=default.target
- 시스템 다시 로드
systemctl daemon-reload
- 새로 생성된 서비스를 활성화합니다.
systemctl enable pm2.service
- 서비스 시작
systemctl start pm2
- 서비스가 시작되었는지 확인한
systemctl status pm2
다음 다시 시작하여 pm2가 다시 활성화되었는지 확인하세요.systemctl reboot
- 다시 시작한 후
pm2 list
사용중인 사용자로 실행하고 응용 프로그램이 실행되고 있는지 확인하십시오.
서비스가 시작된 후 상태를 확인하면 inactive
실제로는 단일 스크립트를 실행한 다음 완료되는 서비스이기 때문이라고 말합니다.
답변3
규칙을 추가하면 됩니다. 서비스를 시작하려고 시도한 후 루트로 이 명령을 실행해야 합니다(이로 인해 시간 초과가 발생함).
ausearch -c 'systemd' --raw | audit2allow -M my-systemd
semodule -i my-systemd.pp
이제 모든 것이 괜찮아 보입니다. 다시 시작하면 서비스가 정상적으로 시작됩니다.
이 해결 방법은 새 규칙이 파일에 정의된 것처럼 나타나므로 일시적으로만 작동할 수 있습니다 /tmp/my-systemd.te
. 내용은 다음과 같습니다(실제로 관심 있는 정책이 포함된 것 같습니다).
module my-systemd 1.0;
require {
type init_t;
type user_home_t;
class file { open read };
}
#============= init_t ==============
#!!!! This avc is allowed in the current policy
allow init_t user_home_t:file read;
allow init_t user_home_t:file open;