Vous êtes sur la page 1sur 9

El presente tutorial es para configurar un servidor de ftp y sftp usando una

base de datos mysql para los usuarios y ademas permitiendo el uso de llaves
ssh para la autentificacion,
esta basado en varios tutoriales que encontre por la web. Todo esto esta
pensado en ubuntu server 14.04 debido a que fue lo que me toco implementar
en el trabajo.
Referencias originales:
http://www.linuxlasse.net/linux/howtos/ProFTPD_with_virtual_users_in_MySQL
http://blog.endpoint.com/2012/12/sftp-virtual-users-with-proftpd-and.html
https://www.digitalocean.com/community/tutorials/how-to-configure-proftpd-touse-sftp-instead-of-ftp
http://www.proftpd.org/docs/howto/SQL.html
http://www.proftpd.org/docs/howto/Debugging.html
Primera parte: ftp con usuarios virtuales en Mysql
sudo apt-get install mysql-server mysql-client
luego el proftpd y sus dependencias
sudo apt-get install proftpd-basic proftpd-mod-mysql
Creamos un grupo y un usuario local, los cuales necesitamos debido a que
usaremos el UID y el GID en la base de datos mysql
Creamos el grupo
sudo groupadd ftpusers
Creamos el usuario sin carpeta home, ni shell, y lo agregamos al grupo anterior
sudo useradd -s /bin/false -d /dev/null -g ftpusers ftpuser
Ahora obtenemos el UID para el ftpuser y el GID ftpusers
grep ftp /etc/passwd /etc/group
Lo cual nos devuelve algo como esto
/etc/passwd:ftp:x:109:65534::/home/ftp:/bin/false
/etc/passwd:proftpd:x:108:65534::/var/run/proftpd:/bin/false
/etc/passwd:ftpuser:x:1001:1001::/dev/null:/bin/false
/etc/group:ftpusers:x:1001:

podemos ver que el usuario ftpuser tiene un UID de 1001, y el grupo ftpusers
un GID of 1001. Anotar ambos id
Ahora crearemos una base MySQL llamda proftpd, donde el usuario es proftpd
y su contrasea es is proftpd.2015.
Se debe cambiar estos parametora a gustos del consumidor, ademas el UID y
GID deben ser los valores correspondientes a su sistema.
Copiar los compando sql a continuacion y grabarlos como ftp.sql en el servidor.
O pueden usar una administrador mysql como workbench
o phpmyadmin
DROP DATABASE IF EXISTS proftpd;
CREATE DATABASE proftpd;
USE proftpd;
CREATE TABLE users (
userid VARCHAR(30) NOT NULL UNIQUE,
passwd VARCHAR(80) NOT NULL,
uid INTEGER default 1001,
gid INTEGER default 1001,
homedir VARCHAR(255),
shell VARCHAR(255) default NULL,
LoginAllowed BOOLEAN default 1
);
CREATE TABLE groups (
groupname VARCHAR(30) NOT NULL,
gid INTEGER NOT NULL,
members VARCHAR(255)
);
GRANT ALL ON proftpd.* TO proftpd@'localhost' IDENTIFIED BY 'proftpd.2015';
Importamos el archivo al servidor MySQL.
mysql -u root -p < ftp.sql
Creamos el grupo ftpusers en MySQL y agregamos el usario ftpuser al grupo, al
igual que hicimos en el sistema.
mysql -u proftpd -p
USE proftpd;
INSERT INTO groups (groupname, gid, members) VALUES ("ftpusers", 1001,
"ftpuser");
Ahora creamos los usuarios en la base MySQL.

INSERT INTO users (userid, passwd, homedir) VALUES ("oveja",


PASSWORD("oveja.2015"), "/ftp/oveja");
INSERT INTO users (userid, passwd, homedir) VALUES ("pato",
PASSWORD("pato.2015"), "/ftp/pato");
Con esto el mysql queda "listo" a lo menos para el ftp. Toca configurar el
proftpd
Primero configuramos los modulos
sudo vim /etc/proftpd/modules.conf
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
luego configuramos el mod sql
sudo vim /etc/proftpd/sql.conf
<IfModule mod_sql.c>
SQLBackend mysql
#El parametro SQLAuthTypes define el formato del campo passwd, aca use
Backend, de forma de poder utilizar la funcion password de mysql directamente
# para ver otros formatos disponibles
http://www.proftpd.org/docs/contrib/mod_sql.html#SQLAuthTypes
SQLAuthTypes Backend Crypt
SQLConnectInfo proftpd@localhost proftpd proftp.2015
SQLUserInfo users userid passwd uid gid homedir shell
SQLGroupInfo groups groupname gid members
SQLUserWhereClause "LoginAllowed = '1'"
</IfModule>
ahora la configuracion principal, verificar al menos los siguiente parametros
sudo vim /etc/proftpd/proftpd.conf
#Desactivamos el soporte ipv6
UseIPv6 of
#enjaulamos al usuario en su home
DefaultRoot ~
#desactivamos el uso obligatorio de shell
RequireValidShell Of
#puerto para el ftp
Port 21
#puertos para el modo pasivo
PassivePorts 50000 51000

