lunedì 2 ottobre 2017

Tu (in batch) non puoi passare! O forse sì...

SFTP è un protocollo per lo scambio file in maniera sicura, in quanto usa ssh come layer di trasporto di dati crittografati, è molto, molto più sicuro di un normale FTP e viene quindi spesso richiesto come metodo di scambio file. Sul nostro IBM i è facilmente utilizzabile a patto di avere installato i programmi su licenza 5733SC1 opzione *BASE - IBM Portable Utilities for i 5733SC1 opzione 1 - OpenSSH, OpenSSL, zlib e chiaramente il PASE (qui su come verificare).

Una volta installate le opzioni collegarsi a un server sftp è semplice, poniamo ad esempio di doverci collegare a host.ext, e ci sono stati dati utente e password:
CALL QP2TERM
sftp utente@host.ext
al primo collegamento con host.ext verrà richiesto se inserire l'indirizzo tra quelli affidabili a cui collegarsi, per cui digitate yes e poi verrà richiesta la password, quindi ora potete inserire i comandi per lo scambio di file.

Ok... ma se dovete farlo in batch? Il comando sftp permette di lanciare dei comandi contenuti in uno script apposito... abbiamo ad esempio il nostro file scambio.txt salvato sulla root dell'IFS e deve essere inviato sulla cartella remota /scambiofile, potremmo scrivere la lista dei comandi necessari e salvarla in un altro file chiamato script.txt (per comodità salvato sempre sulla root), per cui:
EDTF STMF('/script.txt')
e inseriamo
cd /scambiofile
put /scambio.txt
il comando quindi diventa:
sftp -b/script.txt utente@host.ext
questa volta i comandi vengono eseguiti in automatico, il problema è che chiede comunque la password! Chiedere a qualcuno di effettuare l'autenticazione ogni volta potrebbe non essere una soluzione praticabile, l'ideale è che il processo parta completamente in automatico e non interattivo, di seguito illustro un paio di soluzioni, partendo dalla più sicura.

AUTENTICAZIONE TRAMITE CERTIFICATI


Si tratta di creare una coppia di chiavi di crittografia, una privata e una pubblica, i certificati generati sono personali e vi identificano in maniera univoca, per cui possono essere usati per l'autenticazione.
Dovete consegnare la parte pubblica al gestore del servizio SFTP affinché l'aggiunga alla lista delle chiavi accettate, sempre che sia possibile utilizzare questa tipologia da parte loro.

Prima di tutto dovreste collegarvi con l'utente che intendete usare per effettuare il collegamento batch, e se non l'avete già fatto collegatevi manualmente a host.ext con un comando sftp o ssh, lo scopo è di salvare il certificato del sito tra quelli riconosciuti e creare i certificati nella home dell'utente corretto.

Preferisco le mie chiavi come preferisco il caffè: lunghe, per crearle digitiamo a terminale:
CALL QP2TERM

ssh-keygen -b 4096
(crea una chiave lunga 4096, lo standard è invece 2048)

Accettate il nome di default delle chiavi (id_rsa per la chiave privata, id_rsa.pub per la chiave pubblica) e non inserite nessuna passphrase.

A questo punto dovreste consegnare al provider il file con la chiave pubblica id_rsa.pub affinché lo importino nel loro server, oppure potreste provare a farlo da soli sfruttando lo stesso collegamento ssh:
CALL QP2TERM

scp ~/.ssh/id_rsa.pub utente@host.ext:~/.ssh/authorized_keys
ed inserite la password, per questa volta.
Se ok, se provate a ricollegarvi via sftp o ssh, non dovrebbe chiedervi password ma dirvi che è stato accettato il vostro certificato ("Authenticating with public key"), ora non vi resta che mettere in piedi il vostro servizio di scambio in batch senza che resti bloccato in attesa di interattività.


INSTALLARE SSHPASS


Sshpass è una utility che simula il comportamento dell'utente e inserisce la password quando richiesta e, soprattutto, in batch. Andrà compilato e installato da sorgente, per cui per prima cosa verificate di avere il necessario per compilare sorgenti C - sto parlando di gcc e di make - altrimenti vi rimando alla mia guida pubblicata qui, in particolare fate attenzione ad inserire le variabili d'ambiente PASE_PATH e PATH: saranno utili dopo per trovare il comando sshpass.

Innanzitutto scarichiamo l'ultima release dei sorgenti compattati con in formato tar, al momento in cui scrivo è la 1.06; se avete seguito la guida citata prima dovreste avere la cartella /QOpensys/download e visto che mi piace l'ordine creiamo qui una sotto cartella dove tenere il file tar e una cartella dove inserire i file scompattati:
CALL QP2TERM

mkdir /Qopensys/download/tar

mkdir /QOpensys/opt/sshpass
Possiamo scaricare il file da pc e poi caricarlo via ftp su /Qopensys/download/tar e poi da terminale:
cd /Qopensys/download/tar

gtar -xvf sshpass-1.06.tar.gz -C /QOpensys/opt/sshpass
Spostiamoci sulla cartella appena scompattata e iniziamo il primo passo per lo compilazione, chi è pratico di sistemi unix/linux riconoscerà la famosa triade (./configure, make e make install), ma per compilare su IBM i sono necessarie alcune variazioni:
cd /QOpensys/opt/sshpass/sshpass-1.06

./configure
Completato il passo di configurazione viene creato il file config.h, questo file definisce un alias rpl_malloc che però su IBM i non trova, dobbiamo toglierlo manualmente per cui (da terminale normale):
EDTF STMF('/QOpenSys/opt/sshpass/sshpass-1.06/config.h')
trovate la riga:
#define malloc rpl_malloc
e commentatela:
/* #define malloc rpl_malloc */
ora possiamo proseguire:
gmake

gmake install
se digitate il comando sshpass dovrebbe comparire l'help:

(tutto ok)

Non resta che mettere in piedi il servizio batch, solo che a questo punto il comando per accedere via sftp diventa:
sshpass -p "password" sftp -oBatchMode=no -b/script.txt utente@host.ext

NB: sshpass vi costringe ad avere la password scritta da qualche parte, ed è quindi la soluzione giudicata come meno sicura. Dovrebbe essere utilizzata come ultima spiaggia in caso di impossibilità ad utilizzare i certificati.

(Mia reazione all'affermazione: "non siamo in grado di utilizzare le chiavi" ... successo veramente...)

2 commenti: