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)