SysPass Update 2.0.0.17021302
Cet article présente la mise à jour de sysPass
en version 2.0.0.17021302
.
Sommaire
Votre avis
Nobody voted on this yet
|
|
Erreur installation
Une tentative d'installation de cette version a été réalisée par la mise à jour d'une instance 1.2.0.21. Cependant, des erreurs de mises à jour se sont produites sur la base de données. Des contraintes sont ajoutées sur les tables et rentraient en conflit avec les données existantes, qui pointaient sur des références d'utilisateurs ou comptes inexistants. Lors des tentatives de mises à jour, la page présentait le message d'erreur suivant.
Des opérations manuelles ont été nécessaires.
Téléchargement
L'application est téléchargée, en version 2.0.0.17021302, dans le répertoire /var/opt/syspass
.
#sudo wget -P /var/opt/syspass https://github.com/nuxsmin/sysPass/archive/2.0.0.17021302.tar.gz
Installation
L'application va être installée sous /var/opt/syspass
, avec modification de l'emplacement racine pour être 2.0.0.17021302
.
#sudo tar --transform 's/^sysPass-2.0.0.17021302/2.0.0.17021302/' -C /var/opt/syspass -xzvf /var/opt/syspass/2.0.0.17021302.tar.gz
Le fichier téléchargé peut être supprimé.
#sudo rm /var/opt/syspass/2.0.0.17021302.tar.gz
Propriétaire fichiers
L'installation a été réalisée avec le compte root
. Il est préférable de donner la propriété au compte de démarrage du serveur web, soit www-data
dans le cadre de cette installation.
#sudo chown -R www-data:www-data /var/opt/syspass/2.0.0.17021302
Sécurisation
Les droits mis en place seront uniquement pour le compte d'exécution du serveur Web, soit www-data
dans le cadre de cette installation.
#sudo chmod -R go-rwx /var/opt/syspass/2.0.0.17021302
Attention, les configurations passent au format XML, dans le répertoire config
. Or ceci implique qu'elles sont disponibles par simple URL. Il serait donc possible d'accéder aux configurations de l'application, comme le compte MySQL par exemple.
Ce point est abordé sur la documentation officielle afin d'interdire l'accès. Dans le cadre de cette installation, un fichier .htaccess
a été mis en place dans le répertoire config
avec le contenu suivant.
# line below if for Apache 2.4
<ifModule mod_authz_core.c>
Require all denied
</ifModule>
# line below if for Apache 2.2
<ifModule !mod_authz_core.c>
deny from all
</ifModule>
# section for Apache 2.2 and 2.4
IndexIgnore *
Configuration
Lors de l'installation, le fichier de configuration a été externalisé dans le répertoire /var/opt/syspass/common/config
. Il faut référencer cette configuration dans la nouvelle version.
#sudo rm -rf /var/opt/syspass/2.0.0.17021302/config #sudo ln -s /var/opt/syspass/common/config /var/opt/syspass/2.0.0.17021302/config #sudo chown -h www-data:www-data /var/opt/syspass/2.0.0.17021302/config
Permissions compte base de données
Suite à l'installation, les droits d'accès du compte MySql ont été réduits. Afin de s'assurer qu'aucun problème n'aura lieu, les permissions sont temporairement augmentées pour la mise à jour, en cas de modification du schéma.
mysql> REVOKE ALL ON syspass.* FROM 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON syspass.* TO 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Publication Apache
Publication
Puis le lien /var/opt/syspass/installed
doit être mis à jour afin de pointer sur cette nouvelle version.
#sudo rm /var/opt/syspass/installed #sudo ln -s /var/opt/syspass/2.0.0.17021302 /var/opt/syspass/installed #sudo chown -h www-data:www-data /var/opt/syspass/installed
Lors du premier accès, l'utilisateur doit déclencher la mise à jour.
A noter, un nouveau fichier de configuration est créé config/config.xml
, ainsi que le fichier config/pubkey.pem
. Cependant les permissions mises en place sont trop permissive car elle donne un droit de lecture à tous les comptes de la plateforme.
#sudo chmod 640 /var/opt/syspass/installed/config/*
Il faut cliquer sur le lien Mis à jour
pour déclencher la mise à jour. La première étape va modifier la base de données.
Il est demandé de renseigner le code de sécurité, qui est généré dans le fichier config.xml
au niveau de la balise upgradeKey
. Il faut également s'assurer de cocher la case en dessous de la zone de saisie, afin de confirmer qu'une sauvegarde complète a bien été réalisée.
A noter qu'il est obligatoire de cocher la case, sinon la mise à jour n'est pas déclenchée. En fin d'exécution résussie, l'utilisateur est redirigée vers la page de connection avec un message de confirmation.
Paramètres affichage
Jusqu'à cette version, il existait deux modes de navigation, classic
et material-blue
. Or seul le mode material-blue
est conservé et il faut s'assurer que tous les utiliteurs déclarés utilisent bien ce thème.
Il est possible de consulter les paramètres des utilisateurs à partir de la colonne user_preferences
de la table usrData
.
Modification script
Lors de cette mise à jour sur l'instance utilisée, un index est supprimé sur la table accounts
. Ceci est réalisé dans le fichier inc/sql/1316011001.sql
ALTER TABLE `accounts` DROP INDEX `IDX_searchTxt`;
Or cet index n'existait pas et la mise à jour n'aboutit pas, avec les messages suivants dans la log du serveur.
#0 SP\\Storage\\DB->prepareQueryData() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Storage/DB.class.php:150]\n #1 SP\\Storage\\DB->doQuery() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Storage/DB.class.php:347]\n #2 SP\\Storage\\DB::getQuery() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Upgrade.class.php:109]\n #3 SP\\Core\\Upgrade::upgradeDB() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Upgrade.class.php:64]\n #4 SP\\Core\\Upgrade::doUpgrade() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Init.class.php:647]\n #5 SP\\Core\\Init::checkDbVersion() called at [/var/opt/syspass/2.0.0.17021302/inc/SP/Core/Init.class.php:166]\n #6 SP\\Core\\Init::start() called at [/var/opt/syspass/2.0.0.17021302/inc/Base.php:109]\n #7 require(/var/opt/syspass/2.0.0.17021302/inc/Base.php) called at [/var/opt/syspass/2.0.0.17021302/index.php:31]\n, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade Error en la consulta\nSQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'IDX_searchTxt'; check that column/key exists (42000), referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade Caller 1: SP\\Storage\\DB\\logDBException, referer: ... Caller 2: SP\\Storage\\DB\\getQuery, referer: ... Caller 3: SP\\Core\\Upgrade\\upgradeDB, referer: ... Caller 4: SP\\Core\\Upgrade\\doUpgrade, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade Caller 5: SP\\Core\\Init\\checkDbVersion, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade Caller 6: SP\\Core\\Init\\start, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade Caller 7: \\require, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade SQL : 'ALTER TABLE `accounts` DROP INDEX `IDX_searchTxt`', referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Cette instruction est tout simplement supprimé du fichier.
Mise à jour base de données
De la même façon, des contraintes sont ajoutées sur la base de données. Or en fonction des données, ces ajouts ne peuvent aboutir et des erreurs sont constatées dans les log du serveur, comme l'exemple suivant.
Error en la consulta\nSQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`syspass`.`#sql-3b3_164d4`, CONSTRAINT `fk_accHistory_users_edit_id` FOREIGN KEY (`acchistory_userEditId`) REFERENCES `usrData` (`user_id`)) (23000), referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade SQL : 'ALTER TABLE `accHistory` ADD CONSTRAINT `fk_accHistory_users_edit_id`FOREIGN KEY (`acchistory_userEditId`) REFERENCES `usrData` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT', referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade initError, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade Error al aplicar la actualizaci\xc3\xb3n de la Base de Datos, referer: https://ROOT/syspass/index.php?upgrade=1&a=upgrade
Afin de corriger cette anoamlie de mise à jour, il a été nécessaire de modifier les données manuellement avant exécution de la mise à jour. Cela a été fait au fur et à mesure des tentatives en consultant les logs. Il est également possible de repérer les ajouts de contraintes dans les scripts de mise à jour, et de s'assurer que les modifications n'entraîneraient pas d'erreur.
Dans le fichier inc/sql/13161000601.sql
, la commande suivante est exécutée.
ALTER TABLE `accHistory`
ADD CONSTRAINT `fk_accHistory_users_edit_id`
FOREIGN KEY (`acchistory_userEditId`)
REFERENCES `usrData` (`user_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT;
Les données ont été corrigées en forçant la valeur de acchistory_userEditId
avec la donnée dans la colonne acchistory_userId
.
UPDATE accHistory set acchistory_userEditId = acchistory_userId
WHERE acchistory_userEditId NOT IN (SELECT user_id FROM usrData) or acchistory_userEditId IS NULL;
De la même façon, l'instruction suivante posait problème.
ALTER TABLE `accHistory`
ADD CONSTRAINT `fk_accHistory_customer_id`
FOREIGN KEY (`acchistory_customerId`)
REFERENCES `customers` (`customer_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT;
Les valeurs de la colonne account_id
, de la table accounts
, ont été injectées dans la colonne acchistory_accountId
de accHistory
quand cela était nécessaire.
UPDATE accHistory join (
SELECT account_customerId, account_id
FROM accounts
) as accounts
ON accHistory.acchistory_accountId = accounts.account_id
SET accHistory.acchistory_customerId = accounts.account_customerId
WHERE (accHistory.acchistory_customerId NOT IN (SELECT customer_id FROM customers) OR accHistory.acchistory_customerId IS NULL);
Enfin, une dernière mise à jour entraînait problème.
ALTER TABLE `accounts`
ADD CONSTRAINT `fk_accounts_user_edit_id`
FOREIGN KEY (`account_userEditId`)
REFERENCES `usrData` (`user_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT;
Cela a été corrigé en injectant dans la colonne account_userEditId
la valeur de la colonne account_userId
, quand cela était nécessaire.
UPDATE accounts SET account_userEditId = account_userId
WHERE account_userEditId NOT IN (SELECT user_id FROM usrData) or account_userEditId IS NULL;
Permissions compte base de données post install
La mise à jour étant en échec les droits du compte sur la base de données sont diminués, après avoir restauré les fichiers de configuration. Dans le cadre de cette mise à jour, cela n'était pas nécessaire. Les commandes suivantes sont exécutées.
mysql> REVOKE ALL ON syspass.* FROM 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON syspass.* TO 'syspass'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Voir aussi
Documentation officielle: https://github.com/nuxsmin/sysPass/releases/tag/2.0.0.17021302