domingo, 17 de enero de 2016

Instalar ProFTP

Wikijc:Sistemas proftp

INSTALAR Y CONFIGURAR PROFTP


Introducción
Existen varios servidores de ftp para linux, la selección del proftpd ha sido debido a que nunca he tenido problemas con él y su funcionamiento siempre ha sido el correcto. Debemos de tener en cuenta que el ftp realiza las conexiones mediante texto plano y por tanto nuestras cuentas son enviadas en texto plano por la red y por tanto la seguridad de estas es mínima, por lo que, para información muy delicada seria conveniente que usen sftp(openssh). Una vez comentado esto comenzaremos con la instalación de este magnifico servidor ftp.

Instalación
Para instalar proftp necesitamos los siguientes paquetes
$sudo apt-get install proftpd libmysqlclient15off libpq5 mysql-common

Lo primero que tenemos que determinar en la instalacion es cómo va a ejecutarse este servicio, si lo hará bajo inetd o en forma independiente (como un proceso más). La diferencia entre ambos métodos es mayormente la velocidad de ejecución que se obtendrá del servicio y la carga que se le dará al equipo. Utilizando inetd el equipo iniciará un proceso nuevo por cada pedido de ftp que llegue al equipo, mientras que ejecutándose en forma independiente, el proceso ya esta inicializado por lo que no hay necesidad ejecutar un nuevo programa (simplemente se clona el proceso, generando una nueva instancia del mismo para atender al cliente ftp que inicio el requerimiento).
El parámetro dentro del archivo de configuración que determina el método con que va a ejecutarse el proftpd es "ServerType", si este está en "standalone" el servicio correrá como un proceso independiente.
Por otro lado si se especifica "inetd" se deberá agregar al inetd.conf una configuración extra y será el inetd el proceso encargado de inicializar al proftpd cada vez que llegue un requerimiento de ftp al equipo.
Nosotros escojemos la opcion de independiente

Los ficheros de configuración del proftpd se encuentran en /etc/proftpd/, como veremos tendremos creado un fichero llamado proftpd.conf.sample, el cual es un fichero de ejemplo para ayudarnos a configurar nuestro servidor. Nos vamos a centrar en el fichero principal de configuración proftpd.conf. este se divide en 3 partes. La primera trata de la configuración del servidor, la segunda los directorios donde tendremos nuestro servidor ftp físico y por ultimo la creación de un servidor anonymous(esta ultima parte se puede omitir si no es nuestro deseo):
$sudo /etc/proftpd/proftpd.conf

Primera parte: 
  • Indicaremos el nombre de nuestro servidor FTP
ServerName "Nombre_del_servidor"
  • Tipo de arranque del demonio, si deseamos standalone o inetd:
ServerType standalone
  • Mensaje de entrada que mostrara nuestro servidor, antes de la autentificacion, Tener en cuenta que en este tipo de opciones, si eligimos off no deberemos de poner acontinuacion el texto que queremos mostrar("mensaje"), esto ocurre con todas las opciones parecidas a esta.
DeferWelcome off/on "mensaje"
  • Nombre identificativo que aparecerá cuando accedamos al ftp
ServerIdent off/on "nombre"
  • Toma las opciones predeterminadas de un servidor ftp
DefaultServer off/on
  • Si queremos que muestre la dirección física de nuestro enlace dinamico. Si dicho enlace esta fuera del directorio destinado al ftp, su acceso no sera posible.
ShowSymlinks off/on
  • Permite continuar una descarga o subida de un fichero, en la cual la transferencia no se completo. A esta opción se le conoce como "resume"
AllowRetrieveRestart yes/no
  • Permite la continuación de una escritura que no se realizo completamente, va unida a la opción anterior
AllowStoreRestart yes/no
  • Permite la falsificación del grupo de nuestros ficheros, para el cliente el grupo de los ficheros siempre sera el indicado en esta opción
DirFakeGroup on nombre_grupo_falso
  • Misma funcion que la opción anterior pero para falsificar el usuario
