php가 mysql 에 연결하지 못하여 워드프레스나 기타 php 로 개발된 app 가 동작하지 않음
증상
php 로 된 web app 가 전혀 동작을 하지 않고 apache httpd 의 error.log 나 기타 browser 상에 특별한 에러가 남지 않음.
원인
- SELinux 는 apache httpd 를 특히 엄격하게 통제하며 이에 따라 httpd 는 mysql 등의 DBMS 에 연결할 수 없음
- wordpress 나 기타 php 로 개발시 일반적인 3-Tier 구조로 가지 않고 Apache httpd 에서 바로 DBMS 로 가는 구조로 개발
- SELinux 의 rule 에 의해 DBMS 접근이 거부되나 이때 에러 메시지는 Browser 상에 나타나지 않고 /var/log/audit/audit.log 에 남게 되고 로그가 저기 남는지 모를 경우 원인을 찾을수 없음
SElinux 에러 메시지 분석을 위해 audit2why 수행
# audit2why < /var/log/audit/audit.log type=AVC msg=audit(1386679808.391:181): avc: denied { name_connect } for pid=3145 comm="httpd" dest=3306 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0tclass=tcp_socket Was caused by: Unknown - would be allowed by active policy Possible mismatch between this policy and the one under which the audit message was generated. Possible mismatch between current in-memory boolean settings vs. permanent ones.
- scontext=unconfined_u:system_r:httpd_t 와 tcontext=system_u:object_r:mysqld_port_t 부분을 보면 httpd_t context로 수행되는 httpd 가 mysqld_port_t 에 연결할수 없어서 발생
해결
apache httpd 가 mysql에 연결할 수 있게 해당 sebool 설정
setsebool -P httpd_can_network_connect_db on
- service httpd restart
- httpd_can_network_connect 는 httpd 가 모든 network 에 연결할수 있는 위험이 있으므로 httpd_can_network_connect_db 을 권장
- 위 bool 을 켜고 iptables 로는 지정된 DBMS 로만 나갈수 있게 rule 을 추가하면 더욱 안전하게 서비스 제공 가능