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

Tema en 'Sistemas Operativos' comenzado por Soujiro, 6 de Agosto de 2015.

Watchers:
This thread is being watched by 6 users.
  1. Soujiro

    Soujiro Pro

    Se incorporó:
    14 de Enero de 2008
    Mensajes:
    717
    Me gusta recibidos:
    389
    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 [email protected]'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 [email protected] 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 [email protected] 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
     
    A p_s_x, nibal2, Pato y 2 otros les gusta esto.
  2. Rudel

    Rudel Overclockero retirado. Miembro del Equipo MOD Old School

    Se incorporó:
    28 de Octubre de 2004
    Mensajes:
    8.357
    Me gusta recibidos:
    3.310
    Muy bueno .. lo guardaré por si me toca implementar algo así :)
    Salu2.
     
  3. EITSAEB

    EITSAEB Team Peacemaker Hater Old School

    Se incorporó:
    10 de Septiembre de 2006
    Mensajes:
    4.291
    Me gusta recibidos:
    1.282
    :eek tremenda pega. Muy buena guía. Gracias.
     
  4. miguelwill

    miguelwill Matrix Operator Miembro del Equipo MOD Old School

    Se incorporó:
    23 de Febrero de 2004
    Mensajes:
    9.958
    Me gusta recibidos:
    1.650
    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
     
  5. miguelwill

    miguelwill Matrix Operator Miembro del Equipo MOD Old School

    Se incorporó:
    23 de Febrero de 2004
    Mensajes:
    9.958
    Me gusta recibidos:
    1.650
    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
     
  6. Soujiro

    Soujiro Pro

    Se incorporó:
    14 de Enero de 2008
    Mensajes:
    717
    Me gusta recibidos:
    389
    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
     
    A Pato le gusta esto.
  7. epic

    epic Capo

    Se incorporó:
    11 de Febrero de 2007
    Mensajes:
    455
    Me gusta recibidos:
    0
    Hola, una consulta... como concepto, ¿al configurar sftp en proftp debe si o si ser configurado con llaves??
     
  8. Soujiro

    Soujiro Pro

    Se incorporó:
    14 de Enero de 2008
    Mensajes:
    717
    Me gusta recibidos:
    389
    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.
     
  9. epic

    epic Capo

    Se incorporó:
    11 de Febrero de 2007
    Mensajes:
    455
    Me gusta recibidos:
    0
    ah oka, sorry lo lei a la rapida...
     
  10. dj_alone

    dj_alone Miembro Regular

    Se incorporó:
    17 de Septiembre de 2008
    Mensajes:
    34
    Me gusta recibidos:
    3
    Se agradece el aporte.
     
  11. miguelwill

    miguelwill Matrix Operator Miembro del Equipo MOD Old School

    Se incorporó:
    23 de Febrero de 2004
    Mensajes:
    9.958
    Me gusta recibidos:
    1.650
    ya
    ahora hay que meter todo eso en un Dockerfile y meterlo a dockerhub para que la comunidad tenga su retribución :D

    edit: buscando parece que a alguien ya se le ocurrio xD
    https://hub.docker.com/r/pockost/proftpd
     
  12. epic

    epic Capo

    Se incorporó:
    11 de Febrero de 2007
    Mensajes:
    455
    Me gusta recibidos:
    0
    Gracias ya quedo configurado en Centos 7
     

Comparte esta página

Cargando...