Last Updated on 4 Settembre 2021 by Roberto De Pedrini
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 aQPWDLVL
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 type | Model database outfile | Detailed entry | Description |
*AUTFAIL | PW | QASYPWJE/J4/J5 | A | APPC bind failure |
C | CHKPWD failure | |||
D | An incorrect service tool user ID was entered | |||
E | An incorrect service tool user ID password was entered | |||
P | An incorrect password was entered | |||
Q | Attempted sign-on (user authentication) failed because user profile was disabled | |||
R | Attempted sign-on (user authentication) failed because password was expired | |||
S | SQL decrypt a password that was not valid | |||
U | User name not valid | |||
X | Service tools user is disabled | |||
Y | Service tools user not valid | |||
Z | Service 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