martes, 21 de agosto de 2012

Utilizar un sistema operativo CentOS como servidor FTP

Hace unas cuantas entradas, publiqué en el blog cómo hacer que CentOS se convirtiera en un router para enrutar paquetes y conexiones en una red local pequeña, realizar un servidor DHCP para ésa misma red y configurar el iptables. Para aprovechar las funcionalidades de las que es capaz de dotarnos un sistema operativo libre, y para sacarle el máximo partido, hoy vamos a ver cómo instalar un servidor FTP en el sistema operativo CentOS y configurarlo a como queramos usarlo.


Si volvemos en el tiempo (a la entrada de Introducción a FTP) vemos que había distintas maneras de realizar un servidor FTP (con usuarios, usuario guest o usuario anonymous, modo activo y pasivo, control de datos). Para sacar el máximo rendimiento a la anterior entrada y así, poner un poco en práctica los conceptos, hoy, vamos a ver cómo instalar el servidor FTP en un CentOS 5.7 y lo que debemos hacer para que nos funcione perfectamente.

Para ayudarnos en la tarea y centrarnos en qué debemos hacer en el servidor, así como saber qué instalamos, qué red usaremos y más detalles, vamos a poner un escenario.

Escenario de ejemplo:

Tenemos una red local bastante extensa, de alrededor de 50 ordenadores. Para modernizar el servicio y centralizar servicios, decidimos implementar un servidor FTP para almacenar archivos, o por el contrario, ofrecérselos al resto de usuarios. Para evitar que el futuro servidor sea un caos con tanto trajín de datos arriba y abajo, se opta por establecer una política de usuarios, los cuales deben acreditar su usuario y su clave para acceder a su carpeta personal dentro del servidor.

Una vez propuesto el escenario, lo interpretaremos:

- El servidor FTP será de dirección IP estática, para evitar así posibles errores en la dirección.
- El servidor FTP tendrá usuarios y contraseñas para garantizar la correcta entrada.
- Como sabemos que nuestra red sólo tiene 50 ordenadores, limitaremos la entrada de conexiones en nuestro servidor FTP y además estableceremos que un ordenador puede utilizar una conexión al servidor como máximo.

NOTA: A modo complementario, y siguiendo éste pequeño tutorial y el listado de cláusulas que pondré más adelante, a la entrada creada con anterioridad sobre crear un router con DHCP en el mismo CentOS le podemos añadir el servidor FTP, para así tener en el mismo CentOS un servidor DHCP, FTP y enrutador de red local. Eso ya como al usuario final, que es el que está leyendo, quiera. Si decide implementarlo, recuerde abrir los puertos 20 y 21 del IPTABLES para que funcione correctamente.

Empecemos a realizar todo:

Instalaremos los paquetes necesarios del repositorio.

El paquete que debemos instalar del repositorio es vsftpd (Very Secure FTP daemon en sus siglas)

# yum install vsftpd

Tardará unos minutos en descargar el paquete del repositorio e implementarlo en nuestro servidor.

2º Configuraremos el servidor FTP a nuestro gusto.

Una vez tenemos el paquete instalado, pasaremos a configurarlo. Para ello, usaremos vim para editar el archivo de configuración. Dicho fichero se encuentra en /etc/vsftpd y su nombre es vsftpd.conf

# vi /etc/vsftpd/vsftpd.conf

