vsftpd y SELinux: cambiar el directorio para accesos anónimos

Tanto para cambiar el directorio por defecto al que acceden usuarios anónimos en un servidor FTP como usuarios autenticados, en el caso de que el sistema esté configurado con SELinux en modo Enforcing hay que tener en cuenta la necesidad de reconfigurar los permisos de forma correcta y que el servicio funcione.

# getenforce 
Enforcing

En el servidor vsftpd para modificar el directorio por defecto al que acceden los usuarios anónimos (/var/ftp) es necesario añadir la siguiente directiva en el fichero /etc/vsftpd/vsftpd.conf:

anon_root=/publico

Esto sería suficiente en un servidor normal, bueno, podría ser necesario cambio de propietario/grupo del directorio o de los permisos pero no siempre. En cambio, si tenemos SELinux activado hay que configurar los permisos SELinux igual que los tiene la carpeta original /var/ftp. Si no lo hacemos, veremos bloqueos en el log /var/log/audit/audit.log:

"/usr/sbin/vsftpd" subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1325536433.909:63): avc: denied { read } for  pid=3159 comm="vsftpd" name="testt" dev=dm-0 ino=22445 scontext=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
type=SYSCALL msg=audit(1325536433.909:63): arch=40000003 syscall=5 success=no exit=-13 a0=2523228 a1=98800 a2=adc33c a3=bfd18cb4 items=0 ppid=3157 pid=3159 auid=0 uid=14 gid=50 euid=14 suid=14 fsuid=14 egid=50 sgid=50 fsgid=50 tty=(none) ses=1 comm="vsftpd" exe="/usr/sbin/vsftpd" subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null)

Lo más sencillo es usar el comando chcon con el parámetro –reference, de modo que le especificamos el origen del cual copia los permisos contra la nueva ubicación:

# ls -Z /var/ | grep ftp
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 ftp

# ls -Z | grep publico
drwxr-xr-x. root root system_u:object_r:root_t:s0      ftp
# chcon --reference=/var/ftp /publico -R
# ls -Z | grep publico
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 ftp

Reiniciamos el servicio y el acceso a toda la información del nuevo directorio ya debería ser correcta:

# /etc/init.d/vsftpd start

Hemos puesto el caso de un servidor FTP, pero esto es válido para cualquier servicio (Apache, MySQL, Exim, Postfix…)