SELinux: 읽기 권한을 부여하는 방법은 무엇입니까?

SELinux: 읽기 권한을 부여하는 방법은 무엇입니까?

이 서비스에는 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. 두 가지 변경 사항을 적용해야 합니다. 하나는 pm2PIDFile을 저장할 위치를 지정하고 다른 하나는 PIDFile systemd을 찾을 위치를 지정하는 것입니다. 기존 PIDFile 줄을 다음 두 줄로 바꿉니다.

Environment=PM2_PID_FILE_PATH=/run/pm2.pid
PIDFile=/run/pm2.pid

새 SELinux 규칙을 추가할 수 있는 권한이 있으면 systemd이 파일을 편집할 수 있는 권한도 있어야 합니다.

답변2

아직 파악하지 못한 이유로 SELinux는 차단 pm2하지만 올바르게 기록하지 않습니다(모든 로그를 표시하도록 구성을 변경한 후에도). 따라서 audit2allow.

반나절을 보낸 후 마침내 내 솔루션은 pm2원하는 사용자로 실행되는 사용자 정의 .sh를 만든 다음 해당 .sh를 실행하는 서비스를 만드는 것이었습니다.

다음 작업은 루트 사용자로 완료됩니다.

  1. 디렉터리 생성mkdir /usr/bin/pm2-startup
  2. nano pm2-startup.sh다음 내용으로 스크립트 파일을 만듭니다.
    #!/bin/bash
    runuser -l [insert desired username here] -c 'pm2 resurrect'
    
  3. 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
    
  4. 시스템 다시 로드systemctl daemon-reload
  5. 새로 생성된 서비스를 활성화합니다.systemctl enable pm2.service
  6. 서비스 시작systemctl start pm2
  7. 서비스가 시작되었는지 확인한 systemctl status pm2다음 다시 시작하여 pm2가 다시 활성화되었는지 확인하세요.systemctl reboot
  8. 다시 시작한 후 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;

관련 정보