Cambiare il livello della password (valore di sistema QPWDLVL) da 0/1 a 2/3 con l’aiuto della vista USER_INFO

Dopo circa 7 anni dalla mia proposta, l’unico dei miei clienti con il livello della password (valore di sistema QPWDLVL) ancora impostato a 0 ha finalmente deciso di passare al livello 2. Nel 2014, il sistema operativo in uso su questo sistema era i5/OS V5R4 e per verificare la situazione delle password dei profili utente, come da istruzioni IBM, avrei utilizzato i comandi DSPAUTUSR e PRTUSRPRF TYPE(*PWDLVL). Ora che il sistema operativo è IBM i V7R3, scelgo di utilizzare la vista USER_INFO per analizzare più in dettaglio lo stato dei profili utente prima di procedere alla riconfigurazione.


 Target operating system: IBM i V7R3 (SF99730 level 20310 and SF99703 level 23).


 Prima di procedere, è utile ricordare quanto segue sulle password.

  • A QPWDLVL 0/1 il sistema supporta password con una lunghezza massima di 10 caratteri (i caratteri consentiti sono A-Z, 0-9 e i caratteri $, @, # e la sottolineatura) e non tiene traccia del formato dei caratteri che compongono la password (non sa se questi sono maiuscoli, minuscoli o misti). Nota. Sul sistema con lingua primaria 2932 italiano, i caratteri speciali consentiti sono $, §, £ e la sottolineatura.
  • In QPWDLVL 2/3 il sistema supporta password con una lunghezza massima di 128 caratteri. Sono ammessi caratteri maiuscoli e minuscoli. Le password possono essere composte da qualsiasi carattere (ma non possono iniziare con un asterisco e non possono essere tutti spazi vuoti) e la password sarà sensibile al maiuscolo e al minuscolo.
  • Prima di cambiare QPWDLVL da 0/1 a 2/3 è necessario controllare le password dei profili utente perché alcune password potrebbero non essere utilizzabili al nuovo livello. Queste password devono essere aggiornate prima di modificare il valore di sistema. Per i profili utente con una password utilizzabile a QPWDLVL 2/3, non è necessario alcun intervento.
  • Quando si modifica QPWDLVL da 0/1 a 2/3 e si esegue l’IPL, il sistema memorizza una versione maiuscola ed una versione minuscola della password. Dopo l’IPL, per accedere al sistema, l’utente dovrà quindi inserire o una versione tutta maiuscola o una versione tutta minuscola della password. Una password mista (contenente cioè caratteri maiuscoli e caratteri minuscoli) non sarà accettata.
  • Quando il sistema è a QPWDLVL 2/3, se la password viene cambiata in un formato misto (con caratteri maiuscoli e minuscoli), il sistema registrerà la nuova versione comprensiva del formato perché ora il formato è importante.

 Cominciamo con la fase di analisi.

 Controlla i sistemi che comunicano con il sistema IBM i ed i servizi di comunicazione utilizzati.

Se il tuo sistema è in comunicazione con altre piattaforme IBM i, controlla la release del sistema operativo ed il livello della password di quei sistemi e quali servizi di comunicazione sono in uso.

Se tali sistemi eseguono una versione del sistema operativo inferiore a V5R1M0, QPWDLVL 2/3 non può essere utilizzato.

Se tali sistemi funzionano con un valore QPWDLVL di 0 o 1, è necessario verificare i servizi di comunicazione utilizzati.

I servizi di comunicazione che utilizzano l’autenticazione implicita basata su utente e password richiedono che il profilo utente e la password corrispondano tra i sistemi IBM i di origine e di destinazione. Questo potrebbe essere un problema quando i sistemi hanno diversi livelli di password (il sistema con il livello della password più alto dovrebbe seguire le regole di password del sistema con il livello della password più basso). Inoltre, alcuni di questi servizi, per esempio QFileSvr.400, richiedono anche che il livello della password sia lo stesso tra i sistemi IBM i in comunicazione.

Per contro, i servizi di comunicazione che usano l’autenticazione esplicita, per esempio FTP, non dovrebbero avere problemi.

Se stai usando l’IBM i Support for Windows Network Neighborhood (IBM i NetServer), potete passare al livello password 3 solo se nella vostra azienda non ci sono client Windows 95/98/ME che usano quel servizio, altrimenti potete passare solo al livello di password 2. Questo perché al livello 3 le password del gestore LAN di IBM i NetServer per i client Windows 95/98/ME vengono rimosse dal sistema.

Nota. Le LAN manager password sono state disabilitate su Windows a partire da Vista, quindi la loro rimozione non avrà effetto sulle versioni attuali di Windows.

Verifica il valore di sistema QPWDVLDPGM sul tuo sistema IBM i.

Il valore di sistema QPWDVLDPGM deve specificare o *REGFAC o *NONE per poter cambiare QPWDLVL a 2/3 altrimenti, viene emesso il messaggio CPD2294. Pertanto, se usi un programma di convalida della password, sarà necessario scriverne uno nuovo che possa essere registrato per il punto di uscita QIBM_QSY_VLD_PASSWRD, formato VLDP0100, usando il comando ADDEXITPGM.

Individua tutti i profili utente IBM i che non hanno una password utilizzabile al livello di password 2/3.

Poiché il sistema operativo in uso è IBM i V7R3, invece di usare i comandi DSPAUTUSR o PRTUSRPRF TYPE(*PWDLVL), come suggerito da IBM, preferisco usare la vista USER_INFO in modo che SQL lavori al mio posto. Il criterio di selezione è lo stesso suggerito da IBM per i due comandi precedenti, cioè PASSWORD_LEVEL_0_1 (o PWD_0_1) uguale a YES e PASSWORD_LEVEL_2_3 (o PWD_2_3) uguale a NO:

SELECT USER_NAME
FROM QSYS2.USER_INFO
WHERE PWD_0_1 = 'YES' AND PWD_2_3 = 'NO'

Nota. Invece della vista USER_INFO, è possibile utilizzare il file di output del comando DSPUSRPRF USRPRF(ALL) TYPE(BASIC) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPUSRPRF) per eseguire la stessa ricerca:

