, La valeur de sécurité QSECURITY

La valeur de sécurité QSECURITY

La valeur QSECURITY permet de connaître le niveau de sécurité appliqué au système.

Il y a 5 niveaux de sécurité, 10 – 20 – 30 – 40 – 50.

10 étant la sécurité la plus faible et 50 la plus élevé.

Pour connaître la valeur du niveau de sécurité de votre système, vous devez vous rendre dans les valeurs système en utilisant la commande WRKSYSVAL.

Au vu du nombre de valeurs de notre système, on va trier par sous-ensemble.

On va rentrer *SEC pour aller voir les valeurs système de sécurité.

On affiche ensuite la valeur système QSECURITY.

Sur la ligne rouge on peut voir le niveau de sécurité de notre système.

Dans le carré bleu, on peut voir les 5 niveaux de sécurité avec une courte description.

Depuis la version V7R5, le niveau de sécurité minimal est de 30.

Tableau des valeurs de QSECURITY depuis la V7R5

IBM recommande le niveau de sécurité 40 en raison des vulnérabilités trouvées au niveau 30.

La plupart des entreprises possédant un IBM i travaillent avec un niveau de sécurité 40.

Seuls les services financiers et quelques autres entreprises utilisent le niveau de sécurité 50 pour se conformer aux normes de défense américaine.

Voyons maintenant en détails, les 5 niveaux de sécurité :

Niveau 10 Pas de mot de passe requis, des profils sont créés à chaque fois qu’un utilisateur essaie de se connecter. Les utilisateurs créés ont accès à tout car l’autorité *ALLOBJ leur est attribuée automatiquement. Ce niveau n’est plus entretenu par IBM.

Niveau 20 → À ce niveau l’autorité *ALLOBJ est toujours attribuée à chaque utilisateur. En plus du niveau 10, un identifiant et un mot de passe sont nécessaires pour se connecter. Seul un profil *SECADM peut créer des nouveaux profils utilisateur. Ce niveau n’est plus admis depuis la V7R5.

Niveau 30 → En plus du niveau 20, ce niveau peut gérer les autorisations des utilisateurs au cas par cas. Les profils ayant l’autorité *ALLOBJ sont forcément créés avec la classe de sécurité *SECOFR, les autres n’ont pas cette autorité.

Niveau 40 → Protection de l’intégrité du système d’exploitation. Signature et sécurité des ressources. Le système empêche les tentatives d’appeler directement des programmes système non reconnus.

Niveau 50 → Protection renforcée de l’intégrité du système d’exploitation. Signature et sécurité des ressources. Avant de passer à ce niveau, la mise en place du journal d’audit est obligatoire. Ce niveau a été créé pour répondre à la norme C2 (Norme de département de défense Américain). Une meilleure protection des blocs de contrôle interne est appliquée.

, , Droits et génération SQL script

Vous devez moderniser votre base de données, pour cela vous pouvez commencer par extraire le source de votre PF,
par exemple en passant par Générations d’instructions SQL dans ACS , ou en utilisant la procédure SQL de QSYS2 GENERATE_SQL Ou GENERATE_SQL_OBJECT ,


La plus part du temps on obtient un scripte SQL qui vous permettra de générer votre nouvelle table , ici un exemple ou on a enlevé les commentaires.

Que ce passe t’il au niveau des droits ?

Avant par DSPOBJAUT

par DROITS dans ACS

La liste d’autorisations

Premier effet vous pouvez avoir des différences sur les droits publics

exemple ici

Après

Vous vous retrouvez avec un droit USER DEF au lieu de *CHANGE et vous avez perdu le droit exécute, on est d’accord ca ne change rien sur une table, c’est juste un peu moins lisible quand on analyse au niveau du système

le plus gênant c’est la liste d’autorisation que vous perdez
et la cela peux changer complètement puisque vous perdez 1 voir 2 niveaux de recherches

Dans notre cas FORM06 se retrouve avec des droits *PUBLIC

Conclusion :


Après avoir modernisé vos tables, vous devez réappliquer vos droits le plus simple est de généré un objet de référence

une autre solution est de vous affranchir des listes d’autorisation qui ne sont pas générées dans SQL

, , , Tuez les jobs SSH dans QINTER

