Vsftpd con FreeBSD para clientes como usuarios virtuales
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.
- 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
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.