imagen

Vsftpd con FreeBSD para clientes como usuarios virtuales

28.Apr.2017 — Julio

REPOSITORIO DE FACTURAS Y DOCUMENTOS PARA SOCIOS

Se trata de que el socio pueda acceder a través de la página web de la empresa a una carpeta personal donde poder descargar sus facturas electrónicas, hojas de cálculo con sus datos relevantes, etc..

El socio ya tenía hasta desde hace años la posibilidad de obtener todo ello mediante emails automáticos o consultas solicitadas en la web con respuesta de datos en tiempo real, y lo que se aporta ahora es un repositorio privado donde almacenar todos esos datos.


No se le obligará a instalar ningún software ftp cliente sino que accederá siempre mediante el navegador, desde la propia página de web.

iconolink

  • utilizaremos un servidor ftp, se escoge el software vsftpd por su seguridad y rapidez, bajo el sistema operativo FreeBSD hospedado con servicios cloud.
  • el socio accederá a través de la página web, y a partir de allí con un link con una password hash. El password, para aumentar algo la seguridad, se renovará cada mes sin necesidad de intervención del socio, pues no necesita saberla.

Ejemplo proceso generación .zip de todas las facturas de un año

  • generar todas las facturas en formato XML de aquellos socios con facturación electrónica
  • conversión de XML a HTML
  • creación de .ZIP con todos los HTML
  • creación fichero hoja de cálculo desglose de facturas en formato XLS
  • subida a carpeta personal del socio del ZIP y el XLS
  • borrado de todos los ficheros XML y HTML y ZIP del servidor local

resultado

Retos a solucionar

  • el propio fichero XML con los datos de la factura y TODOS los albaranes que la conforman.
  • convertirlo a HTML según un XSL para obtener una visualización idéntica a la factura en papel con preimpreso. Solucionado con un programa en Java.
  • creación de un fichero CSV con los datos contables de las facturas y de allí o otro puro XLS con un script en Python.
  • en el servidor ftp crear cientos de usuarios virtuales con sus contraseñas y sus carpetas personales. ++Esas carpetas tendrán permiso solo de lectura por parte del socio.++ Por supuesto no se va a hacer a mano uno a uno sino mediante un script en Bash.
  • un script para Winscp que suba todos esos ficheros cada uno a la carpeta correspondiente de cada socio.
  • los script de creación del .ZIP, y del borrado de todos los ficheros temporales son relativamente simples comparados con los anteriores.
  • la rutina MUMPS que recorra todas las facturas de los socios y que vaya comandando muchos de los puntos anteriores.
  • el cambio automático de contraseña cada mes, tanto en el link de la página web como en el propio servidor ftp.

Cada punto tuvo su rato divertido ;-)

INSTALACION VSFTPD CON USUARIOS VIRTUALES SIN PERMISO DE ESCRITURA Y UNO CON ÉL

Instalaremos vsftpd sobre FreeBsd y utilizaremos usuarios virtuales no locales, pues no hay necesidad de crear a todos los socios como usuarios del servidor, tal solo de usuarios de ftp.

Pero daremos de alta al menos un usuario con permiso de escritura que será el que suba los ficheros.

El proceso de instalar el servidor vsftpd en freeBsd no tiene mucho misterio, si se está acostumbrado a instalar software en equipos linux o BSD, y yo seguí prácticamente esta guia:

http://www.gocit.vn/bai-viet/installing-and-configuring-vsftpd-under-freebsd

El verdadero misterio radica en qué parámetros poner en el fichero de configuración, pues hay varios posts que cuentan la creación de usuarios virtuales (aun así son los que menos circulan por internet) pero todos los usuarios con los mismos permisos (o pueden leer o pueden escribir todos).

Si se lee TODA la documentación de la página de vsftpd entendiendo TODOS los parámetros se puede llegar a deducir la solución correcta al problema de añadir un usuario virtual con permisos distintos. El resumen de mis parámetros son estos:

/usr/local/etc/vsftpd.conf

```  
anonymous_enable=NO  
local_enable=YES  
write_enable=YES  
local_umask=022  
dirmessage_enable=YES  
xferlog_enable=YES  
connect_from_port_20=YES  
nopriv_user=virtual  
chroot_local_user=YES  
chroot_list_enable=YES  
chroot_list_file=/usr/local/etc/vsftpd.chroot_list  
guest_enable=YES  
guest_username=virtual  
user_sub_token=$USER  
local_root=/home/virtual/$USER  
hide_ids=YES  
user_config_dir=/usr/home/virtual/userconfs  
ls_recurse_enable=YES  
secure_chroot_dir=/usr/local/share/vsftpd/empty  
listen=YES  
background=YES  
pam_service_name=vsftpd  
virtual_use_local_privs=YES  
```

