Vous êtes de plus en plus confronter à la mise en place de sécurité sur des services (ODBC, FTP, etc..)
il existe 2 solutions sur l’ibmi qui vont vous aider dans votre démarche
Les fonctions usage et les exit programmes
Vous avez des interfaces 5250 pour les administrer, mais aussi maintenant Navigator for i
WRKFCNUSG et WRKREGINF
Vous avez également des services SQL
QSYS2.SQL_CHECK_FUNCTION_USAGE(), QSYS2.FUNCTION_USAGE, QSYS2.FUNCTION_INFO
QSYS2.EXIT_POINT_INFO,QSYS2.EXIT_PROGRAM_INFO
Rapidement voici une petite comparaison
D’abord un essai de comparaison entre les principales valeurs
Accès / Fonctionnalité | Fonction d’usage (Function Usage ID) | Programme d’exit (Exit Point) | Description / Concerne |
---|---|---|---|
Accès base de données (ODBC, JDBC…) | QIBM_DB_OPEN | QIBM_QZDA_INIT , QIBM_QZDA_NDB1 | Autorise/refuse l’ouverture de base de données (SQL, ODBC, etc.) |
SQL Server Mode (QSQSRVR) | QIBM_DB_QSQSRVR | N/A | Contrôle l’accès aux jobs QSQSRVR (SQL server mode) |
DDM/DRDA | QIBM_DB_DDMDRDA | QIBM_QDDMDRDASERVER , QIBM_QDDSQLDRDA | Accès aux bases via DDM / DRDA |
ODBC Spécifique | N/A | QIBM_QZDA_SQL1 , QIBM_QZDA_INIT | Appels SQL via ODBC / DRDA |
JDBC | N/A | QIBM_QZDA_SQL1 , QIBM_QZDA_INIT | JDBC via Toolbox ou Native JDBC |
FTP | QIBM_FTP_SERVER | QIBM_QTMF_SVR_LOGON , QIBM_QTMF_SVR_EXIT | Contrôle l’accès FTP |
Telnet | QIBM_TELNET_SERVER | QIBM_QTV_TELNET | Contrôle l’accès Telnet |
Remote Command (RUNRMTCMD) | QIBM_NETWORK_SERVER | QIBM_QZRC_RMT | Exécution de commandes distantes |
Client Access (iSeries Access, ACS…) | QIBM_ACCESS3270 , QIBM_DB_OPEN | QIBM_QZDA_* (exits ODBC), QIBM_QZRC_RMT | Accès via IBM i Access clients (ODBC, FTP, etc.) |
Fonctions d’usage (Function Usage) :
Elles permettent d’activer ou de restreindre une fonctionnalité par utilisateur (sans programmation).
Elles ont un mode par défaut ouvert ou fermé
Vous devez ensuite gérer les exceptions à cette règle
C’est en œuvre par défaut sur votre système
C’est dynamique vous pouvez par exemple avoir un scripte qui modifie le paramétrage pour les heures HNO
C’est compliquer pour tracer les refus
Exit Programs (Programmes d’exit) :
Permettent une personnalisation des contrôles d’accès .
Vous pouvez indiquer des critères d’actions, de ressources, de temporalité
exemple, Michel à droit à uniquement le bibliothèque compta en HNO
Vous maitrisez entièrement la logique de contrôle
Vous pouvez auditer ou loguer avant d’interdire par exemple
Vous pouvez impacter les performances de votre système avec un mauvais programme, voir même bloquer sur un plantage
Ce n’est pas en œuvre par défaut sur votre système
Ce n’est pas dynamique vous devrez arrêter le service concerné pour une prise en compte
Simple pour tracer les refus, c’est votre programme
Conclusion
J’espère que ca vous aidera à faire votre choix
dans tous les cas c’est absolument indispensable aujourd’hui de se préoccuper de ces problèmes à minima des accès ODBC
Toujours d’actualité un service qui n’est pas utilisé doit être arrêter
Quand vous passez de FTP à SFTP vous ne bénéficier plus de ces 2 options
Vous changez de machine ou de version et les dates de référence de vos objets et vos sources vont être remise à zéro,
grâce aux services SQL , vous pouvez facilement conserver temporairement ces informations
Vous pourrez par exemple avoir besoin de ces informations pour faire une analyse d’impact sur l’utilisation de certain programmes ou de sources
Pour garder une trace de ces informations voici ce que vous pouvez faire
créer une bibliothèque
==> CRTLIB MIGRATION
vous avez intérêt à extraire les informations juste avant la migration
1) Sur les objets
Vous pouvez utiliser la fonction table QSYS2.OBJECT_STATISTICS
exemple :
create table migration.lstobj as(
SELECT * FROM TABLE (
QSYS2.OBJECT_STATISTICS(‘ALL’,’ALL’) ) AS X
) with data
Vous pouvez si vous le voulez choisir ou éliminer des objets ou des bibliothèques.
2) sur les sources
Si vous avez des fichiers sources QRPGLESRC, QCLSRC etc …
Vous pouvez utiliser la vue QSYS2.SYSPARTITIONSTAT
exemple :
create table migration.lstsrc as(
SELECT *
FROM qsys2.SYSPARTITIONSTAT WHERE
not source_type is null and NUMBER_ROWS > 0
) with data
ici on limite aux membres sources non vide
Si vous avez des fichiers sources dans L’ifs, nodejs, php, python, ou même des développements traditionnels en RPGLE ou CLLE
Vous pouvez utiliser la fonction table QSYS2.IFS_OBJECT_STATISTICS
exemple :
create table migration.lstifs1 as(
SELECT *
FROM TABLE (
qsys2.ifs_object_statistics(
start_path_name => ‘/Votre_repert/’ ,
subtree_directories => ‘YES’
)
)
) with data
Vous devrez limiter à vos repertoires de sources , vous pouvez en faire plusieurs
Ensuite vous devrez envoyer votre bibliothèque sur le systéme cible
Soit par la migration naturelle qui emmènera toutes les bibliothèques ou par une opération spécifique d’envoi de la bibliothèque FTP, SAVRSTLIB etc…
Attention :
Après 6 mois cette bibliothèque devra être supprimée, elle ne servira plus à rien
Remarque :
Vous pouvez également inclure dans cette bibliothèque d’autres éléments qui pourront être utile comme :
La liste des valeurs systèmes , QSYS2.SYSTEM_VALUE_INFO
Le planning des travaux , QSYS2.SCHEDULED_JOB_INFO
les programmes d’exit , QSYS2.EXIT_PROGRAM_INFO
les watchers , QSYS2.WATCH_INFO
les bases de données DRDA , QSYS2.RDB_ENTRY_INFO
les reroutages de travaux , QSYS2.ROUTING_ENTRY_INFO
la table des réponses par défaut , QSYS2.REPLY_LIST_INFO
etc …
On utilise de plus en plus les services SQL sur IBMi
Il peut être important de contrôler les services SQL installés sur votre machine
Vous avez 2 programmes qui sont fournis, nous vous proposons un petit habillage pour vous faciliter leurs utilisations
QSQIBMCHK et QSQSYSIBM
La commande
CMD PROMPT('Contrôles services SQL')
PARM KWD(TYPE) TYPE(*CHAR) LEN(4) RSTD(*YES) +
DFT(*CHK) VALUES(*CHK *FIX) PROMPT('Type +
de vérification')
Le programme CLLE
pgm parm(&type)
dcl &type *char 4
dclf qsys/QADSPFFD
/* Récupération du CCSID de la première zone de qadbxref */
DSPFFD FILE(QSYS/QADBXREF) OUTPUT(*OUTFILE) +
OUTFILE(QTEMP/WADSPFFD) /* w */
OVRDBF FILE(QADSPFFD) TOFILE(QTEMP/WADSPFFD) +
LVLCHK(*NO)
RCVF
/* Changement du job au bon CCSID */
chgjob ccsid(&WHCSID)
/* Pour contrôler les objets fournis par IBM qui sont manquants */
if cond(&type = '*CHK') then(do)
CALL QSYS/QSQIBMCHK
enddo
/* Pour corriger */
if cond(&type = '*FIX') then(do)
CALL QSYS/QSQSYSIBM
enddo
dltovr FILE(QADSPFFD)
endpgm
Pour contrôler
==>CTLSRVSQL *CHK
Vous allez avoir ces messages dans la LOG
QSQXRLF OBJECTS FOUND = 55
QSQXRLF OBJECTS UNKNOWN = 0
QSQXRLF OBJECTS MISSING = 0
QSQSYSIBM OBJECTS FOUND = 716
QSQSYSIBM OBJECTS UNKNOWN = 0
QSQSYSIBM OBJECTS MISSING = 0
SYSTOOLS OBJECTS FOUND = 105
SYSTOOLS OBJECTS UNKNOWN = 0
SYSTOOLS OBJECTS MISSING = 0
TOTAL IBM OBJECTS FOUND = 876
TOTAL IBM OBJECTS UNKNOWN = 0
TOTAL IBM OBJECTS MISSING = 0
QSQIBMCHK – OBJECT VERIFICATION COMPLETE
Si vous avez des erreurs par exemple 1 dans OBJECTS UNKNOWN vous devrez corriger
Pour corriger
==>CTLSRVSQL *FIX
Vous allez avoir ces messages dans la LOG
QSQSYSIBM ASNEEDED PROCESSING SUCCESSFUL FOR 1236 COMPONENTS.
PS :
Vous n’avez pas besoin d’être en mode restreint
Mais vous devez être *SECADM et *ALLOBJ
Pour en savoir plus
https://www.ibm.com/support/pages/qsqibmchk-tool
Merci Jean-Marie pour le thème suggéré
Vous devez surveiller l’IFS de votre partition et plus particulièrement la partie /home/ ou vous retrouvez les fichiers générés par vos utilisateurs et y faire le ménage régulièrement est une bonne pratique.
Une épuration à 30 jours semble un bon compromis
Voici 2 techniques pour réaliser cette opération
La première est à base d’un script UNIX
Voici un exemple, dans le répertoire /home/maurice/OUT on supprime les fichiers CSV de plus de 10 jours
Exemple :
find /home/maurice/OUT -type f -name « *.CSV » -mtime +10 -exec rm {} \;
Si vous voulez l’automatiser vous pouvez la mettre dans une commande ==>STRQSH
La deuxième est d’utiliser le nouveau service SQL SYSTOOLS.IFS_UNLINK
C’est une fonction, donc vous pourrez l’intégrer dans un select SQL
on prendra le même cas d’usage pour comparer
Exemple
SELECT path_name, SYSTOOLS.IFS_UNLINK(PATH_NAME)
FROM TABLE (QSYS2.IFS_OBJECT_STATISTICS(START_PATH_NAME => ‘/home/maurice/OUT’,
SUBTREE_DIRECTORIES => ‘NO’))
where ucase(Path_name) like(‘%.CSV%’)
and CREATE_TIMESTAMP < (current date – 10 days) ;
On utilise ici la fonction table QSYS2.IFS_OBJECT_STATISTICS qui permet de lister les fichiers d’un répertoire
Si vous voulez l’automatiser vous pouvez la mettre dans une commande ==>STRSQL ou dans dans du SQL embarqué
Conclusion
Il est important de surveiller L’IFS qui a tendance à grossir de manière excessive, et de supprimer les éléments inutiles
Nos solutions sont simples et efficaces vous pouvez facilement paramétrer les requêtes (répertoire, extension et périodicité)
Si vous avez mis en œuvre le journal vous pouvez et même devez analyser les refus de connexion.
Le plus souvent c’est un mauvais mot de passe mais ca peut être aussi une attaque, ou un comportement douteux
Voici une requête simple qui permet cette analyse rapide
SELECT JOB_NAME, USER_NAME, FUNCTION, MESSAGE_ID, MESSAGE_TIMESTAMP
FROM TABLE(QSYS2.DISPLAY_JOURNAL(‘QSYS’, ‘QAUDJRN’))
WHERE MESSAGE_ID IN (‘CPF2234’, ‘CPF1107’, ‘CPF1393’)
ORDER BY MESSAGE_TIMESTAMP DESC;
Les messages traités ici
CPF2234 Tentative de connexion échouée.
CPF1107 Mot de passe incorrect.
CPF1393 Accès refusé.
Remarque :
Vous pouvez ajouter des filtres (plage horaire, autres messages de refus , etc …)
Vous devrez découper vous même la zone entry data, vous pouvez également utiliser les fonctions table QSYS2.DISPLAY_JOURNALxx spécialisées par TYPE
Plus d’information ici https://www.ibm.com/support/pages/qsys2displayjournal
On a de plus en plus besoin d’avoir des machines synchronisées, pour la validation des transactions, des informations de sécurité etc…
il existe un protocole qui permet de synchroniser l’horloge de votre partition c’est le protocole SNTP
On va voir ici comment le mettre en œuvre en tant que client, en sachant que vous pourriez également utiliser votre IBMI comme un serveur
Votre serveur peut être interne ou externe il est accédé sur le port 123 , si vous cherchez un serveur :
https://syrte.obspm.fr/spip/services/ref-temps/article/diffusion-de-l-heure-par-internet-ntp-network-time-protocolv
1) Paramétrage du service TCP/IP
Vous devrez bien sur arrêter et redémarrer le service pour que la modification soit prise en compte
2) Mise en œuvre par la valeur système QTIMADJ mettre QIBM_OS400_NTP pour activer
3) Suivi des mises à jour, elles sont stockées dans un répertoire /QIBM/UserData/OS400/TCPIP/NTP
Vous avez des fichiers de log QTOTxxxx , ils sont horodatés
Vous avez également dans le journal d’audit les postes de type SV (modification de valeurs systèmes) qui peuvent être analysé
Vous y retrouverez les modifications de la valeur système QTIME
Pour en savoir plus
https://www.ibm.com/docs/fr/i/7.5?topic=protocol-scenario-synchronizing-clocks-i
N’hésitez pas c’est simple et efficace
?
Vous connaissez les fonctions usage qui vous permettent de sécuriser votre système IBMi
Exemple , accès au fichier
Elles sont organisées par famille
Voici les principales
Base operating system (5770SS1)
TCP/IP connectivity utilities (5770TC1)
Backup, Recovery, and Media Services (BRMS) (5770BR1 5770BR2)
IBM i Access Client Solutions (ACS) (5770XJ1)
IBM Navigator for i
Vous avez un site de référence qui va vous permettre de vous y retrouver c’est ici
https://www.ibm.com/docs/en/i/7.5?topic=reference-supplied-function-ids
Remarque :
De plus en plus de F U sont livrées en mode interdites, ce qui sécurise votre système, attention à QIBM_NAV_ALL_FUNCTION en V7R5 par exemple
Vous connaissez tous la notion de liste de bibliothèques qui existe sur l’ibmi
la même notion existe sous unix c’est le path, et qui impacte vos commandes exécutées par exemple à partir de QSH
Vous pouvez le changer temporairement, voici la commande par exemple qui prend votre PATH et lui ajoute l’accès au commande open source de votre machine
PATH=/QOpenSys/pkgs/bin:$PATH
export PATH PASE_PATH
Vous pouvez le changer de maniére dénitive pour une utilisateur
En créant un fichier .profile à la racine de votre path
Ca devrait donner ca /home/<votreuser>/.profile
Vous lui ajouter ces commandes
# Mise en ligne commande Open source
PATH=/QOpenSys/pkgs/bin:$PATH
export PATH PASE_PATH
Vous pouvez le changer globalement pour votre partition
Vous devez créer le fichier /etc/profile et lui ajouter ces lignes
# Mise en ligne commande Open source en plus des commandes standards
export PATH=/usr/bin:.:/QOpenSys/usr/bin
Remarque :
Vous pouvez également travailler en hardcodant , ce n’est pas conseillé pour des raisons de maintenance
exemple une copie de clé publique
/QOpenSys/pkgs/bin/ssh-copy-id ….
Vous pouvez également utiliser la variable d’environnement PATH
ADDENVVAR ENVVAR(PATH) VALUE(‘/usr/bin:.:/QOpenSys/usr/bin’) LEVEL(*JOB)
Vous choisissez le niveau *SYS ou *JOB
Bien sur si vous décidez d’utiliser le fichier etc/profile ou la variable d’environnement PATH avec portée *SYS, pensez à l’impact global sur votre système
Vous connaissez au moins de nom PRUV, qui est l’outil indispensable qui vous permet de valider vos opérations avant un changement de version .
Depuis quelques temps est apparu une nouvelle option liée au CLOUD
Si tout est ok vous aurez ce résultat
Sinon, il vous faudra prévoir une étape intermédiaire pour aller vers votre future architecture.
Plus d’informations ici
https://www.ibm.com/support/pages/ibm-pre-upgrade-verification-tool-ibm-i