Ahora, pasaremos a explicar las cláusulas presentes (Con un asterisco señalaré las que de verdad nos interesan y las que modificaremos o tendremos en cuenta, tenga puesto YES, NO o "perico de los palotes").

  • *anonymous_enable: Esta cláusula hace referencia a si queremos activar el usuario anónimo o no. En nuestro servidor, utilizaremos la opción NO

  • *local_enable: Permite que los usuarios que están dados de alta en tu máquina accedan al servidor FTP con su usuario y contraseña. Por defecto, el valor es YES. Lo dejaremos así.

  • *write_enable: Con esta opción hacemos referencia a si queremos que los usuarios puedan subir archivos. Como hemos querido hacer que sí suban, la marcaremos como YES

  • default_umask: Umask por defecto en el servidor. Por defecto es 022. No se toca a no ser que lo queramos cambiar.

  • *anon_upload_enable: Permite a los usuarios anónimos a subir archivos. Por defecto está comentada. No la descomentamos, ya que no queremos usuarios anónimos.

  • anon_mkdir_write_enable: Permite a los usuarios anónimos crear directorios. Por defecto está comentada. No se descomenta.

  • dirmessage_enable: Cada vez que un usuario entra a un directorio, se crea un mensaje informando en qué directorio está. Lo dejamos como YES.

  • *xferlog_enable:Genera un fichero log con las cosas realizadas. Lo marcamos como YES si queremos un registro completo de los movimientos (Opcional)

  • connect_from_port_20: Conectarse al servidor utilizando el puerto 20. Lo marcamos como YES.

  • chown_uploads y chown_username: Estas cláusulas no se descomentan. La primera hace referencia a que cuando un anónimo sube un archivo al servidor, lo guarda como si fuera el usuario o grupo especificado en chown_username.

  • *xferlog_file: La ruta donde estará el archivo xferlog_file.

  • *idle_session_timeout: Especifica el timeout que daremos a una conexión FTP que está inactiva. Por defecto, nosotros usaremos 600 (que equivale a 10 minutos)

  • *data_connection_timeout: Si una conexión activa de datos está en transferencia pero no hay tráfico de datos como tal (bien sea por un error u otra causa), especificaremos el timeout para no sobrecargar el servidor. Nosotros usaremos 120

  • nopriv_server: Especifica qué usuario usa por defecto el servidor FTP, así como sus privilegios o demás. Por defecto, la dejamos comentada.

  • ascii_upload_enable: Permite la subida de archivos en formato ASCII
  • ascii_download_enable: Permite la descarga de archivos en formato ASCII

  • *ftpd_banner: Especifica el banner que queramos poner a nuestro servidor, el mensaje de entrada.

  • deny_email_enable: Con esta cláusula denegamos los mensajes anónimos de correo en el servidor. La dejamos en YES. (Está comentada, asi que no la descomentamos)

  • chroot_list_enable: Esta cláusula permite que, si lo especificamos en el archivo /etc/vsftpd/chroot_list, los usuarios locales del servidor inicien en el directorio $HOME. La dejamos en YES y comentada.

  • ls_recurse_enable: Especifica si queremos activar la recursividad al listar directorios. Por defecto está comentada. La dejamos así.

  • *listen: Permite al servidor escuchar en IPv4. Por defecto está en YES. La dejamos así.

  • listen_ipv6: Igual que la anterior, pero solo si vamos a usar IPv6. Como no usaremos IPv6, la dejamos comentada.

  • *pam_service_name: Nombre del servicio. Por defecto es vsftpd.

  • userlist_enable: Si está en YES, se usará un fichero llamado userfile_list con los usuarios permitidos para entrar al FTP.

Una vez explicadas todas las cláusulas que nos pueden ser útiles en la creación de nuestro servidor FTP, modificamos las que más necesitemos acorde a nuestras necesidades. A medida que las explicaba, he ido diciendo las que habría que cambiar para nuestro escenario ejemplo, así que una vez nos hemos percatado de que todas las cláusulas han sido escritas correctamente, aceptamos y salimos del archivo de configuración guardando lo escrito.

Ahora, arrancamos el servidor FTP. Para ello, introduciremos el comando:

# service vsftpd start
Iniciando vsftpd para vsftpd: [OK]
#

3º Hacernos nuestro IPTABLES

Una vez iniciado, aún así, no nos va a funcionar el servidor a la primera, debido a que no hemos configurado correctamente el cortafuegos para que permita conexiones entrantes a través de la interfaz eth0. Para ello, vamos a pasar a configurarlo:

NOTA: Si bien es cierto que la implementación va a ser a nivel local, directamente podríamos tirar el servicio de iptables (pararlo, vamos) y ya nos los apañamos, pero eso es responsabilidad del usuario final el cómo quiera realizarlo.

Para configurar el iptables, primero debemos saber qué puertos están involucrados en nuestro servidor FTP. Como bien sabemos, los puertos que debemos abrir para la conexión son el 20 y 21.

Una vez identificados los factores, nos "hacemos" las reglas de iptables.