#mascara de creacion de archivos, permitimos que el usuario y el grupo


tengan control total
Umask 002 002
#forzamos a que solo utilize sql para validar las contraseas
AuthOrder mod_sql.c*
#formato de log custom
LogFormat miformato "%t [%h] [%u] [%r] [%s-%S] [%{transfer-status}] [%
{transfer-failure}]"
#habilitamos el log extendido con el formato custom
ExtendedLog /var/log/proftpd/extended.log ALL miformato
#habilitamos el soporte sql
Include /etc/proftpd/sql.conf
#permisos de creacion automatica de directorios sino existen, muy util.
CreateHome on 770 dirmode 770 uid ~ gid ~
#Necesario apra ciertos clientes complidados
<IfModule mod_facts.c>
FactsAdvertise of
</IfModule>
#necesario para los clientes de wintendo que usan \ en las rutas....
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteMap replace int:replaceall
RewriteCondition %m "^(CWD|XCWD|MKD|XMKD|RMD|XRMD|APPE|STOR|RETR|
LIST|NLST)$"
RewriteRule ^(.*) "${replace:!$1!\\!/}"
# RewriteLog /var/log/proftpd/rewrite.log
</IfModule>
iniciamos proftpd
sudo service proftpd start
Finalmente probamos desde la linea de comandos
ftp> o 192.168.1.2
Connected to 192.168.1.2.
220 ProFTPD 1.3.5rc3 Server (Debian) [192.168.1.2]
Name (192.168.1.2:sconf): oveja
331 Password required for oveja
Password:
230 User oveja logged in
y al realizar un ls vemos que se creo la carpeta personal de oveja
ls -lah /ftp/oveja

drwxrwx--- 2 ftpuser ftpusers 4,0K ago 6 15:38 .


drwxrwx--- 3 ftpuser ftpusers 4,0K ago 6 15:38 ..
Con esto finalizamos la primera parte, configurar el ftp con usuarios virtuales
en mysql.
Segunda parte: sftp con usuarios virtuales en mysq + llaves.
El proceso en general es bastante parecido al anterior, la unica diferencia es
que se debe usar la directiva virtualhost para configurar
este servidor sftp en paralelo al ftp.
Creamos un grupo y un usuario local, los cuales necesitamos debido a que
usaremos el UID y el GID en la base de datos mysql
Creamos el grupo
sudo groupadd sftp_users
Creamos el usuario sin carpeta home, ni shell, y lo agregamos al grupo anterior
sudo useradd -s /bin/false -d /dev/null -g sftp_users sftp_user
Ahora obtenemos el UID para el sftp_user y el GID sftp_users
grep sftp /etc/passwd /etc/group
Lo cual nos devuelve algo como esto
/etc/passwd:sftp_user:x:1002:1002::/dev/null:/bin/false
/etc/group:sftp_users:x:1002:
podemos ver que el usuario sftp_user tiene un UID de 1002, y el grupo
sftp_users un GID of 1002. Anotar ambos id
Crearemos 2 tablas nuevas para el sftp en la base creada anteriormente,
recordar ademas el UID y GID deben ser los valores
correspondientes a su sistema.
Los comandos sql a utilizar son los siguientes
USE proftpd;
CREATE TABLE sftp_users (
sftp_username VARCHAR(30) NOT NULL UNIQUE,
sftp_passwd VARCHAR(80) NOT NULL,
sftp_uid INTEGER default 1002,
sftp_gid INTEGER default 1002,
sftp_homedir VARCHAR(255),
sftp_shell VARCHAR(255) default NULL,
LoginAllowed BOOLEAN default 1

);
CREATE TABLE sftp_groups (
sftp_groupname VARCHAR(30) NOT NULL,
sftp_gid INTEGER NOT NULL,
sftp_members VARCHAR(255)
);
Creamos el grupo sftp_users en MySQL y agregamos el usario sftp_user al
grupo, al igual que hicimos en el sistema.
mysql -u proftpd -p
USE proftpd;
INSERT INTO sftp_groups (sftp_groupname, sftp_gid, sftp_members) VALUES
("sftp_users", 1002, "sftp_user");
Ahora creamos los usuarios en la base MySQL.
INSERT INTO sftp_users (sftp_username, sftp_passwd, sftp_homedir) VALUES
("oveja", PASSWORD("oveja.2015"), "/sftp/oveja");
INSERT INTO sftp_users (sftp_username, sftp_passwd, sftp_homedir) VALUES
("pato", PASSWORD("pato.2015"), "/sftp/pato");
Ahora modificamos la configuracion principal
sudo vim /etc/proftpd/proftpd.conf
Agregamos lo siguiente al final del archivo
<IfModule mod_sftp.c>
#creamos un nuevo host virtual
<VirtualHost 0.0.0.0>
#Activamos SFTP
SFTPEngine on
#el puerto de nuestro servidor sftp
Port 2222
#configuraciones de log
SFTPLog /var/log/proftpd/sftp.log
#desactivamos la necesidad de shell
RequireValidShell of
#enjaulamos al usuario
DefaultRoot ~
#permisos totales para el dueo y el grupo

