18 julio, 2017

Automatizar copias de seguridad FTPS con WinSCP y Taskschd

Hace tiempo que quería comentar ya este tema, como hago mis copias de seguridad.

No hace falta decir que es recomendable y tendría que ser una práctica rutinaria realizar backups de la información importante. Sobretodo para no echarnos las manos a la cabeza llegado el momento de recuperar cierta información que por cualquier situación hubiésemos perdido.

Se pueden realizar copias de seguridad de una manera u otra. Ya sea copiando directamente la información algún medio extraíble, subiéndola algún servicio de almacenamiento cloud, copias redundantes en ambos medios, etc. A su vez, cuantas más medidas de seguridad se tomen para cada una de estas técnicas, más segura estará la información, pero también más "pasos" habrá que desencadenar para llegar a ella.

En este caso expondré la forma en la que personalmente realizo mis copias de seguridad. Intento no utilizar, siempre que sea posible, aplicaciones locales o almacenamientos cloud de terceros bien conocidos como pueden ser: GoogleDrive, OneDrive, Dropbox, etc. Ya que actualmente son los servicios más extendidos y usados, por lo que tienen un véctor de ataque continuo pero a su vez son servicios que están constantemente actualizándose, lo que los hacen ser "insuficientemente seguros".
En el caso de usar un servicio de terceros de almacenamiento cloud habría que intentar contratarlo en una empresa no tan extendida pero de confianza.

En mi caso tengo una carpeta con toda la información a respaldar, esta carpeta está ubicada en un disco duro extraible protegido con un cifrado Bitlocker. Es decir, que cuando conectamos el disco duro extraible a un puerto USB del equipo tenemos que introducir una password para desbloquearlo y así poder acceder a la información.  

Primera medida de seguridad es el disco duro extraible por lo que nunca tengo la información en el disco local del sistema ni en un segundo disco conectado directamente a ningún puerto SATA de la placa base.


Segunda medida de seguridad es el cifrado por Bitlocker.
De este modo puedo llevarme el disco duro extrabible a cualquier parte y conectarlo a cualquier equipo con un sistema operativo Windows que admita Bitlocker, sin recurrir a ningún software de terceros para el cifrado del disco, por que como ya dije, prefiero utilizar mecanismos propios de los sistemas operativos y así garantizar la disponibilidad de la información en un entorno Windows de forma nativa.

Tercer paso sería garantizar esta información en caso de pérdida, tener una redundancia.
¿Que pasaría si en un futuro perdiese físicamente el disco duro extraible o no pudiese acceder a el porque hubiese sido dañado?.
Pues esta redundancia la tendríamos en un sitio de ubicado geográficamente distinto, un sitio de terceros. Actualmente tengo contratado un servicio de almacenamiento cloud en una empresa de Hosting, la cual es de mi confianza.
Este servicio me ofrece un espacio FTP con un certificado SSL/TLS, por lo que puedo usar el canal de control y el de data para transferir información de forma segura mediante FTPS "FTP over SSL" (no confundir con SFTP "SSH-FTP").

Cuarto paso sería automatizar esta tarea. Generar un script que pudiese realizar por ejemplo, una copia semanalmente de toda esta carpeta y la transfiera de forma síncrona a este espacio de almacenamiento vía FTPS. En Windows existe la característica de habilitar el cliente FTP por línea de comandos, pero no podemos usar certificados sobre este cliente. Por lo que obté en usar la herramienta WinSCP, esta incorpora una utilidad en línea de comandos (winscp.com) la cual podemos generar un script en batch en integrarla perfectamente.

Generamos un fichero por lotes .bat con la siguiente línea de código:
winscp.com /log="backup.log" /command "open ftp://USER:PASSWROD@PATH_SERVER -explicit" "synchronize remote -delete -mirror -transfer=binary J:\ADRIAN /Backup" "close" "exit"
Figura 1: Script batch usando winscp.com para conexiones FTPS con sincronización de local a remoto

Iniciamos la utilidad winscp.com, con /log crearemos el fichero de log (esto sería opcional pero no está de más tener un registro de la actividad) este fichero lo tendremos que crear vacío de forma manual en el mismo directorio donde se lanzará el script.
A continuación indicaremos los parámetros realmente importantes, al usar winscp.com en un script batch tendremos que indicarle el modificador /command para que sepa que los próximos modificadores serán realizados en una sola instrucción. Podríamos crear un fichero a parte con los mismos modificadores del comando necesarios, en mi caso solamente realizo una única transferencia por lo que he obtado por unificarlo en un mismo fichero .bat.

Abrimos la conexión al servidor FTP (open) y la invocamos de forma explícita (-explicit). De esta forma el cliente solicita de forma explícita la seguridad acordada para empezar la comunicación con el servidor FTP de modo que tanto el canal de control como el de data sean cifrados.
synchronize remote: Los cambios del directorio local se actualizan con los remotos.
-delete: Elimina archivos obsoletos.
-mirror: Modo espejo (sincroniza también archivos antiguos).
-transfer=binary: Modo de transferencia binario, necesario por ejemplo para transferir ficheros de tipo imagen, vídeo, pdf, etc.
J:\ADRIAN: Directorio local.
/Backup: Directorio remoto.
Finalmente cerramos la conexión (close) y salimos de la sesión (exit).

