증상

php 로 된 web app 가 전혀 동작을 하지 않고 apache httpd 의 error.log 나 기타 browser 상에 특별한 에러가 남지 않음.

 

원인

  1. SELinux 는 apache httpd 를 특히 엄격하게 통제하며 이에 따라 httpd 는 mysql 등의 DBMS 에 연결할 수 없음
  2. wordpress 나 기타 php 로 개발시 일반적인 3-Tier 구조로 가지 않고 Apache httpd 에서 바로 DBMS 로 가는 구조로 개발
  3. SELinux 의 rule 에 의해 DBMS 접근이 거부되나 이때 에러 메시지는 Browser 상에 나타나지 않고 /var/log/audit/audit.log 에 남게 되고 로그가 저기 남는지 모를 경우 원인을 찾을수 없음
  4. 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.
    CODE
  5. scontext=unconfined_u:system_r:httpd_t 와 tcontext=system_u:object_r:mysqld_port_t 부분을 보면 httpd_t context로 수행되는 httpd 가 mysqld_port_t 에 연결할수 없어서 발생

 

해결

  1. apache httpd 가 mysql에 연결할 수 있게 해당 sebool 설정

    setsebool -P httpd_can_network_connect_db on
    CODE
  2. service httpd restart
  • httpd_can_network_connect 는 httpd 가 모든 network 에 연결할수 있는 위험이 있으므로 httpd_can_network_connect_db 을 권장
  • 위 bool 을 켜고 iptables 로는 지정된 DBMS 로만 나갈수 있게 rule 을 추가하면 더욱 안전하게 서비스 제공 가능