Si vous commencez à faire du SSH (en tant que client), par exemple pour faire du GitHub, vous avez des jobs qui vont rester et que vous devrez tuer par un kill ou un ENDJOB.

C’est des jobs BCI qui restent après avoir arrêté vos JOBs interactifs.

Voici un petit script CLP qui permet de faire ça, il vous suffit de le planifier tous les soirs à 23 heures par exemples.

Ici on a utiliser la fonction table QSYS2.ACTIVE_JOB_INFO et la fonction QSYS2.QCMDEXC et on packagé le tout dans un CLP …

PGM
/* Suppression des jobs SSH dans QINTER */
dcl &NBRCURRCD *dec 10
/*  Exécution de la requete SQL */
             RUNSQL     SQL('Create table qtemp/sortie as(SELECT +
                          QSYS2.QCMDEXC(''ENDJOB '' CONCAT +
                          JOB_NAME)  as resultat FROM +
                          TABLE(QSYS2.ACTIVE_JOB_INFO(SUBSYSTEM_LIST_+
                          FILTER => ''QINTER'')) X  where job_type +
                          = ''BCI'') with data') COMMIT(*NONE)
             MONMSG     MSGID(SQL0000) exec(do)
             SNDUSRMSG  MSG('Erreur dans l''exécution de la requête +
                          SQL d''épuration des jobs SSH') +
                          MSGTYPE(*INFO)
             Return
             enddo
  /* Envoi d'un message de fin */
             RTVMBRD    FILE(QTEMP/SORTIE) NBRCURRCD(&NBRCURRCD)
             if cond(&NBRCURRCD > 0) then(do)
             SNDUSRMSG  MSG(%CHAR(&NBRCURRCD) *TCAT ', job(s) SSH +
                          arrêté(s)') MSGTYPE(*INFO)
             enddo
             else do
             SNDUSRMSG  MSG('Pas de Job SSH à Supprimer ') +
                          MSGTYPE(*INFO)
             enddo
ENDPGM

Sur les job de ssh-agent vous pouvez demander le kill directement comme ceci, merci à Julien …

La commande QSH lancer par votre CL qui vous permet de soumettre se présente donc comme ça :

eval "$(ssh-agent -s)" ; // Démarrage de l'agent 
SSH ssh-add /home/jl/.ssh/github ; // Ajout de la clé à l'agent 
ssh -T git@github.com ; // Test de connexion à GitHub 
ssh-agent -k // Arrêter l'agent
, , Droits SQL sur les Zones

On m’a récemment demandé comment savoir si un fichier était couvert par des droits SQL sur les zones

J’ai d’abord pensé que la fonction table QSYS2.OBJECT_PRIVILEGES allait me rendre ce service !

donc j’ai lancé cette requête pour analyser mon fichier

Exemple :

SELECT *
FROM TABLE(QSYS2.OBJECT_PRIVILEGES(‘MABASESQL’, ‘CLIENTS’, ‘*FILE’));

et je n’ai pas trouvé l’information dans les zones renvoyées

puis j’ai essayé avec les commandes historiques en sortie de fichier ici DSPOBJAUT

Exemple :

DSPOBJAUT OBJ(MABASESQL/CLIENTS)
OBJTYPE(FILE) OUTPUT(OUTFILE)
OUTFILE(MABASESQL/LSTAUT)

Select * from MABASESQL.lstaut

et la on a le résultat qui l’indique
ZONE OAOBJA à ‘USER DEF’ et une ZONE des DATA ici OAUPD à ‘/’

En résumé

On ne sait pas par SQL, mais on sait faire par une sortie fichier historique


Oui je sais , on peut trouver l’information par des vues spécifiques dans QSYS2 et SYSIBM

Vous avez d’abord la vue SYSIBM.SQLCOLPRIVILEGES mais attention, vous avez toutes les autorisations sur la zone y compris celles qui correspondent à un *CHANGE sur le fichier par exemple.


exemple :

Select * from SYSIBM.SQLCOLPRIVILEGES
where TABLE_SCHEM = ‘MABASESQL’ and TABLE_NAME = ‘CLIENTS’

order by column_name, grantee


Ou mieux la vue QSYS2.COLUMN_PRIVILEGES qui ne contient que les zones avec des autorisations spécifiques

exemple

Select * from QSYS2.COLUMN_PRIVILEGES
where TABLE_SCHEMA = ‘MABASESQL’ and TABLE_NAME = ‘CLIENTS’

j’ai donc fait une RFE pour avoir l’information dans la fonction table QSYS2.OBJECT_PRIVILEGES

Si vous êtes intéressés votez pour moi c’est ici https://2e4ccba981d63ef83a875dad7396c9a0.ideas.aha.io/ideas/RIRP-I-1260

Je vous indiquerais la réponse d’IBM sur le sujet

, EXIT PGM sur PWRDWNSYS

Dans les programmes d’exit, il en existe un qui s’exécutera avant un PWRDWNSYS


Pour 2 raisons


-1 Pour faire un contrôle par rapport à une condition particulière de lancement
-2 Pour fermer des applications et valider des informations en cours

Voici un exemple succinct qu’il vous faudra améliorer

Ici on demande juste de valider par un Y que l’IPL est bien voulu

La commande pour ajouter le point d’exit est au début du programme

PGM                                                                    
/* association pour associer le programme */                           
/*ADDEXITPGM EXITPNT(QIBM_QWC_PWRDWNSYS)  */                           
/* FORMAT(PWRD0100)                       */                           
/* PGMNBR(1)                              */                           
/* PGM(GDATA/PPWRDWN)                     */                           
DCL VAR(&RPY) TYPE(*CHAR) LEN(1)                                       
dcl VAR(&USR) TYPE(*CHAR) LEN(10)                                      
Rtvjoba USER(&USR)                                                     
             SNDUSRMSG  MSGID(CPF9897) MSGF(QCPFMSG) +                 
                          MSGDTA('PWRDWNSYS demandé par, ' *BCAT +     
                          &USER *BCAT 'Tapez pour valider.') +         
                          VALUES('Y' 'N') DFT('N') TOUSR(QSYSOPR) +    
                          MSGRPY(&RPY)                               
/* Si non on arrête le travail */                                      
if (&RPY *NE 'Y') then(do) 
             SNDUSRMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA('****  +   
                          PWRDWNSYS annulé ****') MSGTYPE(*INFO) +     
                          TOUSR(QSYSOPR)                               
              ENDJOB     JOB(*) OPTION(*IMMED)      
ENDDO                                              
 /* Si oui faire les traitements de fermeture    */    
 /*  pour les applications sensibles par exemple */
 /* libérer des unités etc ...                   */  
 endpgm  

Remarque

Vous pouvez tester même le type d’ipl ou la zone de redémarrage en utilisant les paramètres que vous pouvez recevoir dans la zone au format PWRD0100 ou
PWRD0100.
Attention après sa mise en œuvre, il sera appelé à chaque lancement de PWRDWNSYS pour l’enlever

RMVXITPGM EXITPNT(QIBM_QWC_PWRDWNSYS) FORMAT(PWRD0100) PGMNBR(1)

Plus d’informations ici
https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/xpwrdwn.htm

C’est le nombre de tentatives de connexions pour un profil


Vous pouvez désormais depuis la version 7.5 l’indiquer au niveau du profil et non plus de manière global par la valeurs système QMAXSIGN pas de *NOMAX 25 max

Pour connaitre le nombre de tentatives par profil sur votre ibmi

SELECT AUTHORIZATION_NAME, (CASE MAXIMUM_SIGN_ON_ATTEMPTS
WHEN ‘*SYSVAL’ THEN (select CURRENT_CHARACTER_VALUE
from QSYS2.SYSTEM_VALUE_INFO
where SYSTEM_VALUE_NAME = ‘QMAXSIGN’)
ELSE MAXIMUM_SIGN_ON_ATTEMPTS
END) AS MAXIMUM_SIGN_ON_ATTEMPTS
FROM qsys2.user_info

.

Conseil

Continuez à gérer le plus grand nombre par QMAXSIGN et les exceptions au niveau des profils spécifiques

, SAV IFS en V7R5

Le paramètre ASYNCBRING qui existait mais qui était à *NO passe à *YES par défaut sur la commande SAV
Ce qui permait d’améliorer les temps de sauvegarde en bufferisant les fichiers

Nous utilisons déjà cette option en V7R4 depuis longtemps

Sur 2 cas constatés

Chez nous

32000 fichiers à sauvegarder
gain quotidien environ 4 minutes

Chez un client Lyonnais

450000
gain quotidien 17 minutes

Remarque :
Efficace sur les petits fichiers très nombreux

Pour gagner du temps sur une sav21 vous pouvez également mettre l’attribut *ALWSAV à *NO sur des répertoires
par exemple sur de logs, des images iso, des répertoire temporaires etc .. ces répertoires ne seront pas sauvegardés

CHGATR OBJ(‘/home/qsecofr/test’)
ATR(ALWSAV) VALUE(NO)

Vous pouvez désormais mettre des points d’exit pour savoir quand un fichier IFS est ouvert ou fermé
QIBM_QP0L_OBJ_OPEN
QIBM_QP0L_OBJ_CLOSE
le format de data utilisé est le OBOP0100

exemple de programme en CLP

/*-------------------------------------------------------------------*/
/* exit pgm QIBM_QP0L_OBJ_OPEN  FMT OBOP0100                         */
/* Contrôle ouverture de fichier                                     */
/*-------------------------------------------------------------------*/
pgm (&data &retour)                                                    
/* Paramètres                                                        */
dcl &data *char 512  /* Variable recue                               */
dcl &retour *char 4  /* Variable renvoyée                            */
                     /*   0 pour OK                                  */
                     /*   1 pour KO                                  */
/* Variables de travail                                              */
             DCL        VAR(&USER) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 1)                              
             DCL        VAR(&EXT) TYPE(*CHAR) STG(*DEFINED) LEN(8) +   
                          DEFVAR(&DATA 11)                             
             DCL        VAR(&TYPE) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                           DEFVAR(&DATA 23)                            
              DCL        VAR(&FLAG) TYPE(*CHAR) STG(*DEFINED) LEN(4) + 
                           DEFVAR(&DATA 28)                            
              DCL        VAR(&IDENT) TYPE(*CHAR) STG(*DEFINED) +       
                           LEN(16) DEFVAR(&DATA 33)                    
              DCL        VAR(&PATHL) TYPE(*CHAR) STG(*DEFINED) LEN(4) +
                           DEFVAR(&DATA 49)                            
              DCL        VAR(&PATH) TYPE(*CHAR) STG(*DEFINED) +        
                           LEN(256) DEFVAR(&DATA 53)                   
              dcl &len *dec (5 0)                                      
  /* Conversion du path UTF16/UCS2 vers CCSID en cours */              
              CALL       PGM(CVTUCS2) PARM((&PATH) (&PATH))            
  /* Longueur après conversion / 2 car UCS2 = 2 caractères */          
  chgvar &len (%BIN(&PATHL) / 2)                                       
 /*--------------------------------------------*/                      
 /* Ici Votre traitement                       */                      
/*--------------------------------------------*/                 
             SNDUSRMSG  MSG('Fichier ' *BCAT %SST(&PATH 1 &LEN) +
                          *BCAT ', ouvert par ' *BCAT &USER) +   
                          MSGTYPE(*INFO)                         
/*--------------------------------------------*/                 
/* Validation de la demande         0 pour OK */                 
/*--------------------------------------------*/                 
CHGVAR VAR(%BIN(&retour)) VALUE(0)                               
endpgm     

pour l'attachement du programme au point d'exit 
                                                      
ADDEXITPGM   EXITPNT(QIBM_QP0L_OBJ_OPEN) 
             FORMAT(OBOP0100)            
             PGMNBR(1)                   
             PGM(PLB/PGMIFS)             
             THDSAFE(*YES)               
             REPLACE(*NO)                

attention à bien mettre le paramètre THDSAFE(*YES)

Remarque :
Le path du fichier est déclaré en UCS2 ci joint un petit programme de conversion en RPGLE , utile si vous avez choisi d’écrire votre programme en CLLE

**free                                                
      // Programme de conversion CVTUCS2                     
      //   utf16/UCS2 vers ccsid en cours  par défaut 
  Dcl-pi *N ;                                         
   I_zon  ucs2(256) ; // soit une chaine de 128       
   O_zon  char(256) ;                                 
  End-pi ;                                            
   O_zon = I_zon ;                                    
 *inlr = *on ;

Pour être analysé par le point d’exit vos fichiers doivent avoir l’attribut *RUNEXIT

Pour le mettre sur un fichier

CHGATR OBJ(‘/home/QSECOFR/QPJOBLOG.PDF’) ATR(RUNEXIT) VALUE(YES)

Pour le mettre sur tous les fichiers crées dans votre répertoire

CHGATR OBJ(‘/home/QSECOFR/’) ATR(CRTRUNEXIT) VALUE(YES)

Cette information n’est pas encore disponible dans la vue QSYS2.IFS_OBJECT_STATISTICS

, , Sécurisation Netserver en V7R5

A partir de la version 7.5, vous avez de nouvelles options pour l’administration de NetServer

Vous pouvez par exemple nommer les utilisateurs ayants accès aux partages de votre ibmi.

Vous devez créer une liste d’autorisation, par exemple netserver et pour qu’un utilisateur puisse accéder il faut qu’il aie le droit *use sur cette liste

Création de la liste d’autorisation

*USE droit de lecture

*CHANGE ou *ALL droit de mise à jour

Association de la liste au service Netserver

.

Arrêt redémarrage du service pour prise en compte

.

Si votre utilisateur n’est pas listé dans votre liste

.

Si votre utilisateur est inscrit dans la liste

Vous pouvez aller puis loin en mettant une liste d’autorisations par partage, vous devrez indiquer cette liste au moment où vous créerez le partage

.

le principe est le même mais partage par partage , attention à l’administration qui en découle , vous retrouvez ces informations dans la vue QSYS2.SERVER_SHARE_INFO zone SHARE_AUTHORIZATION_LIST

Exemple de requête pour voir les partages protégés

SELECT SERVER_SHARE_NAME, TEXT_DESCRIPTION, PATH_NAME, SHARE_AUTHORIZATION_LIST FROM QSYS2.SERVER_SHARE_INFO
WHERE SHARE_TYPE = ‘FILE’;

Remarque :

donc pour connaitre les utilisateurs qui peuvent faire du netserver vous pouvez utiliser SQL par exemple

SELECT AUTHORIZATION_NAME, OBJECT_AUTHORITY
FROM QSYS2.AUTHORIZATION_LIST_USER_INFO
WHERE AUTHORIZATION_LIST = ‘NETSERVER’
and AUTHORIZATION_NAME <> ‘*PUBLIC’

.

Rappel :

On ne partage jamais la racine !

, Installation V7R5 à partir d’une V7R3

On a utilisé la nouvelle version de PRUV que vous pouvez télécharger ici https://www-01.ibm.com/marketing/iwm/iwm/web/dispatcher.do?source=ipvt
le produit est de plus en plus complet et fiable

Par exemple il nous a indiqué quelques PTFs spécifiques.

.
.

on a choisit de faire la migration par un lecteur optique virtuel

On appliqué les PTFs de manière permanente
On a fait une sauvegarde 21
On a téléchargé les images à partir de ESS et créer le lecteur optique virtuel

pour comprendre les supports à télécharger rdv ici

https://www.ibm.com/docs/fr/i/7.5?topic=reference-media-labels-their-contents


On a fait tous les contrôles à partir de GO Licpgm puis option 5


vous devez faire option par option


Attention, à bien accepter les licences sur chaque produit pour avoir cet écran
On a fait un dernier contrôle par PRUV qui nous a indiqué que des items verts
Vous êtes prêt à faire l’opération

PWRDWNSYS OPTION(IMMED) RESTART(YES) IPLSRC(*IMGCLG) IMGCLG(IMG001)
C’est parti !


Attendez que cela ce passe

On a fait redémarrage complet et fait nos tests

On a récupéré les licences sur ESS et nous les avons entré sur notre partition


Nous avons ensuite récupéré puis appliqué les PTFs disponibles pour la 7.5
Nous avons pour finir sauvegardé à nouveau le système

l’opération était alors terminée, on n’a pas eu de problème, et aucune régression à ce jour

Ps :
On a contrôlé les formats de commandes de sortie des fichiers systèmes. Quelques modifications, on n’était pas concernés …

Merci à Younes pour son aide