Se encuentra usted aquí

Error de conexión de phpMyAdmin a AWS RDS (SELinux)

Valoración: 
0

Introducción

Al momento de estar configurando un servidor Linux y puesto que mi background es 100% de FreeBSD, me encontré con una situación muy curiosa, el phpMyAdmin no podía establecer conexiones con una base de datos RDS y no conseguía encontrar la razón del problema.

Revisé logs de servidor web, base de datos, php, entre muchos otros, y no localizaba el error hasta que revisé el archivo "audit.log", donde me di cuenta de que SELinux era el problema ya que no permitía realizar conexiones hacía servidores externos desde el proceso del servidor web, y por lo mismo, el phpMyAdmin no se podía conectar al servidor RDS.

A continuación se puede ver el mensaje de error que encontré en archivo audit.log:

type=AVC msg=audit(1390241359.277:642): avc: denied { name_connect } for pid=13074 comm="httpd" dest=3306 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1390241359.277:642): arch=c000003e syscall=42 success=no exit=-13 a0=b a1=7fff035692f0 a2=10 a3=b items=0 ppid=13068 pid=13074 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=87 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

Solución

Hay dos formas para permitir las conexiones externas desde el proceso de servidor web, la primera de ellas consiste en cambiar a modo permissive SELinux, esta solución aunque no es la recomendada, es la mas simple y nos evitará futuros problemas con otros servicios. Esto lo hacemos ejecutando el siguiente comando:

# setenforce permissive

Y para hacer persistente el cambio se tiene que modificar la siguiente linea en el archivo /etc/sysconfig/selinux:

SELINUX=permissive

La segunda forma y de hecho, la recomendada, es cambiando la variable "httpd_can_network_connect_db" a "true", esto se logra de la siguiente forma:

# setsebool httpd_can_network_connect_db on

Podemos ver el estatus de SELinux utilizando el comando "sestatus" tal y como se muestra a continuación:

# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted