단일 파일에 대해 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

Nagios 원격 플러그인 실행 프로그램인 NRPE를 사용하고 계시군요. 올바른 접근 방식은 sudo를 통해 NRPE를 호출하고 NRPE가 sudo를 호출할 수 있도록 SELinux에 지시하는 것입니다.

사용자에게 nrpesudo 구성이 허용되는지 확인하세요. 예를 들면 다음과 같습니다.

» 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

관련 정보