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)。您必须进行两项更改,一项是告诉pm2在哪里放置 PIDFile,另一项是告诉systemd在哪里查找它。将现有的 PIDFile 行替换为以下两行

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

如果您有权添加新的 SELinux 规则,您systemd也应该有权编辑该文件。

答案2

由于我还没有弄清楚的原因,SELinux 正在阻塞,pm2但没有正确记录它(即使更改配置以显示所有日志),所以我没有任何东西可以通过管道传输到audit2allow.

花了半天时间,我的解决方案是最终创建一个pm2以我所需的用户身份运行的自定义 .sh,然后创建一个服务来运行该 .sh。

以下操作是作为 root 用户完成的。

  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

添加规则就可以了。尝试启动服务(这会导致超时)后,我必须以 root 身份运行这些命令

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;

相关内容