如何为单个文件创建 SELinux 例外

如何为单个文件创建 SELinux 例外

我使用监控工具,在远程检查的一个系统上,它调用一个脚本,该脚本又运行 systemctl 来检查服务的状态。直到我将 SELinux 置于宽容模式之前,这才起作用。但是,我将无法让该系统处于宽容模式。我需要对异常使用 semanage 并将系统重新置于强制状态。我以前曾将 semanage 用于进程,但从未用于文件。我一直在查看手册页并进行谷歌搜索,但我似乎无法弄清楚我需要使用的确切命令。假设我需要在 /usr/lib64/application/plugin 文件夹中允许一个名为“run_this_script”的脚本,那么我将在 semanage 中使用的命令是什么?

编辑 - 只是为了提供更多关于我在审计日志中看到的内容的背景信息,这里是一个片段。

type=AVC msg=audit(1446051455.169:3313): avc:  denied  { execute }   for  pid=15388 comm="check_init_serv" name="systemctl" dev="dm-1"  ino=2101040 scontext=system_u:system_r:nrpe_t:s0  tcontext=system_u:object_r:systemd_systemctl_exec_t:s0 tclass=file
type=SYSCALL msg=audit(1446051455.169:3313): arch=c000003e  syscall=59 success=no exit=-13 a0=2098450 a1=209ba50 a2=209c680    a3=7fff573ff5b0 items=0 ppid=15386 pid=15388 auid=4294967295 uid=997    gid=995 euid=997 suid=997 fsuid=997 egid=995 sgid=995 fsgid=995 tty=   (none) ses=4294967295 comm="check_init_serv" exe="/usr/bin/bash"   subj=system_u:system_r:nrpe_t:s0 key=(null)

type=AVC msg=audit(1446051455.169:3314): avc:  denied  { getattr }   for  pid=15388 comm="check_init_serv" path="/usr/bin/systemctl"   dev="dm-1" ino=2101040 scontext=system_u:system_r:nrpe_t:s0    tcontext=system_u:object_r:systemd_systemctl_exec_t:s0 tclass=file
type=SYSCALL msg=audit(1446051455.169:3314): arch=c000003e     syscall=4 success=no exit=-13 a0=2098450 a1=7fff573ff780     a2=7fff573ff780 a3=7fff573ff5b0 items=0 ppid=15386 pid=15388     auid=4294967295 uid=997 gid=995 euid=997 suid=997 fsuid=997 egid=995     sgid=995 fsgid=995 tty=(none) ses=4294967295 comm="check_init_serv"     exe="/usr/bin/bash" subj=system_u:system_r:nrpe_t:s0 key=(null)

type=AVC msg=audit(1446051455.169:3315): avc:  denied  { getattr }     for  pid=15388 comm="check_init_serv" path="/usr/bin/systemctl"    dev="dm-1" ino=2101040 scontext=system_u:system_r:nrpe_t:s0     tcontext=system_u:object_r:systemd_systemctl_exec_t:s0 tclass=file
type=SYSCALL msg=audit(1446051455.169:3315): arch=c000003e   syscall=4 success=no exit=-13 a0=2098450 a1=7fff573ff760   a2=7fff573ff760 a3=7fff573ff5b0 items=0 ppid=15386 pid=15388   auid=4294967295 uid=997 gid=995 euid=997 suid=997 fsuid=997 egid=995   sgid=995 fsgid=995 tty=(none) ses=4294967295 comm="check_init_serv"   exe="/usr/bin/bash" subj=system_u:system_r:nrpe_t:s0 key=(null)

type=AVC msg=audit(1446053257.457:3401): avc:  denied  { read } for     pid=15647 comm="systemctl" name="journal" dev="tmpfs" ino=11584    scontext=system_u:system_r:nrpe_t:s0   tcontext=system_u:object_r:syslogd_var_run_t:s0 tclass=dir

答案1

没有测试过,但是..

使用 找到您需要的名称audit2allow -a,然后运行

  • 激活策略包:semodule -i <module_name>.pp
  • 验证已加载的模块:semanage module -l | grep <module_name>
  • 然后返回执行:setenforce 1

答案2

我看到您正在使用 NRPE,Nagios 远程插件执行器。正确的做法是通过 sudo 调用 NRPE,并告诉 SELinux 允许 NRPE 调用 sudo。

确保允许用户nrpe进行 sudo 配置,例如:

» cat /etc/sudoers.d/nrpe
Defaults:nrpe !requiretty
nrpe ALL = (root) NOPASSWD: /sbin/service <whatever> status

定义检查,替换my_service为实际的服务名称:

» cat /etc/nrpe.d/nrpe_custom_checks.cfg
command[check_my_service]=/usr/lib64/nagios/plugins/check_service_status_sudo my_service

这将是您的检查脚本:

0» cat /usr/lib64/nagios/plugins/check_service_status_sudo
#!/usr/bin/env bash

# Don't use -e, since we expect commands to fail
set -uo pipefail

OK=0
WARN=1
CRIT=2
UNKNOWN=3
STATE=${UNKNOWN}
MSG=""

if [[ $# -ne 1 ]]; then
    echo "UNKNOWN - $0 needs one argument. Aborting."
    exit ${UNKNOWN}
fi

SERVICENAME="$1"

OUTPUT=$(/usr/bin/sudo /sbin/service ${SERVICENAME} status 2>&1)
ES=$?

if [[ $ES -eq 0 ]]; then
    STATE=${OK}
    MSG="OK"
elif [[ $ES -eq 1 ]]; then
    # either not running or unrecognized service
    if echo "${OUTPUT}" | grep -q "unrecognized service"; then
        STATE=${WARN}
        MSG="WARNING"
    else
        STATE=${CRIT}
        MSG="CRITICAL"
    fi
fi

echo "${MSG} - ${OUTPUT}";
exit ${STATE}

可能需要为您的用例设置此 SELinux 布尔值:

» setsebool -P nagios_run_sudo on

相关内容