para el usuario con permiso escritura /usr/home/virtual/userconfs/usuarioescritura

```  
local_root=/usr/home/virtual  
guest_username=usuarioescritura  
```

/usr/local/etc/vsftpd.chroot_list

```  
usuarioescritura  
```

Estas referencias pueden ser de utilidad para instalar vsftpd en sistemas linux:

http://www.sigerr.org/linux/setup-vsftpd-custom-multiple-directories-users-accounts-ubuntu-step-by-step
https://help.ubuntu.com/community/vsftpd
https://ubuntuforums.org/showthread.php?t=518293&p=3138955

Script para dar de alta los usuarios virtuales y crear sus carpetas

creamd5.sh recibe como parámetro un código de cliente y lo da de alta como usuario virtual del ftp además de crear su carpeta personal en el servidor. Guardo todo en un fichero log.

```  
#!/usr/bin/env sh  
# hay que correr con sudo  
#  
# si queremos crear por primera vez la tabla  
#/usr/local/bin/htpasswd.py -c -d /usr/local/etc/vsftpd_login.db virtual tupassword  
# permisos si la acabamos de crear  
# chmod 0600 /usr/local/etc/vsftpd_login.db  
#  
# damos de alta usuario para virtual users de vsftpd  

echo socio=$1 >>./logcreamd5.txt  
newplain=$1$(date +%-m)ponclavecomplejaquitambien  
echo plain=$newplain>>./logcreamd5.txt  
newpass=`md5 -q -s $newplain`  
echo passw=$newpass>>./logcreamd5.txt  
/usr/local/bin/htpasswd.py -b /usr/local/etc/vsftpd_login.db $1 $newpass  
#  
# creamos carpeta de usuario  
if [ ! -d "/usr/home/virtual/$1/FACTURACION" ]; then  
    echo creamos carpeta socio $1>>./logcreamd5.txt  
    mkdir -p /usr/home/virtual/$1  
    chown -R virtual:nogroup /usr/home/virtual/$1  
    chmod -w /usr/home/virtual/$1  
    # creamos carpeta FACTURACION para usuarioescritura poder subir  
    mkdir -p /usr/home/virtual/$1/FACTURACION  
    chown -R usuarioescritura:nogroup /usr/home/virtual/$1/FACTURACION  
    chmod 755 /usr/home/virtual/$1/FACTURACION  
fi  
```

Y otro script que recorre un fichero con los códigos de socio a crear como usuarios virtuales y que ejecuta por cada uno de ellos el script anterior, pues para crear cientos de clientes es recomendable. Cuidado, con esta forma de correrlo el separador de códigos de cliente es el espacio además del \n.

loopcreamd5.sh

```  
#!/usr/bin/env sh  
echo "+++++" $(date) "*****" > ./logcreamd5.txt  
while read -r socio; do  
    ./creamd5.sh $socio  
done < ./socioscreamd5.txt  
```

Para la creación de la contraseña utilizamos salt y MD5. Cierto que MD5 ya no debería utilizarse pero menos seguridad tiene la página web con la que los socios entran ... merde!
Este script habrá que ponerlo en tareas crontab para que se ejecute el dia 1 de cada mes.

* Hasta aquí lo que tiene que ver con el servidor ftp bajo freeBsd. *

Rutina MUMPS que realiza todo hasta el .zip

ZVZFACFTP hace

  • crea fichero XML
  • lanza programa java para convertir a HTML
  • comprime todos los ficheros a .ZIP
  • lanza rutina mumps que crea fichero excel desglose de facturas
  • lanza script que sube todo a la carpeta del socio
  • elimina XML y HTML

¿quieres un poco de código MUMPS? pues aquí las líneas principales

```  
ZVZFACFTP   ;  
    ; creamos facturas en xml  
    ; luego a html  
    ; comprimimos a zip  
    ; subimos a servidor ftp  
    ; borramos xmls y html  
INI ;  
    D VARIABLES  
    D XML  
    I COMPRIME=1 D COMPRIME  
    I GENERAEXCEL=1 D EXCEL  
    I FTP=1 D FTP  
    I BORRAMOSTEMP=1 D BORRAMOS  
    Q     
```

Cambio en la página web para crear el link con la clave hash al repositorio

del tipo ftp://usuario:ecbff5285009900b87058fa2b9dbe0f6@direccionftp.com

Y hasta aquí sería un resumen.

Demasiado código para un post por lo que no pongo ni el programa en java ni el de python ni otros shell o bash ni el resto de rutinas MUMPS.

Tags: BSD, vsftpd, MUMPS

Comments? Tweet