- Queremos políticas de entrada, debido a que lo que vamos a hacer es transmitir a nuestro servidor.

- La entrada se realiza por la interfaz eth0 y por los puertos 20 y 21

Las reglas son las siguientes:

Primero, borramos todas las reglas presentes en nuestro servidor:

# iptables -F
# iptables -X
# iptables -Z

Y ahora, las reglas que añadiremos para que el servidor se comunique con los clientes:

# iptables -P INPUT ACCEPT

# iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

Por supuesto, una vez terminadas de hacer nuestras reglas, debemos guardarlas con el comando:

# iptables-save

NOTA: Para asegurarnos una efectividad completa en la programación del iptables (dado que a veces el comando iptables-save sólo lo guarda para ésa sesión) podemos crear un pequeño script, y luego ejecutarlo en el inicio.

En el fichero /etc/rc.d/rc.local, puedes agregarle las líneas de iptables que usarás, y nada más se ejecuten el servidor irá correctamente.


Aún habiendo realizado nuestro iptables de forma correcta, nos falta configurar el SElinux (dado que es un módulo de seguridad bastante "puñetero" con las conexiones). Si queremos subir un archivo, el SElinux nos podría tirar la conexión alegando que no tenemos permisos.

Para solventarlo, debemos escribir

# setenforce permissive

Y de esta forma, nos dejará.

PD: Se puede añadir al rc.local del inicio si queremos.
PD2 (Adicionado por un comentario): Desactiva el SElinux tiende a ser peligroso dado que tiramos todo el sistema de seguridad por el FTP. Se pueden solamente habilitar los bool del SElinux para FTP y conseguir el mismo efecto sin necesidad de ponerlo como Permissive. En unos días investigaré cómo.

4º Creación de usuarios para nuestro servidor FTP.

Para crear los usuarios de nuestro servidor FTP, los crearemos como si estuvieramos creando un usuario cualquiera (no nos vamos a complicar mucho, nuestro servidor ya está lo suficientemente seguro con el iptables)

Crearemos un usuario de prueba, por ejemplo:

  • Nombre de usuario: perico
  • Contraseña: eltuerto
Para crearlo, introduciremos los siguientes comandos:

# useradd perico
# passwd perico (despues introducimos la clave cuando indique, y listo)

Una vez creado nuestro usuario perico, veremos a ver si nos ha funcionado y podemos acceder de forma correcta al servidor con las credenciales. Para comprobarlo, usaremos el cliente FTP más sencillo de Windows: El de su línea de comandos.

Accedemos a una línea de comandos de Windows (cmd, vamos) y escribimos:

C:\> ftp (dirección IP del servidor)

Pondré un ejemplo práctico:

(20:06:23,73)[C:\Users\Admin]$ ftp 11.0.0.29
Conectado a 11.0.0.29.
220 Bienvenidos al servidor FTP VISA8080
Usuario (11.0.0.29:(none)): perico

331 Please specify the password.
Contraseña:
230 Login successful.
ftp>


NOTA: La contraseña no se muestra como introducida en el login, no es que se les haya estropeado el teclado cuando la estén escribiendo y no la ven.

5º Sacando partido a nuestro servidor FTP.


Una vez tenemos creado nuestro servidor del todo, es hora de darle uso ¿No?

Para poder acceder a los archivos de nuestro servidor FTP, la mejor manera y más comoda (siempre que no tengamos que subir archivos al mismo) es usar nuestro navegador de Internet, y con la dirección en el navegador ftp://(dirección ip):(puerto) accederemos a nuestro servidor FTP, y podremos ver de mejor forma los archivos.

Otra manera más gráfica es usando la herramienta Winscp, que ofrece una mejor visión de los archivos, así como también subir y bajar archivos del servidor de forma más sencilla.

Para finalizar, cómo no, diremos que todo esto se consigue siendo usuario root o superuser. Si no, no hay FTP

Comentarios adicionales que pueden ayudar:

De :::Jhon Castañeda::: (Comentario más abajo, en la zona de Comentarios)

Implementando un servidor FTP. Su ISP mapeó una dirección pública a una dirección privada a través de la NAT. Desde la LAN se puede conectar, pero desde fuera era imposible porque el IPTABLES que está puesto en este manual es hacia dentro (Recuerden que no puse opciones para que fuera hacia el otro lado, desde Internet). El usuario en cuestión nos da éste comando para solventar éste problema.