SELECT UPUPRF
FROM QTEMP/DSPUSRPRF
WHERE UPENPW = 'Y' AND UPENPH = 'N'

La vista USER_INFO contiene molte informazioni utili per approfondire l’analisi dei profili utente selezionati. Ad esempio, è possibile indagare se un profilo utente è ancora in uso oppure no:

SELECT USER_NAME, STATUS, PRVSIGNON, LASTUSED
FROM QSYS2.USER_INFO
WHERE PWD_0_1 = 'YES' AND PWD_2_3 = 'NO'

Nota. Oltre al campo PREVIOUS_SIGNON (o PRVSIGNON), inserisco anche il campo LAST_USED_TIMESTAMP (o LASTUSED) per tenere conto di eventuali profili utente utilizzati per connessioni diverse dall’emulazione 5250 (ODBC, JDBC, FTP, ecc.).

In questo modo posso identificare i profili utente con password non utilizzabile al livello password 2/3 che non sono più utilizzati. Questi profili utente potrebbero essere rimossi dal sistema, invece di cambiare loro la password.

Ora completo la nostra SELECT aggiungendo altri campi che aiutano a chiarire la situazione dei profili utente selezionati come, per esempio, GROUP_MEMBER_INDICATOR (o GRPMBR), PASSWORD_EXPIRATION_INTERVAL (o PWDEXPITV), PASSWORD_CHANGE_DATE (o PWDCHGDAT), LOCAL_PASSWORD_MANAGEMENT (o LCLPWDMGT), TEXT_DESCRIPTION (o TEXT):

SELECT USER_NAME, GRPMBR, STATUS, LASTUSED, CASE WHEN PWDEXPITV = -1 THEN 'NOMAX' WHEN PWDEXPITV = 0 THEN 'SYSVAL' ELSE CHAR(PWDEXPITV) END AS PWDEXPITV, PRVSIGNON, PWDCHGDAT, LCLPWDMGT, TEXT
FROM QSYS2.USER_INFO
WHERE PWD_0_1 = 'YES' AND PWD_2_3 = 'NO'