Umask 002 002


#permisos de creacion automatica de directorios
CreateHome on 770 dirmode 770 uid ~ gid ~
#llaves ssl
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_dsa_key
#metodos aceptados por el sftp
SFTPAuthMethods publickey password
#donde se almacenaran las llaves
SFTPAuthorizedUserKeys file:~/.ssh/authorized_keys
#forzamos a que busque la password en sql
AuthOrder mod_sql.c*
#parametro necesario
SFTPCompression delayed
#habilitamos el uso sql
SQLAuthenticate on
#metodos de autorizacion sql
SQLAuthTypes OpenSSL Backend Crypt
#mapeamos nuestras tablas y campos
SQLUserInfo sftp_users sftp_username sftp_passwd sftp_uid sftp_gid
sftp_homedir sftp_shell
SQLGroupInfo sftp_groups sftp_groupname sftp_gid sftp_members
#con esto podemos habilitar y deshabilitar a voluntad
SQLUserWhereClause "LoginAllowed = '1'"
#datos de conexion ala base
SQLConnectInfo proftpd@localhost proftpd proftpd.2015
#habilitamos el backend mysql
SQLBackend mysql
</VirtualHost>
</IfModule>
reiniciamos proftpd
sudo service proftpd restart
probamos de la consola
sftp -P 2222 pato@192.168.1.2

The authenticity of host '[192.168.1.2]:2222 ([192.168.1.2]:2222)' can't be


established.
RSA key fingerprint is c1:85:5b:5d:ad:d9:00:96:84:2e:1f:3e:1d:72:6f:e0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.1.2]:2222' (RSA) to the list of known
hosts.
pato@192.168.1.12's password:
Connected to 192.168.1.12.
sftp> ls
sftp>
y al realizar un ls vemos que se creo la carpeta personal de pato
ls -lah /sftp/pato/
total 8,0K
drwxrwx--- 2 sftp_user sftp_users 4,0K ago 6 16:11 .
drwxrwx--- 3 sftp_user sftp_users 4,0K ago 6 16:11 ..
para la autentificacion por llave en vez de password es necesario utilizar el
formato RFC4716 por lo cual ejecutamos el comando
ssh-keygen -e -f ~/.ssh/id_rsa.pub > authorized_keys
subimos el archivo authorized_keys a nuestro servidor sftp (usando la
contrasea)
sftp -P 2222 pato@192.168.1.2
pato@192.168.1.2's password:
Connected to 192.168.1.2.
sftp> mkdir .ssh
sftp> cd .ssh
sftp> lcd /home/sconf
sftp> put authorized_keys
Uploading authorized_keys to /.ssh/authorized_keys
authorized_keys
sftp> exit
y ahora conectamos pero con llave
sftp -P 2222 -o IdentityFile=~/.ssh/id_rsa pato@192.168.1.2
Connected to 192.168.1.2.
sftp> exit
al intentar lo mismo con oveja nos pide la clave
ftp -P 2222 -o IdentityFile=~/.ssh/id_rsa oveja@192.168.1.2
oveja@192.168.1.2's password:
Espero que a alguno le sirva esta guia

Vous aimerez peut-être aussi