Anterior Siguiente Inicio

2. Servidor de FTP

El servidor de ftp elegido fue Proftpd, para aprovechar una aplicación escrita en php que se llama ProMA (Proftpd MySQL Admin). Proftpd se baja de su web oficial, y el mod para SQL se baja de aquí, o de google ;-) (aunque creo que en las últimas versiones de proftpd ya viene incluído)
Debemos tener instaladas las fuentes de mysql (a ser posible las que vienen con nuestra distribución, y especificarle las rutas de las fuentes y de las bases de datos:

./configure --with-modules=mod_sql:mod_sql_mysql --with-includes=/usr/include/mysql --with-libraries=/usr/lib/mysql
make && make install

Tras esto, debemos configurar proftpd. Usaremos el fichero proftpd.conf, el cual contendrá lo siguiente:
 
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use.  It establishes a single server
# and a single anonymous login.  It assumes that you have a user/group
# "nobody/nogroup" and "ftp" for normal operation and anon.

ServerName                      "Nombre de nuestro servidor"
ServerType                         standalone   # método de inicio; standalone o desde inetd
DeferWelcome                    on   # Con esto activado, no mostraremos información sobre nuestro equipo hasta que el usuario haga login

MultilineRFC2228 on   # No activado por defecto, pero ésto aumentará la compatibilidad con clientes
DefaultServer                   on      # Tratar como default las conexiones para las que no tengamos un "virtual host"
ShowSymlinks                    on

TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200

DisplayLogin                    welcome.msg     #mensaje de bienvenida
DisplayFirstChdir               .message         #mensaje al cambiar de directorio
ListOptions                     "-l"                      #opciones de "ls"

DenyFilter                      \*.*/

# Port 21 is the standard FTP port.
Port                            21

MaxClientsPerHost       3   # Clientes máximos por ip
MaxClients                    5   # Máximo total de clientes

# To prevent DoS attacks, set the maximum number of child processes

# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances 30

# Set the user and group that the server normally runs at.
User                            nobody
Group                           nogroup

<Directory /home/ftp/*>
        AllowOverwrite off
        HideNoAccesson         #Bloquea el listado de entradas para las que el usuario no tenga permisos
   <Limit READ>
         AllowAll       #Permitimos leer a todo el mundo en el directorio /home/ftp
   </Limit>
   <Limit Write>
         DenyAll        #Impedimos la escritura en el mismo
   </Limit>
</Directory>

<Directory /home/ftp/incoming/*>
        AllowOverwrite   on
   <Limit STOR CMD MKD WRITE>
         AllowALL               #Permitimos subir, crear directorios, etc
   </Limit>
   <Limit RETR DELE>            #Impedimos bajar o borrar
         DenyALL
   </Limit>
</Directory>

TransferRate RETR 2:1024 user !usuario      #Limitamos la velocidad de descarga a 2 KB/seg excepto para ficheros menores de 1 KB, o para "usuario"
TransferRate APPE,STOR 15:1024 user usuario   #Limitamos velocidad de subida a 15 KB/s para "usuario", excepto para menores de 1 KB

#    Deszonozco la manera de aplicar estas reglas a varios usuarios, quizás añadiendo los necesarios a un grupo, y estableciendo por grupos los "transfer rates"

<Global>

RootLogin off
RequireValidShell off
DefaultRoot     ~   #Con esto limitamos que cada usuario vea como raíz su directorio personal
</Global>
UseReverseDNS off   # Aceleramos las conexiones al evitar la resolución inversa

SyslogLevel     info  
SystemLog       /var/log/proftpd.log      #guardamos los logs en este fichero

# SQL options

SQLConnectInfo        proma@127.0.0.1 proftpd miclave    #  basedatos@host usuario contraseña

SQLAuthenticate       users*
SQLUserInfo           users userid passwd uid gid homedir shell
SQLGroupInfo          groups groupname gid members
SQLLog                PASS updatecount
SQLNamedQuery         updatecount UPDATE "count=count+1 WHERE userid='%u'" users
          SQLAuthTypes  Backend   # The MySQL backend uses this type to authenticate MySQL 'PASSWORD()' encrypted passwords
          
# Ejemplo: SQLAuthTypes Crypt Plaintext Empty (en este caso intentaría autentificar usando la función crypt(3), luego intentaría con texto plano, y luego comprobaría si la clave es nula. En caso de no funcionar ninguno de los 3 métodos, fallaría la autentificación

#Adicionalmente podemos usar "
SQLHomedirOnDemand on", con lo que se creará el directorio del usuario una vez se haga login. Esto puede ser útil para que si cambiamos el directorio de un determinado usuario en la base de datos, automáticamente se cree dicho directorio.


# It is a very good idea to allow only filenames containing normal
# alphanumeric characters for uploads (and not shell code...)
PathAllowFilter ^[A-Za-z0-9._-]+$

# We don't want welcome.msg, .message, .ftpaccess or .htaccess files to be uploaded
PathDenyFilter "welcome.msg|.message|(\.ftp)|(\.ht)[a-z]+$"   #Solo admite una línea; las posteriores son ignoradas. Usamos el operador OR para arreglar esto

# Do not allow to pass printf-Formats (security! see documentation!):
AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$"
DenyFilter  "%"


Crear Base de Datos:

Ahora debemos crear la base de datos que proma usará.

Accedemos a mysql con el comando "mysql". En caso de que mysql no nos deje acceder, podemos intentar lo siguiente:

mysql -p   # Con ésto hacemos que mysql nos pida una clave (en caso de que la hayamos establecido)

mysqld --skip-grant-tables -u mysql & #Con ésto ejecutamos el servidor de mysql de forma que nos permite acceder desde línea de comandos (debemos pararlo previamente si se                                                                 # está ejecutando)



Una vez dentro, creamos la base de datos y accedemos a la misma
CREATE DATABASE proma
USE proma

Creamos las tablas necesarias:

CREATE TABLE users (
  userid varchar(255) NOT NULL UNIQUE,
  name varchar(255) NULL,
  mail varchar(255) NULL,
  uid int(11) NULL default '65534',
  gid int(11) NULL default '65534',
  passwd varchar(255) NOT NULL,
  shell varchar(255) NOT NULL default '/bin/nonexistent',
  homedir varchar(255) NOT NULL default '/some/fancy/homedir',   # Aquí pondremos el directorio por defecto para el ftp
  note text NULL default '',
  count int(11) NOT NULL default 0,
  admin int(1) NOT NULL default 0,
  closed int(1) NOT NULL default 0
);

Ahora creamos la cuenta de administrador:

INSERT INTO
  users
SET
  userid = 'tu_id_admin',
  passwd = PASSWORD('tuclave'),
  name = 'The Boss',
  mail = 'ftpmaster@servidor',
  admin = 1;

Y por último damos permisos al usuario proftpd para que acceda a la base de datos: (serán los que use proftp para acceder)

GRANT ALL on proma.* TO MiNombreUsuario@MiComputadora IDENTIFIED BY 'MiContraseña';

Configurar Proma:

Ahora solo nos queda descomprimir y configurar proma:
Como está todo bastante bien explicado en el fichero de configuración, me limitaré a indicar que lo más importante es cambiar el directorio del ftp:

$users_homedir_default = "/home/ftp";

y alguna información sobre nuestro servidor:

$info_host    = "ftp.mi-servidor.com";

Con ésto ya tenemos configurado nuestro servidor de FTP.


Adicionalmente podemos guardar logs u otras cosas...

Creamos la tabla en mysql

    create table files(
Usuario varchar(25),Fichero varchar(255),Bytes numeric,Host char(15),Metodo char(10),Tiempo numeric,Fecha date);


Y añadimos las directivas en proftpd.conf

    SQLLOG                STOR,RETR,DELE transfers      # Queremos que registre ficheros enviados, recibidos usando la directiva "transfers" definida a continuación
    SQLNamedQuery         transfers INSERT "'%u', '%f', '%b', '%a', '%m', '%T', now()" files   #Guardamos en la tabla files lo siguiente: Usuario, Fichero, Bytes, Dirección ip, Acción,                                                                                                                                                         #Tiempo, Fecha

Queda pendiente hacer algún botón en la web de proma para poder borrar los logs viejos.


Anterior Siguiente Inicio