Concludo l’analisi dei profili utente cercando di scrivere un’istruzione SQL che suggerisca cosa fare con i profili utente con password non utilizzabili a livello 2/3, in base alla data di ultimo utilizzo e alla data di ultimo cambio password, prendendo questo “algoritmo” come punto di partenza:

IF PWD_0_1 = 'YES' AND PWD_2_3 = 'NO'
   IF LASTUSED > 365 days THEN /* user profile not used in the last year */
      DLTUSRPRF /* remove user profile */
   ELSE /* user profile perhaps still in use */
      IF PRVSIGNON > 365 days THEN /* previous sign on older than 1 year */
         CHGUSRPRF /* password change by admin */
      ELSE /* previous sign on in the last year */
         CHGPWD /* password change by user */

Ecco l’istruzione SQL:

SELECT USER_NAME, GRPMBR, STATUS, LASTUSED, CASE WHEN PWDEXPITV = -1 THEN '*NOMAX' WHEN PWDEXPITV = 0 THEN '*SYSVAL' ELSE CHAR(PWDEXPITV) END AS PWDEXPITV, PRVSIGNON, PWDCHGDAT, LCLPWDMGT, TEXT, CASE WHEN DAYS(CURRENT_DATE) - DAYS(DATE(COALESCE(LASTUSED, '2001-01-01'))) > 365 THEN 'DLTUSRPRF USRPRF(' CONCAT USER_NAME CONCAT ')' ELSE CASE WHEN DAYS(CURRENT_DATE) - DAYS(DATE(COALESCE(PRVSIGNON, '2001-01-01'))) > 365 THEN 'CHGUSRPRF USRPRF(' CONCAT USER_NAME CONCAT ') PASSWORD(…)' ELSE 'CHGPWD' END END AS SUGGESTED_ACTION
FROM QSYS2.USER_INFO
WHERE PWD_0_1 = 'YES' AND PWD_2_3 = 'NO'

Nota. Per i campi LASTUSED e PRVSIGNON che possono non avere valori (o valori nulli) uso la funzione SQL COALESCE per impostare una data predefinita (ad esempio, 1 gennaio 2001) in caso di valore nullo.


Ora che la fase di analisi è stata completata, iniziamo la fase di implementazione.

Prima di tutto, bisogna notificare agli utenti le azioni che devono eseguire sui loro profili utente (cambiare la password) e verificarne la corretta esecuzione utilizzando sempre la vista USER_INFO.

Prima di cambiare il valore del sistema QPWDLVL, mettere il sistema in stato di restrizione:

ENDSBS SBS(*ALL) OPTION(*IMMED) ENDSBSOPT(*NOJOBLOG)

Salvare i dati di sicurezza in un file di salvataggio in modo da poter reimpostare le password per tutti i profili utente, nel caso sia necessario tornare a un livello di password inferiore:

CRTSAVF FILE(library/SAVSECDTA)
SAVSECDTA DEV(*SAVF) SAVF(library/SAVSECDTA) DTACPR(*MEDIUM) OUTPUT(*PRINT)

Nota. Oltre al salvataggio dei dati di sicurezza, il mio consiglio è quello di salvare su file anche gli attributi dei profili utente con il comando:

DSPUSRPRF USRPRF(*ALL) TYPE(*BASIC) OUTPUT(*OUTFILE) OUTFILE(library/DSPUSRPRF)

Lavorare sui profili degli utenti secondo i suggerimenti elaborati nella fase di analisi (cambio password o rimozione).

Cambiare il valore di sistema QPWDLVL in 2 (o 3):

CHGSYSVAL SYSVAL(QPWDLVL) VALUE(2)

