mercoledì 5 luglio 2017

Un tunnel per la posta

Il server SMTP integrato con la nostra macchina è in grado di funzionare da relay di posta utilizzando un servizio esterno, ma molti provider offrono possibilità di crittografia e autenticazione limitate, spesso utilizzano semplicemente SSL su porta 465. IBMi, come altri altri server SMTP (vedi postfix), non supporta questo tipo di crittografia, e per la verità, hanno ragione loro.

Ciononostante rimane la necessità di utilizzare il servizio e instaurare un collegamento, vediamo di seguito come utilizzare un "trucchetto", installare sulla macchina un servizio di tunnelling che utilizza OpenSSL.

0. Ripasso: come configurare il server SMTP per il relay su altro servizio.


Le istruzioni sono ben specificate qui, non è intenzione di questo post spiegare nel dettaglio questi passaggi, ma li riepilogo solamente per capire come cambieranno in seguito:
  • se non si è già in possesso di un certificato rilasciato da qualche autorità, è possibile utilizzarne uno creato "in proprio", per cui prendiamo carta e penna e ... no apriamo il browser puntando sull' "IBM Navigator for i" e da lì cerchiamo il DCM, dobbiamo creare una autorità di certificazione locale (local CA). Creata la CA, creiamo il nostro certificato come se fosse rilasciato dalla nostra CA.
  • Assegniamo il certificato al client di posta, occhio che sia il client: dobbiamo far collegare il nostro server a un altro.
  • Già che ci siamo verifichiamo invece che l'authority che ha rilasciato il certificato utilizzato dal nostro provider sia tra quelle considerate affidabili, altrimenti dobbiamo farci dare il certificato principale della CA, importarlo e poi aggiungerlo alla trust list.
I prossimi passi possono essere eseguiti su "IBM Navigator for i", basta andare a cercare le impostazioni del server SMTP, oppure da riga di comando, di seguito scriverò solo i comandi su terminale (per comodità):
  • Modifichiamo le impostazione del server di posta per utilizzare il relay:
CHGSMTPA ALWAUTH(*RELAY) FWDHUBSVR('<host_server_di_posta_del_provider>')
  • Se diversa da 25, cambiamo anche la porta alla quale collegarsi, questo si configura come variabile d'ambiente:
ADDENVVAR ENVVAR('QIBM_SMTP_SERVER_PORT') VALUE('465') LEVEL(*SYS)
  • Aggiungiamo le informazioni di login:
ADDSMTPLE TYPE(*HOSTAUTH) HOSTNAME('<host_server_di_posta_del_provider>') USERNAME('<username>') PASSWORD('<password>')
  • riavviamo il server smtp
ENDTCPSVR *SMTP
STRTCPSVR *SMTP

Queste impostazioni abilitano la comunicazione via TLS, vediamo come impostare il tunnel.

1. Installate stunnel


Stunnel è un'utility per instaurare un servizio di tunnelling che utilizza OpenSSL per la crittografia, è possibile installarlo utilizzando i pacchetti messi a disposizione da Perzl, come descritto qui.

NB: vi consiglio di installare l'ultima versione, e per questo dovrete aggiornare l'utility di installazione, per questo consultate la guida in linea:
CALL QP2TERM
cd /QOpenSys/download
./wwwperzl.sh aix61 admin
Una volta aggiornato (ci mette un po') date i comandi:
./wwwperzl.sh aix61 list stunnel
lista i pacchetti disponibili tra cui:
...
stunnel-5.36-1.aix5.2.ppc.deps
...
e quindi:
./wwwperzl.sh aix61 wget stunnel-5.36-1.aix5.2.ppc

./wwwperzl.sh aix61 rpm stunnel-5.36-1.aix5.2.ppc

2. Configurate stunnel


Create un nuovo file nella posizione indicata sotto (da terminale AS):
EDTF STMF('/qopensys/opt/freeware/etc/stunnel/stunnel.conf')
e inserite i seguenti dati:
client = yes
foreground = no
fips = no

[smtps-wrapper]
accept = 11125
connect = <host_server_di_posta_del_provider>:465
Chiaramente '<host_server_di_posta_del_provider>' è l'host del server di posta del vostro provider (ve lo devo scrivere?)

Questo file di configurazione dice a stunnel di creare un servizio chiamato "stmps-wrapper" che ascolta in locale sulla porta 11125 e rimbalza la connessione sull'indirizzo remoto indicato alla porta 465.

Ora possiamo far partire il servizio:
CALL QP2TERM

stunnel
tutto qua, con WRKACTJOB potete vedere un lavoro in batch lanciato con il vostro utente con funzione "PGM-stunnel", oppure per maggiore controllo potete vedere il lavoro in ascolto sulla porta 11125 (NETSTAT e opzione 3)

3. Cambiate impostazione del server SMTP


Che non deve più inviare a '<host_server_di_posta_del_provider>' ma al nostro servizio, per cui:
CHGSMTPA ALWAUTH (*RELAY) FWDHUBSVR('localhost')

CHGENVVAR ENVVAR('QIBM_SMTP_SERVER_PORT') VALUE('11125') LEVEL(*SYS)

ADDSMTPLE TYPE(*HOSTAUTH) HOSTNAME('localhost') USERNAME('<username>') PASSWORD('<password>')
username e password sono sempre quelli del server remoto

e riavviate il server SMTP:
ENDTCPSVR *SMTP

STRTCPSVR *SMTP

Infine potete testare utilizzando i vostri comandi di posta, io utilizzo MMAIL, per cui:
MMAIL/EMLPTUMSG SUBJECT('test subject') FROMADDR('sender@yourmaildomain.com') TOADDR('receiver@othermaildomain.com') MSGTXT('test message')

4. Impostate il servizio automatico


Qui lascio libera scelta di come e quando far partire il servizio, tengo solo a precisare che è possibile utilizzare il comando:
QSH CMD('stunnel')

ed è tutto.

AGGIORNAMENTO 20/09/2017: aggiunto LEVEL(*SYS) ai comandi ADDENVVAR e CHGENVVAR, in questo modo la modifica è valida sempre.

AGGIORNAMENTO 20/09/2017: descrivo di seguito i passi per indagare il log di invio del servizio di posta, nel caso ci siano problemi (e visto che è un supplizio):
DSPJRN JRN(QZMF) OUTPUT(*OUTFILE) OUTFILE(QTEMP/LOG) OUTMBR(LOG) ENTDTALEN(512)

salva in QTEMP il file LOG che contiene le voci del giornale, e quindi:
RUNQRY *N QTEMP/LOG

per ispezionarlo, visto che non si capisce niente, vi rimando qua:
https://www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzair/rzairjournal.htm#rzairjournal__smtpclient
Vi serve vedere soprattutto i sottocodici che trovate nel campo:
JOESD      Dati specifici voce - Contenuti variabili

del file di log, se tutto è ok dovreste trovare i codici 88 e 82.

AGGIORNAMENTO 25/09/2018: modificati i comandi di installazione di stunnel per refuso