DirFakeUser on nombre_usuario_falso
  • Falsifica los permisos de nuestros ficheros indicando que todos los ficheros tienen los permisos que le otorguemos, sigue la nomenclatura numerica del chmod, 1 es ejecución, 2 es escritura y 4 lectura para el 2bit(usuario), 3 bit(grupo y 4bit(otros usuarios que no sean el propio dueño del fichero ni un usuario del grupo). El primer bit es un bit especial que normalmente no se usa, esta relacionado con el bit pegajoso(valor 1) y valores referentes al "sudo", dejar en 0. El valor X representa un numero dependiendo de nuestra elección.
DirFakeMode 0XXX
  • Numero máximo de segundos que puede estar un cliente sin realizar subida ni bajada de información en el ftp. Una vez sobrepasado el limite cierra la conexión con el cliente.
TimeoutNoTransfer X
  • Rl numero máximo de segundos que puede estar cliente-servidor sin recibir información de una transferencia ya sea subida o bajada. Es el tiempo limite que dejamos a una subida o bajada cuando se produce un corte y el servidor no recibe información, una vez sobrepasado el limite cancela la operación de transferencia
TimeoutStalled X 
  • Numero máximo de segundos que puede estar un cliente en el ftp, sin realizar movimientos, ya sea desplazarse por el ftp como subir o bajar información. Una vez sobrepasado el limite cierra la conexión con el cliente.
TimeoutIdle X
  • Pequeño plugin de filtro del propio proftpd
DenyFilter \*.*/
  • Indicamos el puerto donde queremos que escuche nuestro servidor(el 21 es el predeterminado)
Port X
  • Numero de conexiones al ftp que se pueden hacer a la vez(recomendable numero bajo)
MaxInstances X
  • Indicamos el mensaje de acceso realizado correctamente:
AccessGrantMsg "mensaje"
  • Indicamos el mensaje de acceso realizado incorrectamente:
AccessDenyMsg "mensaje"
  • Especificamos la manera que queremos que se "logueen" un tipo de conexión:
LogFormat nombreformatolog "forma de loguear"
  • Especificamos donde guardamos físicamente los logs, además del TIPO que seleccionemos: WRITE(escritura), READ(lectura), AUTH(accesos) y ALL(todos los anteriores)
ExtendedLog /directorio/fichero TIPO nombreformatolog
  • Existe un tipo de logueo que esta ya descrito con un LogFormat y TIPO predeterminado. Este tipo guarda todas las transferencias realizadas:
TransferLog /directorio/fichero
  • Hacemos chroot en el directorio de nuestro ftp, es decir, no permitiremos que pueda subir a un directorio jerárquicamente superior a él
DefaultRoot ~
  • Le indicamos donde esta el fichero donde tenemos guardados los usuarios que tienen acceso a nuestro ftp
AuthUserFile "/etc/passwd"
  • Le indicamos donde esta el fichero donde tenemos guardados los grupos que tienen acceso a nuestro ftp
AuthGroupFile "/etc/group"
  • Maximo numero de clientes que pueden estar a la vez en el servidor, además adjuntamos un mensaje cuando sobrepasamos el numero máximo
MaxClients X "mensaje"
  • Maximo numero de clientes con el mismo ip, además adjuntamos un mensaje cuando sobrepasamos el numero máximo
MaxClientsPerHost X "mensaje"
  • Maximo numero de clientes con la misma cuenta de usuario
MaxClientsPerUser X "mensaje"
  • Decimos si los usuarios necesitan tener una shell valida o no, aquí es importante poner en off
RequireValidShell off/on

Segunda parte: 
  • En la segunda parte nos limitamos a indicar mediante etiquetas los directorios de nuestro ftp. Normalmente la estrategia es indicar un directorio y darle unas propiedades. Los directorios inferiores jerárquicamente tomaran los valores del padre, si no especificamos otra etiqueta dándole unas características distintas a este.


Opciones del directorio


  • Las opciones del directorio debemos de tener en cuenta, que para dicho directorio están por encima de las opciones indicas en el principio del fichero(primera parte), es decir, en la primera parte hemos indicado algunas opciones que son las generales para todo el ftp, pero si queremos añadir alguna opción especial, incluso una opción que contradiga a una expuesta en el principio, únicamente con añadirla dentro de la etiqueta Directory, ese directorio automáticamente tomara esas propiedades y no las indicadas en la primera parte. Podemos añadir las siguientes opciones:

  • Limitar el TIPO de acceso al directorio, siendo TIPO la opción READ(acceso lectura), WRITE(permite modificaciones sobre directorios existentes), STORE(permite escribir nuevos datos) y por ultimo LOGIN(quien puede acceder). Después debemos de indicarles 'para quienes' tiene ese acceso de 2 formas muy faciles, AllowAll(acceso todos) y DenyAll(deniegas a todos). Si deseamos una especificación mayor seria con Allow/Deny from ip1,ip2,ip3. Debemos de tener en cuenta que esta etiqueta también podemos usarla en la 1ª parte para impedir que cieras ip puedan conectarse al ftp. Por ultimo indicar que la etiqueta Allow/DenyAll viene realmente de la opción Allow/Deny from All asi como podemos indicarle con la opción Order primero,segundo el orden a seguir a la hora de leer que esta aceptado o rechazado, por ejemplo Order deny,allow primero cargara las direcciones Deny y luego las de Allow:



para quienes

  • Hay que tener en cuenta, que si no indicamos nada, el toma como Limit READ WRITE STORE con el valor DenyAll y la opción de LOGIN como AllowAll, encarga esta tarea al motor de comprobación de contraseña de nuestro usuario.

  • La siguiente opción del directorio es la de indicarle si se permite sobreescribir ficheros existentes, debemos de tener acceso de WRITE y STORE para ello:

AllowOverwrite off/on

El valor predeterminado es off.
  • Por ultimo la opción que podemos añadir es indicarle nuestra mascara de permisos(funciona al contrario que la forma típica de dar permisos del chroot)

Umask XXX

Tercera parte: 
  • El servidor anónimo es una etiqueta parecida a Directory pero con unas propiedades muy especificas. Estas son la de permitir el acceso al ftp sin contraseña con el usuario predeterminado: "anonymous". Dicho servicio lo creamos añadiendo la siguiente etiqueta:


User ftp
Group nogroup
UserAlias anonymous ftp
Opciones especificas

propiedades del directorio, ver segunda parte



  • Las opciones específicas están explicadas anteriormente, por ello listare las opciones que tiene este ftp tan especial:

AccessGrantMsg
AccessGrantMsg "mensaje"
RequireValidShell off/on
MaxClients X
MaxClientsPerHost X
MaxClientsPerUser X
  • Debemos de saber que la etiqueta anonymous no se considera un usuario, por lo que imaginaros que deseamos en estos momentos, tener únicamente acceso anónimo y no permitir acceso privado, pues en vez de comentar la 2ªparte o borrarla podríamos poner la siguiente etiqueta "Limit" para que solo pueda conectarse anónimamente(anonymous) indicando LOGIN a DenyALL:


DenyAll


  • Lo ultimo en este punto, es comentar que en los mensajes así como en la creación de logs, como veremos en el ejemplo siguiente podemos añadirle variables que tiene información que podemos usar a la hora de mostrar mensaje, dichas variables están asignadas con la terminología %letra, por ejemplo:

%m: numero de usuarios conectados al ftp
%u: nombre del usuario que se ha logueado
%t: fecha/hora a la que se logueo el usuario

Ejemplo
Un ejemplo para un servidor proftpd que permite acceso anónimo (/ftp/anonimo) y acceso privado(/ftp/) con un directorio especifico para subir información al servidor(/ftp/subir):

$sudo vi /etc/proftpd/proftpd.conf

ServerName "FTP Server"
ServerType standalone
DeferWelcome off
ServerIdent on "Servidor ftp"

DefaultServer on
ShowSymlinks off
AllowOverwrite off

AllowRetrieveRestart yes
AllowStoreRestart yes

DirFakeGroup on
DirFakeUser on ftp
DirFakeMode 0777

TimeoutNoTransfer 600
TimeoutStalled 100
TimeoutIdle 200

DenyFilter \*.*/

Port 21

MaxInstances 2

AccessGrantMsg "-= Bienvenido %u, tu acceso ha sido realizado correctamente =-"
AccessDenyMsg "Estas intentando acceder a un servidor privado, tus datos de conexión han sido grabados, salga inmediatamente"

LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
LogFormat write "%h %l %u %t \"%r\" %s %b"
TransferLog /var/log/proftpd/transfer
ExtendedLog /var/log/proftpd/proftpd.down_up_log WRITE,READ write
ExtendedLog /var/log/proftpd/proftpd.auth_log AUTH auth
ExtendedLog /var/log/proftpd/proftpd.paranoid_log ALL default

DefaultRoot ~
AuthUserFile "/etc/passwd"
AuthGroupFile "/etc/group"

DefaultRoot ~

MaxClients 6 "Perdona, max %m usuarios -- Prueba después"
MaxClientsPerHost 2 "Solo 2 conexiones por HOST"
MaxClientsPerUser 2 "Solo 2 conexiones por usuario"

RequireValidShell off


Order deny,allow
Deny from 192.16.0.1, 192.16.0.5
Allow from all



Umask 022
AllowOverwrite off


AllowAll




Umask 022
AllowOverwrite on


DenyAll



AllowAll





AccessGrantMsg "-= Bienvenido al FTP anonimo =-"
User ftp
Group nogroup

UserAlias anonymous ftp

RequireValidShell off

MaxClients 5
MaxClientsPerHost 1
MaxClientsPerUser 5


Umask 077 077

AllowOverwrite off





Los directorios deben de estar creados con los pertinentes permisos, mirando el ejemplo anterior, los directorios creados y los permisos que deberiamos haberle otorgado serian los siguientes:

$sudo mkdir /ftp
$sudo mkdir /ftp/anonimo
$sudo mkdir /ftp/subir
$sudo chmod 755 /ftp
$sudo chmod 755 /ftp/anonimo
$sudo chmod 777 /ftp/subir

Para añadir el demonio proftpd en el runlevel y por tanto para que arranque cuando iniciemos nuestra maquina, unicamente deberemos de introducir el siguiente comando:
$sudo rc-update add proftpd default
Si disponemos de un fichero de iptables deberiamos de añadir las siguientes reglas a nuestro script:

Archivo: mi.script.iptables.sh

...
$iptables -N FLOODFTP
$iptables -A FLOODFTP -m limit --limit 4/s --limit-burst 5 -j RETURN
$iptables -A FLOODFTP -j LOG --log-level info --log-prefix 'DoS FTP: ' 
$iptables -A FLOODFTP -j DROP
$iptables -A INPUT -p tcp --dport 21 -f -j DROP
$iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j FLOODFTP
$iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j LOG --log-level info --log-prefix 'FTP: ' 
$iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
...

Para arrancar nuestro ftp deberemos de hacer lo siguiente:
$sudo /etc/init.d/proftpd start

Para reiniciarlo:
$sudo /etc/init.d/proftpd restart

Para pararlo:
$sudo /etc/init.d/proftpd stop

Creación/Eliminaciín de cuentas
La creación de usuarios la haremos como si fuera una creación de un usuario cualquiera, indicándole que nuestro directorio es el del ftp y nuestro shell es una shell falsa, como por ejemplo /bin/false:

$sudo adduser -d /directorioftp -s /bin/false nombre_usuario && passwd nombre_usuario

Para eliminar un usuario seria la siguiente orden:
$sudo userdel nombre_usuario

Para saber en que momento cuantos, quienes y que operaciones estan realizando los usuarios en su servidor ftp, existen 2 pequeñas utilidades que permiten mostrarselo:

$ftpwho
$ftptop

Para expulsar a algun usuario del servidor ftp, unicamente deberemos de matar el proceso que identifica al usuario. Para ver el PID o numero identificativo del proceso correspondiente a ese usuario, podemos usar el 'ftpwho'(es el 1 valor, es un numero normalmente de 4 a 5 cifras) o usar el comando 'ps aux'en el cual el PID es el 2 valor de la tabla. Para matar el proceso deberemos de escribir lo siguiente:
$sudo kill -9 PID

// -9 == SIGKILL, es recomendable mandar SIGTERM == -15, para que así sea el mismo proceso el que termine y así no tener que matarlo, siempre que se pueda

Si deseamos cerrar el ftp momentaneamente y queremos a su vez que nuestros usuarios sepan que el servidor esta cerrado momentaniamente existe el comando 'ftpshut tiempo "mensaje"', por ejemplo para cerrar el ftp y dejar un mensaje identificativo en el caso de mantenimiento del servidor seria de la siguiente forma:

$sudo ftpshut now "El servidor se encuentra cerrado por motivos tecnicos"
Para levantar el servidor despues de haber realizado el mantenimiento. Teclea: ftpshut -R

CREAR CUENTA DE USUARIO


Nos conectamos a la maquina
$ssh sysadmin@ftp o tambien $sysadmin@192.168.33.39
Nos ponemos como superusuario
$sudo su -
Creamos el usuario
$adduser usuario --shell /bin/false -home /ftp/usuario
Rellenamos aunque no es necesario los datos que nos pide para crear el usuario
Comprobamos que se ha creado el directorio
$ls -l /ftp
Asignamod los permisos al directorio
$chmod 7750 /ftp/usuario
comprobamos los ficheros de usuarios y grupos
$less /etc/passwd
$less /etc/group
Volcamos el contenido al /etc/shadow $pwconv
Ponemos la contraseña al usuario creado
$passwd usuario
Para crear un usuario de solo lectura tenemos que hacer lo siguiente
$vi /etc/passwd
Pongo diferente nombre, diferente id y mismo grupo
Ejemplo fichero /etc/passwd
...sirasa:x:1036:1026:,,,:/ftp/sirasa:/bin/false
lsirasa:x:1037:1026:,,,:/ftp/sirasa:/bin/false
...

$vi /etc/group
...sirasa:x:1026:lsirasa
...
Volcamos el contenido al /etc/shadow
$pwconv
Ponemos la contraseña al usuario creado lsirasa
$passwd lsirasa
Ejemplo con las universidades
$vi /etc/passwd...
universidad:x:1095:1064:,,,:/ftp/universidad:/bin/false
unipalencia:x:1096:1064:,,,:/ftp/universidad:/bin/false
univalladolid:x:1097:1064:,,,:/ftp/universidad:/bin/false
...
$vi /etc/group
...
universidad:x:1064:unipalencia,univalladolid
...
Para borrar un directorio completamente junto con su contenido y al usuario
$rm -fr /ftp/usuario
$userdel usuario

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.