Linux,Unix,BSD

[PHP] CentOS SELinux 활성화 서버에서 PHP로 MariaDB 접속시, "Permission denied" 발생 문제

채윤아빠 2020. 1. 15. 21:50
728x90
반응형



문제점 및 증상

신규 CentOS로 구성한 웹 서버에서 PHP로 REST API를 개발하고 있는데, API를 로컬 PC에서 개발하였을 때는 이상없이 잘 동작하였던 API가 실 서버로 이전 한 후, CURL 명령을 이용하여 수동으로 호출시험을 하였더니, 다음과 같은 오류가 발생하였습니다.

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  mysqli::real_connect(): (HY000/2002): Permission denied</p>
<p>Filename: mysqli/mysqli_driver.php</p>
<p>Line Number: 203</p>

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

  • 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

원인 분석

웹로그 등에서 특별한 원인이 없어서, SElinux가 활성호되어 있는 상태라, 당므과 같이 audit2why 명령을 이용하여 SELinux로 인한 문제가 없는지 확인해 봤더니, 딱 관련 문제가 확인됬습니다.

audit2why < /var/log/audit/audit.log
type=AVC msg=audit(1579051894.484:140213): avc:  denied  { name_connect } for  pid=148106 comm="httpd" dest=XXXX scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0

        Was caused by:
        One of the following booleans was set incorrectly.
        Description:
        Allow httpd to can network connect

        Allow access by executing:
        # setsebool -P httpd_can_network_connect 1
        Description:
        Allow nis to enabled

        Allow access by executing:
        # setsebool -P nis_enabled 1

SELinux가 활성화된 상태에서는 HTTP 웹 서버에서 tcp 포트를 열 수 없다는 것으로, MariaDB를 이용하는데 기본 포트를 이용하지 않고 별도의 포트 XXXX를 이용중이었습니다.

조치 내용

audit2why 명령으로 확인한 결과, 다음과 같이 HTTP에 대한 설정을 변경하였더니, 신규 서버에서도 정상적으로 API가 호출되었습니다.

setsebool -P httpd_can_network_connect 1
setsebool -P nis_enabled 1