Nota 1. QPWDLVL 2 è visto come un livello di compatibilità. Questo livello permette di tornare a QPWDLVL 0 o 1. Quando QPWDLVL è 3, tutte le password del profilo utente che sono usate a QPWDLVL 0 e 1 vengono rimosse dal sistema. Pertanto, il passaggio da QPWDLVL 3 a QPWDLVL 0 o 1 richiede un passaggio a QPWDLVL 2 prima di passare a 0 o 1 (il messaggio CPD2291 viene inviato quando si cerca di passare dal livello di password 3 a 0 o 1) perché QPWDLVL 2 permette la creazione di password di profilo utente che possono essere usate a QPWDLVL 0 o 1 (a condizione che la password creata su QPWDLVL 2 o 3 soddisfi i requisiti di lunghezza e sintassi di una password valida su QPWDLVL 0 o 1).

Nota 2. Il livello di password 3 ha più restrizioni rispetto al livello 2, anche se alcune di queste, come l’incompatibilità con i sistemi OS/400 V5R1 (valida anche per QPWDLVL 2) e con il prodotto IBM i Support for Windows Network Neighborhood (IBM i NetServer, vedi sopra), sono ormai superate per l’obsolescenza dei sistemi operativi interessati.

La modifica del valore di sistema QPWDLVL avrà effetto al prossimo riavvio del sistema. Il comando Visualizzazione Attributi di Sicurezza è usato per verificare i valori attuale e futuro del livello di password:

DSPSECA
...
Livello parola d'ordine  . . . . . . . . . :   0   
  Livello parola d'ordine in sospeso . . . :     2 
...

Modificare il file di visualizzazione della schermata di accesso al sottosistema QINTER per permettere password di formato misto e con una lunghezza superiore a 10 caratteri:

CHGSBSD SBSD(QSYS/QINTER) SGNDSPF(QSYS/QDSIGNON2)

Nota. Qui viene impostata la schermata di accesso predefinita IBM per QPWDLVL 2/3. Se ne hai una tua, ricorda che il campo password deve essere lungo 128 caratteri (o almeno uguale alla lunghezza specificata nel valore di sistema QPWDMAXLEN o impostata usando *MAXLENnnn nel valore di sistema QPWDRULES) e di consentire l’inserimento di lettere minuscole:

     A  01                              9 17'Password  . . . . . . . . . . . .'
     A  01        PASSWRD      128A  I  9 53CHECK(LC)
     A                                      DSPATR(ND)

Impostare l’avvio del sistema nello stato limitato:

CHGIPLA KEYLCKPOS(*NORMAL) STRRSTD(*YES)

Riavviare il sistema:

PWRDWNSYS OPTION(*IMMED) RESTART(*YES *IPLA) IPLSRC(B) ENDSBSOPT(*NOJOBLOG) CONFIRM(*NO)

Dopo l’avvio del sistema, controllare il valore attuale del livello di password:

DSPSECA
...
Livello parola d'ordine  . . . . . . . . . :   2   
...

Mettere il sistema in stato normale:

STRSBS SBSD(QCTL)

Verificare che tutto funzioni correttamente e poi, se richiesto, procedere con la modifica delle caratteristiche delle password.

Nota. Sarebbe meglio evitare di cambiare i valori di sistema delle password, come QPWDMINLEN, QPWDMAXLEN o QPWDRULES, finché non si è provato il nuovo valore QPWDLVL. Questo rende più facile la transizione al precedente valore QPWDLVL, se necessario. Per esempio, se vengono specificate password superiori a 10 caratteri, le password di livello 0 e 1 vengono cancellate. Inoltre, se le password contengono caratteri speciali o non seguono le regole di composizione per i nomi di oggetti semplici (esclusa la sensibilità al maiuscolo e al minuscolo), la password di livello 0 e 1 viene cancellata. In questi casi, un profilo utente non sarà in grado di collegarsi se il sistema viene riportato al livello di password 0 o 1.


Infine, ecco la fase di controllo.

Si può usare il giornale di controllo (audit) per controllare le password errate.

Per estrarre le informazioni sulle password errate è possibile usare il comando DSPJRN:

