PASE sur IBM i
Option 33 de 5770SS1, livrée sans surcoût depuis la V5R2.
PASE for i apporte un environnement intégré qui permet de faire fonctionner des applications ou des produits d'origine UNIX ( AIX ).
PASE for i intègre aussi des shell conformes aux standards permettant la saisie de commandes et la création de scripts.
il peut être completé par l'installation de 5733SC1 (openssl et ssh)
Il est enfin, l'élément indispensable pour installer les produits open source proposés par IBM
EN 7.4 PASE for i est dérivé d' AIX® 7.2, Technology Level 2.
contrairement à QSH, PASE n'est pas un environnement émulé, mais natif.
il dialogue en direct avec le microcode, et ne travaille qu'en ASCII !
![]()
les binaires (library) d'AIX sont installés dans /QOpensys/usr/bin et /QOpensys/usr/sbin.
la fonction syscall permet un dialogue avec le kernel et le monde ILE.
C'est PASE qui fait "tourner" PHP, Java (depuis la version 6) et les produits Opensource comme NodeJS ou Python,
ainsi que le compilateur GCC, permettant de compiler directement depuis un source en C.
Vous avez une indication fournie par DSPJOB, option 11 pour connaitre l'environnement d'exécution
- Type à blanc = IBM i "natif"
- P = PASE
- J = java
![]()
- Sont communs aux deux mondes
- l'espace adressable unique (la gestion des disques)
- DB2 (un driver UnixODBC peut être installé par YUM)
- la gestion des travaux (ps) et des threads
- les profils utilisateurs
Shell
+ le répertoire de PASE est /QOpenSys/usr/bin
Si un exécutable n'est pas trouvé dans le chemin indiqué, PASE essaie en ajoutant "/QOpenSys" devant la racine ("/") du chemin,
sauf à renseigner la variable d'env. "PASE_EXEC_QOPENSYS" à "N"
+ Les fonctions PASE qui retournent les utilisateurs et les groupes, retournent les noms en minuscules
sauf à renseigner "PASE_USRGRP_LOWERCASE" à "N"
Le shell lancé par PASE est le Khorn shell (/QOpenSys/usr/bin/sh) par défaut
Contrairement à QSH, le shell et PASE en général, ne tiens pas compte des CCSID.
IBM fournit trois utilitaires
- qsh et qsh-inout lancent un shell qui adapte stdin, stdout et stderr au CCSID du job
- qsh_out lancent un shell qui adapte uniquement stdout et stderr au CCSID du job
Si vous avez installé 5733SC1, le plus simple est de démarrer SSH (STRTCPSVR *SSHD)
et de vous connecter depuis une application cliente (compatible tty):
QSYS2.SET_PASE_SHELL_INFO, procédure pour définir le shell par défaut sous PASE
CALL QSYS2.SET_PASE_SHELL_INFO('*CURRENT', '/QOpenSys/pkgs/bin/bash');
CALL QSYS2.SET_PASE_SHELL_INFO('*DEFAULT', '/QOpenSys/usr/bin/ksh');
LC_ALL=fr_FR.UTF-8 export LC_ALL |
Si vous avez commencé à installer des produits par YUM
PATH=/QOpenSys/pkgs/bin:$PATH LIBPATH=/QOpenSys/pkgs/lib:$LIBPATH |
En vous connectant par SSH, votre répertoire en cours sera par défaut le HOMEDIR de votre profil. Si vous souhaitez avoir un répertoire d'atterrissage différent :
cd /www/webserver/htdocs |
Pour vous connecter sans Mot de passe
Avec Putty
Générez une clé avec puTTYgen
Sauvegardez la clé Privée au format Putty (.ppk)
puis, soit :
Attribuez les droits sur /home/nom-de-user et /home/nom-de-user/.ssh à 704 par chmod
Vérifiez aussi les droits sur authorized_keys
attention, pas assez ou trop de droits provoque "server refused our key"
Cette configuration peut être utilisée sous putty pour lancer un shell
puis sauvegarde
Si vous recevez "failed to connect"
pour accepter des profils sur 10, ajoutez ibmpaseforienv PASE_USRGRP_LIMITED=N dans /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc/sshd_config
voir http://www-01.ibm.com/support/docview.wss?uid=nas8N1011847 |
vous ne pourrez plus vous connecter sous QSECOFR (uid à 0 est assimilé à root) PermitRootLogin yes |
pour pouvoir être ré-utilisée directement depuis ACS
Configurez AcsConfig.properties comme ceci :
ET voilà
Pour avoir une log détaillée, voyez ce document IBM qui indique comment mettre en place syslog
https://www.ibm.com/support/pages/sshd-can-use-unix-syslog-facilities-logging
Attention à la casse pour les objets de QSYSls /qsys.lib/bdvin1.lib/VIN*.FILE |
Option | Signification |
-name | Recherche par nom de fichier. |
-type |
Recherche par type de fichier. |
-user |
Recherche par propriétaire. |
-group |
Recherche par appartenance à un groupe. |
-size |
Recherche par taille de fichier. |
-atime |
Recherche par date de dernier accès. |
-mtime |
Recherche par date de dernière modification. |
-ctime |
Recherche par date de création. |
-perm |
Recherche par autorisations d'accès. |
-links |
Recherche par nombre de liens au fichier. |
-exec |
exécute une commande à chaque fichier
-exec rm {} \; |
Quelques exemples d'utilisation
vous pouvez zipper des fichiers par :
zip fichier-zip-à-créer fichier(s)-à-zipper
ou bien par : (depuis un CL ou une ligne de commande)
CALL QP2SHELL PARM('/QopenSys/usr/local/bin/zip' +
'/chemin/archive.zip' +
'/chemin/fichier(s)-à-zipper/')
Vous pouvez aussi utiliser 7zip,sur http://www.scottklement.com/p7zip/
Attention QP2SHELL n'est pas un shell,
il en joue, en partie, le rôle : il lance l'exécutable.
vous ne pourrez pas profiter de certains services du shell
- globing (caractères génériques comme *)
- tubes [|] ou redirections [>], et commandes multiples [:]
dans ce cas demandez à QP2SHELL de lancer sh (le shell lui même)
avec l'option -c (exécution d'une commande en paramètre)
CALL PGM(QP2SHELL) PARM('/QOpenSys/usr/bin/sh' +
'-c' 'cp /repertoire1/*.txt /sauvegardes')
en CL CALL PGM(QP2SHELL) PARM('/QOpenSys/usr/bin/sh' +
'-c' &CDE)
Les exécutables sous PASE n'envoient pas de messages d'erreur interceptables
par MONMSG, ils envoient un code retour.
Pour le tester :
DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(200) DCL VAR(&RCVVARLG) TYPE(*CHAR) LEN(4) CHGVAR VAR(&CDE) VALUE('cp /repertoire1/*.txt /sauvegardes') CALL PGM(QP2SHELL) PARM('/QOpenSys/usr/bin/sh' '-c' &CDE) CHGVAR VAR(%BIN(&RCVVARLG)) VALUE(200) /* taille de RCVVAR */ CALL PGM(QUSRJOBI) PARM(&RCVVAR + &RCVVARLEN + 'JOBI0600' + '*' + ' ' ) IF (%BIN(&RCVVAR 109 4) *NE 0) THEN(DO) SNDPGMMSG MSGID(CPF9898) MSGTYPE(*ESCAPE) MSGF(QCPFMSG) + MSGDTA('commande de copie en erreur') ENDDO |
Pour lancer un script nommé "shell.sh", utilisez la syntaxe suivante :
CALL PGM(QP2SHELL) PARM('/QOpenSys/usr/bin/sh' '/tmp/shell.sh')
Attention si vous saisissez ce shell sous 5250 (EDTF ou WRKLNK puis "2")
- demandez bien à ce que le fichier soit en ASCII 819
(faites F15, option 3 et saisissez 819 à la place de 297
particulièrement en cas de création)
- demandez aussi à ce que les fins de lignes soient marquées par le
caractère LF (standard unix) et non CRLF (standard windows)
(faites F15, option 5 et choisissez *LF)
- commencez votre script par "#! /usr/bin/sh" et donnez le droit *RX
openSSL (5733SC1)
Cryptage de fichiers et gestion de certificats
regardons ici OpenSSL, qui permet de générer des certificats afin, par exemple,
de crypter des fichiers (pour transmission à un tiers ?)
sous QP2TERM
openssl genrsa -out private.key 512|1024|2048 (lg de la clé, 2048 est bien)
-> cela génère votre clé privée dans un fichier private.key
puis
openssl req -new -days 365 -key private.key -x509 -out certificat.pem
cela génère un certificat (pour 365 jours) représentant votre société (clé publique)
il faut répondre à des questions interactives :
You are about to be asked to enter information that will be incorporated |
vous devez ensuite générer un fichier ".rnd", qui servira pour initialiser les fonctions aléatoires de cryptage
a/ saisissez des données par EDTF (commande OS/400)
ou
b/ passez la commande ls /* > .rnd
le certificat ainsi obtenu "certificat.pem" doit être transmis à votre interlocuteur, de même vous devez recevoir le sien (par ex. client.pem)
pour crypter un fichier, à lui envoyer ensuite (FTP, mail...) :
openssl smime -encrypt -inkey private.key -signer certificat.pem -binary
-in texte1.txt client.pem > texte1.p7m
pour décrypter un fichier recu:
openssl smime -decrypt -in texte2.p7m -inkey private.key
-recip certificat.pem > resultat.txt
(ce fichier ne pouvant être décrypté QUE par vous)
• Utilisation de l'utilitaire acme.sh (dont l'utilisation est décrite ici )
pour générer un certificat avec Let's Encrypt
vous devez faire cette manip. depuis le serveur lui même (en effet le script génère un fichier temporaire qui doit être accessible par le site de letsencrypt)
Exemple qui ne fonctionne pas '/www/VOLUBIS/htdocs' ,n'est pas le documentROOT de notre site
ceci fonctionne (et peut donc être lancé en batch, voire plannifié)
![]()
... / ...
![]()
transformons ce certificat au format PKCS12 (fichier .pfx) qui du coup peut être importé dans DCM
![]()
• Le même produit contient un démon SSH( STRTCPSVR *SSHD) et un client, permettant de se connecter en SSH à un serveur
en V6R1 les clés serveur sont générées automatiquement
en V5R4, lancez :
ssh-keygen -N "" -t rsa1 -f ssh_host_key
ssh-keygen -N "" -t dsa -f ssh_host_dsa_key
ssh-keygen -N "" -t rsa -f ssh_host_rsa_key
(la chaine vide derrière -N est en fait un mot de passe)
Vous pouvez maintenant vous connecter avec puTTY ou depuis un terminal Linux/MAC comme vu plus haut
Pour se connecter à un serveur, sa clé doit être stockée dans :
~/.ssh/known_hosts sur le poste client
pour récupérer la clé lancez :
ssh-keyscan -t rsa serveurlinux(par ex) >> ~/.ssh/known_hosts
Si la clé du serveur n'est pas celle mémorisée (reconfig, suite à un crash,...) vous verrez :
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
Editez le fichier known_hosts et enlevez la ligne correspondante (1 dans notre exemple)
Utilisez SSH pour passer des commandes sur un serveur Unix/linux ou HMC |
OpenSSH et serveur Windows (2016 dans nos exemples, cela devrait être intégré à Windows 2019)
Téléchargez depuis le site https://github.com/Powershell/Win32-OpenSSH/releases
Offrant une alternative à l'option d'ACS /PLUGIN=rmtcmd
• Si, sous SSH, vous ne pouvez pas saisir de mot de passe (alors que vous pourriez depuis Putty),
c'est que le type de terminal n'est pas reconnu ou que vous êtes en batch (par définition, il n'y a pas de terminal).
voyez alors, l'utilitaire expect :
- solution d'origine AIX, sur le site de scott Klement : http://www.scottklement.com/expect/
- version opensource, téléchargeable par ACS (mars 2020)
![]()
Ce produit permet de simuler une saisie clavier
1/ installez le, comme indiqué sur le site vu plus haut
2/ Editez le fichier par EDTF (pensez au CCSID 819)
.......................................
: #!/usr/local/bin/expect -f :
: set timeout 120 :
: spawn sftp user@serveursftp :
: expect "password:" : respectez bien la casse
: send "mypwd\n" :
: expect "sftp>" : (à ajuster suivant vos besoins)
: send "put /temp/cours.csv\n" :
: expect "sftp>" :
: send "quit\n" :
: exit :
:.....................................:
et lancez ce script depuis le CL suivant
PGM
CALL QP2SHELL PARM('/usr/local/bin/expect' '-df' +
'/tmp/Escript')
ENDPGM
Ca doit marcher (chez nous ca marche). IBM donne aussi cette astuce
Vous pouvez aussi éviter la phase d'authentification en important la clé avant.
il faut créer une paire de clés associée à l'utilisateur :
ssh-keygen -t rsa
Création d'une paire de clés rsa publique/privée. Enter file in which to save the key (/HOME/USER/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Votre identification a été sauvegardée dans /HOME/USER/.ssh/id_rsa Votre clé publique a été enregistrée dans /HOME/USER/.ssh/id_rsa.pub. L'empreinte digitale de la clé est :
fc:ee:bf:db:fd:ac:fb:8f:e4:03:cb:7e:8e:04:d1:8c user@AS400.volubis.fr
vous pouvez redemander l'affichage par ssh-keygen -l
Cette commande a généré deux fichiers :
id_rsa : votre clé privée et id_rsa.pub : votre clé publique
dans le cache local, /HOME/(votre_nom)/.ssh
Transférez votre clé publique sur le serveur (par FTP par exemple) puis ajoutez cette clé au fichier "authorized_keys" par :
cat id_rsa.pub >> authorized_keys
si cela créé le fichier, donnez les droits par (sur unix) :
chmod 400 authorized_keys
Ce fichier est dans
- /home/<nom_utilisateur>/.ssh/ sous Unix /Linux / IBM i
- \Users\<nom_utilisateur>\.ssh\ sous Windows,
sauf si vous êtes administrateur auquel cas il faut ajouter la clé à \ProgramData\ssh\administrators_authorized_keys
Attention
il nous a fallu respecter, exactement le document suivant ibm10888107 quant aux droits sur ce fichier
en résumé
•Installer le module OpenSSHUtils :
Install-Module -Force OpenSSHUtils -Scope AllUsers
•réparer les droits (cette commande fait partie de OpenSSHUtils) :
Repair-AuthorizedKeyPermission -FilePath C:\Users\<votre-nom>\.ssh\authorized_keys
•enlever l'utilisateur sshd, des utilisateurs autorisés à ce fichier :
$acl = Get-Acl -Path authorized_keys;$user = 'NT SERVICE\sshd';$acl.Access|Where-Object{$PSItem.IdentityReference.Value -eq $user}|ForEach-Object {$acl.RemoveAccessRule($_)|Out-Null};Set-Acl -Path authorized_keys -AclObject $acl
Vous pouvez ensuite vous connecter, depuis ce client :
1/ en automatique, si vous n'avez pas saisi de "passphrase"
2/ en saisissant la "passphrase" (plutôt que votre mot de passe), dans le cas contraire.
Serveur Linux![]()
Windows 2016![]()
Si vos clés ne sont pas dans le cache par défaut (/HOME/(votre_nom)/.ssh)
Sur la machine source, vous pouvez utiliser l'option -i de la cde ssh
(indiquez votre clé privée et son chemin)
ou bien charger la clé en mémoire.
Pour cela, vous devez :
1/ définir l'agent pour lequel vous chargez la clé ($SHELL représente /usr/bin/sh)
2/ charger la clé en mémoire par ssh-add (par défaut id_rsa dans .ssh)
la "passphrase" vous est demandée, si vous en avez saisi une lors de la création.
____________________________________________________________________________
ssh-agent $SHELL ssh-add Entrez le mot de passe composé de /HOME/USER/.ssh/id_rsa : Identité ajoutée : /HOME/USER/.ssh/id_rsa (/HOME/USER/.ssh/id_rsa)
Ensuite, connectez vous avec ssh :
ssh cm@serveurlinux
Last login: Thu Apr 24 14:12:17 2008 from pc.volubis.intra
cm@serveurlinux:~>
vous avez ici, une ligne de commande distante,
tapez "exit pour sortir.
L'option -vvv affiche des informations de debug qui peuvent vous aider en cas d'erreur
![]()
Lancez les commandes, séparées par ; -----------------------------------------------------
|
faites un script monscript.sh ---------------------------------------- rm fichier.txt cp fichier1.txt fichier2.txt etc... EOF |
contenu de input.txt
get remoteDIR/*.xml /localeDIR
rm remoteDIR/*.xml
exit
Utilisez les commandes get pour aller chercher, put pour déposer
et la plupart des commandes unix:
- mkdir pour créer un répertoire
- cd pour changer le répertoire en cours
- rm pour détruire
- quit ou exit pour sortir
- help pour obtenir de l'aide
pour exécuter tout cela en batch, passez par QP2SHELL
SBMJOB CMD(CALL PGM(QP2SHELL) PARM('/QOpenSys/usr/bin/sh'
'sftp -b /HOME/CM/transfert.txt -o IdentityFile=~/.ssh/id_rsa +
user@serveurlinux') JOB(TRANSFERT)depuis votre PC, utilisez WINSCP (SFTP /SCP sous Windows)
Configurez la connexion comme ceci :
la clé chargée c'est la clé privée, générée par puTTYgen (voir en début de cours)
Pour lancer depuis QP2TERM une session SSH ves un autre systeme
SSH -T user@systeme
L'option -T indique a ssh de ne pas chercher un terminal TTY dans l'environnement PASE de l'IBM i.
Ce mécanisme permet d'isoler l'éxecution d'un programme et donc d'améliorer la sécurité.
Depuis décembre 2019, IBM fournit un script shell qui permet de faire un chroot pour un utilisateur (cf https://www.ibm.com/support/pages/using-chroot-ibm-i-restrict-ssh-sftp-and-scp-specific-directories).
L'emplacement du script chroot_setup_script.sh dépend de la version de l'IBM i :
A partie de la version 7.2 : /QOpenSys/QIBM/ProdData/SC1/OpenSSH/sbin
Pour lancer la commande chroot pour l'utilisateur SSHSFUSR :
CALL QP2TERM cd /QOpenSys/QIBM/ProdData/SC1/OpenSSH/sbin chroot_setup_script.sh SSHSFUSR
La commande s'exécute et provoque l'affichage suivant :
![]()
La log chroot_config.log est située dans le répertoire en cours pour le profil qui a lancé la commande.
On contrôle le HOMEDIR de l’utilisateur SSHSFUSR :
Il faut également changer la locale à *NONE :
Si l'utilisateur disposait déjà de documents dans son HOMEDIRE avant chroot (à priori /home/user), il faut copier les documents existants vers le nouvel emplacement :
CHGUSRPRF USRPRF(SSHSFUSR) LOCALE(*NONE)
CPY OBJ('/home/sshsfusr/*')
TODIR('/QOpenSys/QIBM/UserData/SC1/OpenSSH/chroot/home/s shsfusr') SUBTREE(*ALL) OWNER(*KEEP)Enfin, pour accèder plus facilement aux répertoires d'un profil chroot, vous pouvez créer des liens symboliques :
ADDLNK OBJ('/QOpenSys/QIBM/UserData/SC1/OpenSSH/chroot/home/
sshsfusr')
NEWLNK('/sshsfusr')
Vous pouvez également démarrer le service SSHD dans un autre sous-système : https://www.ibm.com/support/pages/starting-openssh-server-sshd
Vous reste à regarder tous les produits open source (partie1, partie2, nouveautés 7.4) que PASE permet d'installer
Attention : SFTP est prévu pour fonctionner sur l'IFS (root et QOpenSys de préférence).
L'utilisation sur /QSYS.LIB peut poser des soucis (par exemple : ftruncate non supporté)
Vous pouvez également personnaliser le serveur SSH, par exemple la banniere d'accueil.
Par exemple créer un fichier /usr/sshbanner.txt :
![]()
Puis dans le fichier de configuration du serveur SSH, indiquer le fichier pour la banniere :
![]()
Par défaut, l'emplacement est /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc/sshd_config
Désormais, lorsque vous vous connectez :
![]()