Linux,Unix,BSD

[PHP] 쉘 스크립트 실행 실패 문제(SELinux)

채윤아빠 2020. 1. 16. 23:58
728x90
반응형


문제점 및 증상

PHP로 개발중인 API에 쉘 스크립트를 실행하여 특정 작업을 처리하는 상황에서, API 호출에는 이상이 없었으나, 실제 스크립트가 동작한 로그를 확인해 보니, 다음과 같이 "Permission denied" 오류가 발생하며 API 내부에서 스크립트 호출이 계속 실패하였습니다.

sh: /home/nfs/bin/design_template_post.sh: Permission denied

개발 환경은 다음과 같았습니다.

  • OS : CentOS 7.4
  • Web Server : Apache 2.4.41 + PHP 7.3.12
  • MVC Framework : CodeIgniter-3.1.10
  • DB : MariaDB-10.3.x

원인 분석

audit2why 명령으로 "/var/log/audit/audit.log" 파일의 내용을 확인한 결과 다음과 같은 내용이 확인 되었습니다.

type=AVC msg=audit(1579052018.682:140224): avc:  denied  { getattr } for  pid=141007 comm="sh" path="/home/nfs/bin/design_template_post.sh" dev="dm-2" ino=3317793128 scontext=system_u:system_r:httpd_sys_script_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=file permissive=0

        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

API에서 실행되는 스크립트의 권한이 달라서 발생한 문제였습니다.

PHP 단에서는 위 스크립트를 다음과 같은 형태로 실행합니다.

    $cmd = "/home/nfs/bin/design_template_post.sh {$siteNo} '{$ptmpName}' {$pdesNo} '{$mtmpName}' {$mdesNo} >> /home/weblogs/design_template_post.log 2>&1 ";

    //템플릿 배포 스크립트 동작
    exec($cmd, $output);

조치 내용

API에서 실행되는 스크립트의 권한을 다음과 같이 "httpd_sys_script_exec_t"를 지정하여 PHP API 단에서 해당 스크립트가 정상적으로 실행될 수 있도록 다음과 같이 권한을 수정하였습니다.

ll -Z /home/nfs/bin/design_template_post.sh
-rwxr-xr-x. apache apache unconfined_u:object_r:home_root_t:s0 /home/nfs/bin/design_template_post.sh

chord -t httpd_sys_script_exec_t /home/nfs/bin/design_template_post.sh

ll -Z /home/nfs/bin/design_template_post.sh
-rwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_script_exec_t:s0 /home/nfs/bin/design_template_post.sh

위와 같이 권한 수정 후, API에서 쉘 스크립트가 정상적으로 잘 수행되었습니다.