Más información sobre WinSCP en command line:
https://winscp.net/eng/docs/ftps
https://winscp.net/eng/docs/scriptcommand_open
https://winscp.net/eng/docs/scriptcommand_synchronize

Con esto conseguiremos que cada vez que se ejecute el script este solo hará un repaso a todos los ficheros tanto locales como remotos haciendo un espejo y adaptando solamente los cambios, con lo que conseguiremos una reducción de tiempo en futuras transferencias.

Una vez que tenemos generado el script, tendremos que ejecutarlo manualmente y eso no sería práctico, llegados a este punto lo mejor será automatizar este script para que por ejemplo se ejecute un día y hora en concreto de la semana.
Para no recurrir a herramientas de terceros usaremos el "Programador de tareas" de Windows (taskschd.msc).

Creamos una nueva tarea. Como descadenador será según una progamción, semanalmente los Domingos a las 22:00. En mi caso lo tengo así programado ya que se que ese día y a esa hora tendré el equipo encendido.

Figura 2: Estableciendo el desencadenador de la tarea programada.

Las acción será iniciar un programa o script, indicamos el path de la ruta donde se encuentra el script. En mi caso no quería crear una variable de entorno de Windows por lo que tengo que indicarle al sistema donde se encuentra la utilidad winscp.com, por lo que le indico donde se debería iniciar el path en "Iniciar en".

Figura 3: Estableciendo la acción para ejecutar el script.

La configuración de la tarea programada la establecí del siguiente modo. Si la tarea no se ejecuta, reiniciarla cada 1 minuto durante un número de intentos de 5 veces y si sobrepasa las 12 horas de ejecución detener la tarea.

Figura 4: Configuración de la tarea programada.

Finalmente en la pestaña general designamos un nombre a la tarea programada. Una vez llegados a este punto tendremos dos opciones:
- Ejecutar solo cuando usuario haya iniciado sesión: En este caso veremos la vetana de la consola de Windows ejecutando todo el proceso.
- Ejecutar tanto si el usuario inició sesión como si no: En este caso la tarea se ejecutará de forma subyacente al usuario.

Si escogemos la primera opción no tendremos problemas. Pero si escogemos la segunda opción ya que puede darse el caso de que no estemos con la sesión iniciada en el equipo, pero este si esté encendido (y con el Bitlocker desbloqueado en mi caso). Al intentar establecer la tarea nos dirá que "la cuenta de usuario especificada tenga derechos para iniciar sesión como trabajo por lotes". Esto ocurre por que en mi caso el usuario que habitualmente uso por seguridad no está dentro del grupo Administradores, sino dentro del grupo Usuarios y por lo tanto no tiene los suficientes permisos como para llevar a cabo esta acción.

Figura 5: Ejecutar tarea programada tanto si el usuario inicia sesión como si no.

Para ello solamente tendremos que agregar la cuenta de usuario en el editor de directivas seguridad local (secpol.msc directamente o través de gpedit.msc) buscamos "Iniciar sesión como proceso por lotes" y agregamos el usuario.

Figura 6: secpol.msc - Iniciar sesión como proceso por lotes para una tarea programada.
De este modo ya podremos autenticar con las credenciales del usuario local, independientemente de si se marca el checkbox de "No almacenar contraseña" como si no.
Más información: https://technet.microsoft.com/en-us/library/cc722152(v=ws.11).aspx

Figura 7: Autenticación de credenciales del usuario local para tarea programada.

Para poder hacer un seguimiendo de la ejecución de la tarea programada habilitamos el historial. Esta opción afectará a todas las tareas programadas que tengamos en la biblioteca.

Figura 8: Habilitar el historial de las tareas programadas.

Una vez se ejecute y concluya la tarea, en la pestaña de historial veremos la auditoria de información de tiempos. Para hacerse una idea, en mi caso, según mi conexión de DSL y el ancho de banda contratado con el Hosting que me proporciona el server FTP. En menos de 25 minutos se hicieron transferencias de un total aproximado de 40GB.

Figura 9: Historial de la tarea programada.

Si consultamos el fichero .log que creamos para el registro de actividad de conexiones y transferencias hacia el servidor FTPS. Vemos como la conexión se establece de forma expícita solicitando el certificado y se establece la conexión TLS.

Un detalle a tener en cuenta de este log es que la password se visualiza como "*********", si se hubiese generado el log a partir de un script en dos partes, es decir que un fichero estaría el .bat que después llamaría al fichero donde se almacenaran los modificadores del comando winscp.com, esta password se visualizaría en texto plano. Por lo que no es lo mismo generar un log con winscp.com /log, que estableciendo el /log en un fichero a parte.

Figura 10: Fichero de log de las transferencias realizadas al servidor FTPS.

Espero que esto le resulte de utilidad algún usuario o le sirva de ejemplo para realizar sus propios métodos de copias de seguridad.

Saludos!

0 Comentarios :

Publicar un comentario

Entradas Relacionadas