CRTDUPOBJ OBJ(QASYPWJ5) FROMLIB(QSYS) OBJTYPE(*FILE) TOLIB(QTEMP) NEWOBJ(FILE)
DSPJRN JRN(QAUDJRN) RCVRNG(*CURCHAIN) FROMTIME(ddmmyyyy hhmm) JRNCDE(*ALL) ENTTYP(PW) OUTPUT(*OUTFILE) OUTFILFMT(*TYPE5) OUTFILE(QTEMP/FILE)
STRSQL
SELECT PWTSTP AS TIMESTAMP, PWNBR CONCAT '/' CONCAT RTRIM(PWUSER) CONCAT '/' CONCAT RTRIM(PWJOB) AS JOB_NAME, PWTYPE AS ERROR_TYPE, PWUSRN AS USER_NAME, PWDEVN AS DEVICE_NAME, PWRADR AS REMOTE_IPA
FROM QTEMP/FILE
WHERE PWTYPE NOT IN ('D', 'E', 'X', 'Y', 'Z')

Note. Le voci relative agli eventi di Service Tool vengono ignorate (Security auditing journal entries):

Action or object
auditing value
Journal entry typeModel database outfileDetailed entryDescription
*AUTFAILPWQASYPWJE/J4/J5AAPPC bind failure
CCHKPWD failure
DAn incorrect service tool user ID was entered
EAn incorrect service tool user ID password was entered
PAn incorrect password was entered
QAttempted sign-on (user authentication) failed because user profile was disabled
RAttempted sign-on (user authentication) failed because password was expired
SSQL decrypt a password that was not valid
UUser name not valid
XService tools user is disabled
YService tools user not valid
ZService tools password not valid

In alternativa, poiché stiamo lavorando su un sistema operativo IBM i V7R3, è possibile usare la funzione di tabella definita dall’utente DISPLAY_JOURNAL:

SELECT
entry_timestamp AS TIMESTAMP,
job_number CONCAT '/' CONCAT RTRIM(job_user) CONCAT '/' CONCAT RTRIM(job_name) AS JOB_NAME,
remote_address AS REMOTE_IPA,
RTRIM(CAST(CAST(SUBSTRING(entry_data, 2, 10) AS VARCHAR(10) FOR BIT DATA) AS VARCHAR(10) CCSID 280)) AS USER_NAME
FROM TABLE(qsys2.display_journal(journal_library => 'QSYS',
journal_name => 'QAUDJRN',
starting_receiver_name => '*CURAVLCHN',
journal_entry_types => 'PW',
starting_timestamp => CURRENT TIMESTAMP - x HOURS))

Dobbiamo ricordare ai clienti che da questo momento in poi:

  • quando l’utente si autentica, dovrà inserire o una versione tutta maiuscola o tutta minuscola della password (la password mista non è consentita);
  • quando la password viene cambiata in un formato misto (con caratteri maiuscoli e minuscoli), il sistema registrerà la nuova versione comprensiva del formato perché ora il formato è importante.
  • è possibile utilizzare qualsiasi carattere (compresi i caratteri speciali, se non diversamente specificato nel valore di sistema QPWDLMTCHR, se usato).

 Riferimenti

Password Level (QPWDLVL)

Considerations for changing QPWDLVL from 0 or 1 to 2

Considerations for changing QPWDLVL from 0 to 3

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

Recent Posts

Code for IBM i 2.10.0 – Debug IBM i con Visual Studio Code

Le funzioni di debug con Visual Studio Code sono disponibili da qualche tempo ma questa nuova versione 2.10.0 semplifica la…

2 giorni ago

ObjectConnect over TCP/IP

A distanza di due anni e mezzo dal mio post Trasferire oggetti con ObjectConnect ed Enterprise Extender, sono finalmente riuscito…

2 giorni ago

SQL: SELECT con i “superpoteri”

Con un piccolo trucco anche una semplice istruzione SELECT può eseguire qualsiasi comando di sistema ! Vediamo come...

5 mesi ago

NetServer per tutti – parte 5

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 4

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 3

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago