CentOS 7 - Directorios creados a través de VSFTPD que no heredan contextos SELinux

8

Nuestra empresa tiene un servidor web con CentOS 7 y nuestros clientes administran sus sitios web a través de FTP (vsftpd). SELinux está en modo de imposición.

El problema es que los datos creados / uploadad a través de VSFTPD no heredan el contexto SELinux apropiado. Dejame explicar.

Por ejemplo, para los sitios de WordPress, el servidor ya tiene un par de reglas que se pueden ver usando semanage fcontext -l |grep '/var/www', que son:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

Entonces, cuando copio un sitio de WordPress, digamos desde otro servidor en un directorio /var/www/html/de SSH, las carpetas wp-content/y wp-content/uploads/el httpd_sys_rw_content_tcontexto de seguridad adecuado . SIN EMBARGO, cuando esas carpetas se crean a través de FTP, el contexto que obtienen es httpd_sys_content_t(sin rw ). Esto significa que los sitios que nuestros clientes cargan en el servidor no pueden escribir en esos directorios incluso si otorgan permisos de escritura al usuario / grupo apache, por lo que el administrador de WordPress no funciona. Entonces, cuando suben un sitio, tienen que solicitarnos ayuda para solucionarlo, lo cual es una pérdida de tiempo para todos los involucrados.

Digamos que el cliente cargó su sitio en httpdocs, si a través de SSH hago mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -frel problema está resuelto, por lo que no hay nada de malo en los datos.

También puedo hacer restorecon -Rv httpdocs/para solucionar el problema.

Entonces, la pregunta es: ¿cómo puedo hacer que los directorios creados / cargados a través de VSFTPD hereden los contextos SELinux adecuados tal como se heredan cuando los directorios se crean / cargan a través de SSH?

Juan pablo barrios
fuente
Por seguridad, es una mala idea admitir FTP en absoluto. Considere deshacerse de él e instruir a los clientes sobre cómo configurar sus clientes de transferencia de archivos para usar SFTP en su lugar ... lo que también eliminará este problema.
Michael Hampton
Gracias michael Estoy de acuerdo con usted, pero en nuestro caso no usamos "ftp.domain.com" para nuestros clientes y tampoco exponemos la dirección IP pública del servidor (el servidor está detrás del proxy NginX), por lo que la seguridad de FTP no es un problema para nosotros. Solo aquellos a quienes enviamos la dirección FTP pueden incluso encontrar la dirección IP del servidor para conectarse a través de FTP.
Juan Pablo Barrios

Respuestas:

6

Existe una diferencia entre el etiquetado predeterminado que se produce en tiempo de ejecución y la política de etiquetado posterior basada en expresiones regulares que se aplica en el servidor.

Lo que estás notando aquí:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

Es la política de etiquetado posterior.

Lo que discute en su problema en realidad se relaciona con la política de tiempo de ejecución.

Cuando se crea una entrada en un directorio usando SELinux, las reglas que rigen qué etiqueta termina siendo el archivo o el directorio no están dictadas por las expresiones regulares que usted cita, sino por otras reglas de la siguiente manera (creo que este es el orden correcto, pero podría haber fallado algo) .

  1. Hay una type_transitionregla explícita con nombre .
  2. Hay una type_transitionregla explícita sin nombre .
  3. Herede el mismo contexto que el directorio principal.
  4. Aplica el default_context.

Entonces, cuando copio un sitio de WordPress, digamos desde otro servidor en un directorio en / var / www / html / by SSH, las carpetas wp-content / y wp-content / uploads / tienen el contexto de seguridad httpd_sys_rw_content_t adecuado.

Entonces, sí, hace esto, pero no por la razón por la que piensas que lo hace. Ciertamente no por la política de etiquetado posterior.

Esto ocurre porque type_transitionexiste una regla con nombre específica que proporciona este comportamiento.

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

Esto es básicamente decir.

  • Si eres unconfined_t y
  • Si está realizando una acción en el tipo de destino httpd_sys_content_t y
  • Si la clase de la nueva entrada es un directorio y
  • Si el nombre de la nueva entrada es "subidas", entonces
  • El nuevo tipo es httpd_sys_rw_content_t

La razón por la que esto funciona para SSHD es porque después de haber iniciado sesión, se le proporciona el contexto de origen unconfined_tpara el cual se aplica esta regla.

Esto no funciona para el servicio FTP porque es muy probable ftpd_tque el contexto de origen de este servicio no tenga una regla coincidente.

Como tal, necesitaría modificar la política para alterar el comportamiento de SELinux para respetar también las reglas de archivos con nombre que ve en las otras entradas para FTP.

Al menos en Fedora 23, existe una interfaz para permitir esto, un módulo de política como este lo haría.

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

Puede cargar esto asegurándose de que el selinux-policy-develpaquete esté instalado y ejecutándose make -f /usr/share/selinux/devel/Makefile load.

Matthew Ife
fuente
1
Hola Matthew, ¡eso funcionó! Gracias por tu ayuda ya que me estaba volviendo loco con esto. No estaba seguro de qué hacer con el módulo de políticas que escribió, ya que nunca había personalizado SELinux, así que busqué en Google un poco y lo siguiente fue lo que hice: creé el archivo local_ftpd.tecon su módulo de políticas, luego lo hice make -f /usr/share/selinux/devel/Makefile local_ftpd.ppy luego semodule -i local_ftpd.pp. ¿Esta bien? Ahora los archivos creados a través de FTP heredan los contextos deseados. ¡Gracias de nuevo!
Juan Pablo Barrios