Linux Guia ProFTPD con usuarios virtuales en MySQL + SFTP y Llaves

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.396
ProFTPD con usuarios virtuales en MySQL + SFTP y Llaves

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-to-use-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

primero instalamos mysql si es que no esta ya instalado

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 contraseña 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 off

#enjaulamos al usuario en su home
DefaultRoot ~

#desactivamos el uso obligatorio de shell
RequireValidShell Off

#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 contraseñas
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 off
</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 off

#enjaulamos al usuario
DefaultRoot ~

#permisos totales para el dueño 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 [email protected]
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.
[email protected]'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 contraseña)
sftp -P 2222 [email protected]
[email protected]'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 [email protected]
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 [email protected]
[email protected]'s password:


Espero que a alguno le sirva esta guia
 

Rudel

Overclockero retirado.
Se incorporó
28 Octubre 2004
Mensajes
8.727
Muy bueno .. lo guardaré por si me toca implementar algo así :)
Salu2.
 
Upvote 0

Miguelwill

Space xeno-hunter
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.252
Excelente guía

Has usado ispconfig ?
Trae pure-ftpd-mysql, y usa una configuración similar para las cuentas ftp, enmascarando el acceso ftp con el UID del usuario asignado a un sitio puntual :D

Enviado desde mi XT1058 mediante Tapatalk
 
Upvote 0

Miguelwill

Space xeno-hunter
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.252
el otro dia me ayudaron las instrucciones a copiar un server que ya estaba usando un ftp de forma similar, pero que usaba campos de "last login" , para que funcionara le quite esos campos y la query que se ejecutaba, y despues funciono sin problemas :p
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.396
Como nota esta guia ya no sirve en ubuntu 16.04, gracias a la actualizacipn a mysql server 5.7 por defecto el tema de las contraseñas ya no funciona, solo funcionan en texto plano :naster. Vere como solucionarlo y actualizare la guia
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
777
Hola, una consulta... como concepto, ¿al configurar sftp en proftp debe si o si ser configurado con llaves??
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.396
no, de echo si te fijas en la seccion en que configure el sftp se coloca que mecanismos de autenticacion soporta

#metodos aceptados por el sftp
SFTPAuthMethods publickey password

basta quitar el publickey y con eso solo funciona con contraseñas.
 
Upvote 0
Subir