# iptables -A FORWARD -i eth0 -p tcp -d (dirección del servidor) -m multiport --dports 20,21 -j ACCEPT

El cual hace que el tráfico pase a través del NAT y llegue al servidor. Además, en el iptables, debemos añadir este comando.

# iptables FORWARD ACCEPT

Para que nos acepte el tráfico de forward.

Gracias por la ayuda recibida.


Fuentes:

Reciclaje de apuntes
Wiki de CentOS
Experiencia propia (y lo que me ha costado hacer el servidor virtual de referencia)

Última edición: Octubre de 2013
Razón: Correcciones ortográficas.

    30 comentarios:

    1. He recibido un comentario de un anónimo que exponía lo siguiente:

      para poder mandar archivos a mi servidor ftp de otra red, que pasos ahi que segir, por que ya tengo confgurado el ftp. pero solo puedo mandar archivos desde la misma red

      El problema es que la he "liao parda" en el panel y he publicado y borrado, y como el blog no permite recuperar comentarios...

      A ver, ¿como "desde otra red"? ¿Te refieres desde otra dirección IP de la normal, o la inversa? No sé... No me aclaro.

      Siento el borrado de comentario y espero que llegues a leer éste. =S

      ResponderEliminar
    2. Yo estaba implementando con ayuda de este manual un servicio FTP para una empresa. El ISP mapeo una IP publica a una IP LAN con NAT. Desde la red local conectaba, pero desde internet propiamente no.. Vale la pena complementar (Y casi me rompo la cabeza con esto) de que hay que agregar al iptables

      iptables -A FORWARD -i eth0 -p tcp -d ip_server -m multiport --dports 20,21 -j ACCEPT

      ResponderEliminar
      Respuestas
      1. Agregaré la parte de tu comentario, con tu permiso y aprobación, a la entrada principal, por si alguien tiene algún problema con éste mismo problema. Gracias por los comentarios.

        Eliminar
    3. Hola buen día, disculpa la ignorancia pero estoy iniciando en Centos y en Linux,
      llego al paso de editar el archivo de configuración pero no se como guardarlo, ni como salir de el para regresar al root, espero y me puedas ayudar, se que es algo básico pero no encuentro como hacerlo.

      Gracias

      ResponderEliminar
      Respuestas
      1. Si usas Vim para la edición de archivos, lo que debes hacer es pulsar ESC para quitar el modo de edición, y una vez lo hayas hecho, escribes ":wq" (Dos puntos para decir que queremos introducir una orden de archivo, "w" para la escritura del archivo y "q" para salir). Asegúrate de que eres superusuario o te dirá que no tienes permiso para la edición.

        Eliminar
      2. Muchas gracias por la ayuda, tengo una duda.
        esto es igual si quiero aplicar centos en una maquina virtual?
        Saludos

        Eliminar
      3. Si, Puedes desarrollar este escenario desde una máquina virtual, siempre asegurándote de que las interfaces virtuales de conexión estén bien configuradas y la virtualización de CentOS no dé problema alguno. Como recomendación, la versión 5.7 o 5.8 suele ser más estables para una máquina virtual.

        Gracias por los comentarios.

        Eliminar
    4. Instale el servidor en una maquina virtual (virtualbox), la maquina virtual me da una ip 10.0.2.15, al quererme conectar en la PC escribo la dirección y no la encuentra, como configuro el servidor para que mi conputadora se pueda conectar a la virtual?

      ResponderEliminar
      Respuestas
      1. Ahí lo que deberías hacer correr es el adaptador virtual interno de Virtualbox. Así, levantas una interfaz "privada" entre la máquina virtual y la real, de tal modo que haya una correcta comunicación entre los dos. En muchas ocasiones, el hacer funcionar la máquina virtual y la real por la misma interfaz y conectada al mismo router o switch podría dar éste tipo de cosas (que no funcione bien).

        Mi recomendación es que cuando vayas a practicar éste tipo de cosas, desconectes todos los medios y sólo uses interfaz virtual privada, para que así no se entrometan otras interfaces y provoque errores.

        Eliminar
    5. Instalé el FTP ( En una maquina virtual) y agregué el chroot_list, solamente tengo una duda, al estar subiendo archivos al servidor, lo hago con el explorardor de winodws, los archivos que no están pesados los sube correctamente, he intentado subir archivos grandes como películas o una carpeta con el instalador de Windows, se empieza a subir y siempre después de un min y media aproximadamente, me arroja un error de que debo tener permisos para subir archivos al servidor y abajo parece "conectado a Servidor FTP", me estoy conectando con el usuario que cree y lo raro es que solamente con instaladores o archivos superiores a 700mb, he buscado pero no he encontrado nada, sabes que podría ser?

      Saludos

      ResponderEliminar
      Respuestas
      1. Lo del chroot_list es solo para que inicien en el directorio $HOME del usuario, no tiene más.

        ¿Has probado a usar Winscp para el envio/recibo? ¿O has probado otro método de envío de archivos? (Estilo ASCII o Binary, que igual puede ser eso) Es raro que petardee al minuto o minuto y algo. Si el servidor y cliente te da como válida la conexión al servidor, debe ser por alguna cosa del sistema de archivos o bien que el archivo es demasiado grande. Intentaré investigar si se escapa algo, pero por el momento, intenta usar otro sistema.

        ¿Has probado la inversa? (Bajar archivos grandes del servidor FTP?

        Saludos.

        Eliminar
      2. Sucede lo mismo se cae la conexión con el servidor

        Eliminar
      3. Prueba a deshabilitar las cláusulas de timeout (idle_session_timeout y data_connection_timeout) comentándolas. Por el momento, empezaré a investigar con Wireshark por qué ocurre ésto en el servidor.

        Eliminar
    6. Que onda, estuve haciendo pruebas con archivo vsftpd.conf, al principio no había configurado idle_session_timeout y data_connection_timeout, pienso que tal vez eso fue lo que no me permitía subir archivos grandes ya que solo estaban comentadas. al agregarlas pude subir el instalador de Visio y bajarlo, Muchas gracias por el aporte y por el apoyo. Ahora me queda la duda sobre el video streaming en Centos, ¿hay algún servicio en centos?

      Saludos

      ResponderEliminar
      Respuestas
      1. Me alegro de que te haya conseguido funcionar, ya me parecía raro que la conexión cayera por sí misma.

        ¿Video streaming? Si te explicas puedo recabar algún tipo de información, aunque me suena de haberlo visto cuando estaba estudiando. Miraré información por Internet, y si lo veo útil, intento colgarlo en el blog. (Y darle un poco vidilla, que llevo meses sin actualizar)

        Un saludo.

        Eliminar
    7. hola tengo un problema me sale error 530 user cannot log in, conexion cerrada por el host remoto, estoy trabajando con centos en una maquina virtual y windows 7 en la maquina real, es necesario realizar una configuracion adicional??

      ResponderEliminar
      Respuestas
      1. Si te da el error 530 es porque el login de usuario y contraseña es incorrecto. Evita el filtrado de usuarios y usar la cláusula userlist_enable.

        Por probar, activa el usuario "anonymous" y prueba a entrar con él. Si te da acceso, es que el usuario que creaste para el FTP hace un login incorrecto (mal la contraseña o derivados)

        Eliminar
    8. Hola, com puedo colocar mi carpeta de ftp a mi servidor web(/var/www/html/)

      Gracias.

      ResponderEliminar
    9. ola que pena me podrian ayudar con la instalacion del servicio ftp en centos vercio 6.4 y otra pregunta me podrian ayudar tambiem con la linea de comandos para que centos me busque directamente desde el dvd los paquetes y no desde la red . grasias

      ResponderEliminar
      Respuestas
      1. Dado que has puesto dos comentarios, te responderé solo en este:

        Para realizar la instalación desde el DVD, puedes copiar y pegar los paquetes en una ruta que conozcas y ejecutar "yum install (ruta del paquete)", o desde la ruta propia.

        Si el DVD no lo tienes introducido, lo puedes montar en el Centos con "mount -o loop (ruta donde este el centos) (ruta donde lo quieres montar)".

        Eliminar
    10. Ola me podrían ayudar con la instalación del servicio dhcp en (Centos). gracias

      ResponderEliminar
    11. amigo esta muy completo tu post pero me queda una duda...siempre que creemos los usuarios serán de sistema??...no hay forma de que solo sean para el servicio ftp....creo que es muy inseguro que tengan acceso a todo el sistema o alomejor estoy equivocado y puedo restringirlo a ciertas carpetas con permisos???

      ResponderEliminar
      Respuestas
      1. Puedes modificar los permisos de los usuarios para que no sean usuarios con derecho a root o "sudoers" (sudo, su - o similares). Si creas usuarios con una utilidad gráfica puedes modificarlo mejor, pero si lo estás usando desde consola mirate bien las instrucciones del comando "useradd", para saber cómo hacer que no tenga sudoers.

        Eliminar
    12. El selinux es la seguridad del S.O por lo que si lo poner permisivo queda vulnerable.

      Lo correcto es habilitar los boloeanos del Selinux para el FTP y de esta forma tambien permite el acceso aunque se encuentre en modo Enforcing y no permisivo.

      Saludos

      ResponderEliminar
      Respuestas
      1. En esta entrada lo he tratado en un escenario de red local, donde la seguridad de conexiones está cubierta y se supone que los usuarios no harían de las suyas. Si por ejemplo lo hacemos en un servidor FTP en web, se debería poner lo que has propuesto. Editaré el blog desde ésa parte y pondré tu autoría. (aún siendo anónimo)

        Un saludo.

        Eliminar
    13. Hola buenos días.

      Os explico mi caso para ver si tenéis soluciona.

      Tengo un servidor con Centos 6.5 con VSFTPD instalado.
      Entrando por SFTP/SSH no tengo problema.

      El problema lo tengo cuando creo un usuario FTP al que quiero redirigir a un directoio ( /var/www/cre ).

      He seguido al pie de la letra vuestras indicaciones y siempre me aparece el siguiente error:

      Conexión establecida, esperando el mensaje de bienvenida...
      Respuesta: 220 Welcome to FTP service.
      Comando: AUTH TLS
      Respuesta: 530 Please login with USER and PASS.
      Comando: AUTH SSL
      Respuesta: 530 Please login with USER and PASS.
      Estado: Servidor no seguro, no soporta FTP sobre TLS.
      Comando: USER cre
      Respuesta: 530 Permission denied.
      Error: No se pudo conectar al servidor

      Que me falta por instalar ? Porque no conecta ?

      Un saludo

      ResponderEliminar
      Respuestas
      1. El error 530 que se corresponde quizá tenga algo que ver con la seguridad por SSL/TLS. El 530 especifica que el usuario y la contraseña no son correctos. Quizá no te soporta bien la autenticación SSL/TLS.

        ¿Tienes instaladas las bibiliotecas SSL/TLS correspondientes?

        Eliminar
    14. Muy buen post y aprovechando la ocasión quisiera platear mi duda, instale el ftp ahora el problema es que no puedo compartir archivos con mi servidor, por otro lado ya habia antes un usuario que sin problema se podian tranferrir o compartir archivos con el server,, ahora ya ni entrar puedo a ese usuario SALUDOS

      ResponderEliminar
      Respuestas
      1. Buenos días, y gracias por el comentario.

        Si no consigues entrar por tal usuario deberías ver si los permisos y el grupo administrativo al que pertenece dicho usuario son correctos. Verifica también que el setenforce está en permisivo.

        Si ninguna de las dos te ayudan, crea una carpeta con los permisos a 777. Si ni con ésas puedes realizar nada, prueba a reinstalar el servidor FTP.

        De todas maneras, es muy raro que ni siquiera puedas entrar al usuario. Parece más cosa del servidor ftp que de algún tema de permisos.

        Eliminar

    Comenta si te gustó la entrada, algún error que tenga, o simplemente entra a debatir si tienes algún problema, pues recuerda que aquí todo es posible y nada es seguro (Y a lo mejor a mí se me ha podido ir la pinza y escribir algo mal)

    Por favor, sé conciso y ten buena escritura, que aquí no se cobra por letras ni palabras a usar. Los comentarios estilo HOYGAN o descalificativos no serán publicados.