21 dic 2014

IBM i (iSeries / AS/400) - Haciendo respaldos en la nube/red (Cloud Backup) - Versión segura usando SCP

Esta versión es similar al post anterior de "http://diego-k.blogspot.com/2014/12/ibm-i-iseries-as400-haciendo-respaldos.html" pero es algo más simple (es un sólo CL) y según mis pruebas incluso es más veloz.

En lugar de armar un script de FTP, simplemente usa SCP para transferir archivos. Esto permite hacer una conexión sin depender de una password, la información viaja de forma segura, y el archivo es encriptado antes de ser enviado.

Necesitaremos tener instalado el 5733-SC1 (Portable Utilities) para contar con el comando SCP, un servidor que soporte SSH donde enviaremos el archivo, y la generación de la clave pública y clave privada para transferir sin necesidad de password.

El CLLE es un poco extenso, pero simple de seguir.

Los respaldos se hacen completos el primer día del mes y los lunes, e incrementales el resto de los días.
Se requiere crear la DTAARA BKP7ZPSWD con la llave de encripción. En este caso es una llave de 64 caracteres.

También necesitaremos el archivo BKPLIB que tiene la estructura de la salida de DSPOBJD pero en ODOBNM tendremos la lista de bibliotecas a respaldar.

Obviamente el servidor SSH debe ser visto desde el servidor IBM i (iSeries) donde tengamos el script.

             PGM
             DCL        VAR(&ENCKEY) TYPE(*CHAR) LEN(64)
             DCL        VAR(&zipCMD) TYPE(*CHAR) LEN(256)
             DCL        VAR(&SSHCMD) TYPE(*CHAR) LEN(256)
             DCL        VAR(&SCPCMD) TYPE(*CHAR) LEN(256)
             dcl        var(&FECHA) type(*CHAR) LEN(8)
             DCL        var(&HOY) type(*CHAR) LEN(8)
             DCL        VAR(&DIA)  TYPE(*CHAR) LEN(2)
             DCL        VAR(&NDIA) TYPE(*DEC) LEN(2 0)
             DCL        VAR(&MES)  TYPE(*CHAR) LEN(2)
             DCL        VAR(&ANIO)  TYPE(*CHAR) LEN(2)
             DCL        VAR(&DOW) TYPE(*CHAR) LEN(4)
             DCLF       FILE(MYLIB/BKPLIB)
             RTVDTAARA  DTAARA(MYLIB/BKP7ZPSWD *ALL) +
                          RTNVAR(&ENCKEY)
             RTVSYSVAL  SYSVAL(QDAYOFWEEK) RTNVAR(&DOW)
             RTVSYSVAL  SYSVAL(QDAY) RTNVAR(&DIA)
             RTVSYSVAL  SYSVAL(QMONTH) RTNVAR(&MES)
             RTVSYSVAL  SYSVAL(QYEAR) RTNVAR(&ANIO)
             CHGVAR     VAR(&FECHA) VALUE('01' *TCAT &MES *TCAT +
                          '20' *TCAT &ANIO)
             CHGVAR     VAR(&NDIA) VALUE(&DIA)
             CHGVAR     VAR(&HOY) VALUE( '20' *TCAT &ANIO *TCAT +
                        &MES *TCAT &DIA)
             CRTLIB LIB(BACKUPSAV) TEXT('Biblioteca de Backup')
             MONMSG     MSGID(CPF2111)
             CLRLIB     LIB(BACKUPSAV)
             /* Borro los archivos  SAVF y 7z que hayan quedado */
             QSH        CMD('/QOpenSys/usr/bin/sh -c " +
                        rm /home/backupsav/*.7z"')
             QSH        CMD('/QOpenSys/usr/bin/sh -c " +
                        rm /home/backupsav/*.savf"')
             /* Creo el archivo  SAVF con perfiles de usuarios */
             CRTSAVF    FILE(BACKUPSAV/SAVSECDTA) TEXT('Seguridad')
             SAVSECDTA  DEV(*SAVF) SAVF(BACKUPSAV/SAVSECDTA) +
                          DTACPR(*NO) COMPACT(*NO)
             /* Muevo el archivo  SAVF al IFS */
             QSH        CMD('/QOpenSys/usr/bin/sh -c " +
                          mv /QSYS.LIB/BACKUPSAV.LIB/SAVSECDTA.FILE +
                          /home/backupsav/SAVSECDTA.savf"')
             /* Comprimo el archivo  SAVF */
             CHGVAR     VAR(&zipCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
                         7za a -p' *tcat +
                         &ENCKEY *BCAT '/home/backupsav/savsecdta.7z +
                           /home/backupsav/savsecdta.savf"')

             QSH        CMD(&ZIPCMD)
             /* Borro el archivo  SAVF */
             QSH        CMD('/QOpenSys/usr/bin/sh -c " +
                        rm /home/backupsav/SAVSECDTA.savf"')
             MONMSG     MSGID(CPF0000)
             /* Creo el directorio remoto con la fecha */
             CHGVAR     VAR(&SSHCMD) VALUE('ssh -p 443 -i +
                          /home/ituser1/.ssh/id_rsa +
                          ituser1@mysshserver.com "mkdir +
                          -p /mnt/USB1/BACKUP/'  +
                          *TCAT &HOY *TCAT '"')
             QSH        CMD(&SSHCMD)
             MONMSG     MSGID(CPF0000)
             /* Transfiero el archivo en background */
             CHGVAR     VAR(&SCPCMD) VALUE('scp -P 443 -i +
                          /home/ituser1/.ssh/id_rsa +
                          /home/backupsav/savsecdta.7z +
                          ituser1@mysshserver.com:/mnt/USB1/BA+
                          CKUP/' *TCAT &HOY *TCAT '/ &')
             QSH        CMD(&SCPCMD)
             MONMSG     MSGID(CPF0000)
 LEE:        RCVF
             MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(FIN))
             CRTSAVF    FILE(BACKUPSAV/&ODOBNM) TEXT(&ODOBTX)
             MONMSG     MSGID(CPF0000)
             IF         COND((&DOW  = '*MON') *OR (&NDIA=1)) THEN( +
                        SAVLIB LIB(&ODOBNM) +
                          DEV(*SAVF) SAVF(BACKUPSAV/&ODOBNM) +
                          SAVACT(*LIB) ACCPTH(*YES) DTACPR(*NO) +
                          COMPACT(*NO) )
             ELSE   CMD(   +
                 SAVCHGOBJ  OBJ(*ALL) LIB(&ODOBNM) DEV(*SAVF) +
                          REFDATE(&FECHA) REFTIME(000000) +
                          SAVF(BACKUPSAV/&ODOBNM) SAVACT(*LIB) +
                          ACCPTH(*YES) DTACPR(*NO) COMPACT(*NO))


             /* MUEVO el archivo  SAVF al IFS */
             CHGVAR     VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
                          mv /QSYS.LIB/BACKUPSAV.LIB/' *TCAT &ODOBNM +
                          *TCAT '.FILE /home/backupsav/' *TCAT +
                          &ODOBNM *TCAT '.savf"')

             QSH        CMD(&zipCMD)
             /* Comprimo con 7zip y clave el archivo  SAVF */
             CHGVAR     VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
                        7za a -p' *tcat +
                        &ENCKEY *BCAT '/home/backupsav/' *TCAT +
                        &ODOBNM *TCAT '.7z /home/backupsav/' *TCAT +
                        &ODOBNM *TCAT '.savf"')

             QSH        CMD(&zipCMD)
             /* Borro el archivo  SAVF */
             CHGVAR     VAR(&ZIPCMD) VALUE('/QOpenSys/usr/bin/sh -c " +
                        rm /home/backupsav/' +
                        *tcat &ODOBNM *TCAT '.savf"')
             QSH        CMD(&zipCMD)
             /* Transfiero el archivo en background */
             CHGVAR     VAR(&SCPCMD) VALUE('scp -P 443 -i +
                          /home/ituser1/.ssh/id_rsa +
                          /home/backupsav/' *TCAT &ODOBNM *TCAT '.7z +
                          ituser1@mysshserver.com:/mnt/USB1/BA+
                          CKUP/' *TCAT &HOY *TCAT '/ &')
             QSH        CMD(&SCPCMD)
             MONMSG     MSGID(CPF0000)

             GOTO       CMDLBL(LEE)
 FIN:        ENDPGM

Espero que sea de utilidad

Cómo conectarme a un servidor remoto en una red protegida - Versión actualizada

En un artículo anterior describí cómo conectarse a un equipo remoto en una red protegida http://diego-k.blogspot.mx/2014/12/como-conectarme...