Bonjour,
J'ai une question assez technique, qui nécessite quelques connaissances des environnement linux.
J'ai un site sur un hébergement mutualisé OVH. Actuellement j'ai divers mots de passe stockés en clair dans des fichiers de configuration. Je voudrais stocker ces mots de passe dans des variables d'environnement linux.
Voici un exemple de code PHP que j'ai écrit, et qui permet de récupérer une variable d'environnement linux en PHP (a noter que ma fonction system pourrait avantageusement être remplacée par une fonction getenv, justement prévue à cet effet) :
$cle = system('echo $AES_KEY_BACKUP');
if ($cle=='') $logger->info('Erreur de recuperation de la cle de chiffrement');
En SSH, je parviens bien a visualiser et modifier le fichier .bashrc, associé à mon hébergement mutualisé :
cat .bashrc
# .bashrc
./connexion_ssh.sh
# User specific aliases and functions
export MYSQL_HOST="xxx"
export MYSQL_USER="xxx"
export MYSQL_PASS="xxxx"
# Ajout : variables d'environnement
export AES_KEY_BACKUP="xxx"
Hors, ca ne fonctionne pas, dans mes logs, j'obtiens un message d'erreur "Erreur de recuperation de la cle de chiffrement".
Je suis bien conscient que pour prendre en compte les modifications effectuées dans le fichier .bashrc, il faut effectuer une commande : source .bashrc. Mais d'après mes connaissances, une fois ma variable d'environnement définie dans .bashrc, elle devrait toujours être disponible.
Quelqu'un sait-il comment stocker des mots de passe dans des variables d'environnement sur un mutualisé ovh? Merci d'avance.
Bonjour,
Pas commun comme question.
Le fichier .bashrc est lu lors de l'ouverture de nouvelle session SSH. Je pense que la config des mutualisé (je n'en est pas) tourne en PHP-FPM avec un user POSIX ou LDAP peut être. Le lien entre les 2 ne me parait pas évident.
Avez vous tester cela sur un environnement dédié avec un restart session et FPM ?
Ca fonctionne ?
Je précise que j'ai fait mon test sur un script que j'exécute toutes les nuits et qui fait un backup chiffré de ma base de données. Je conserve ainsi un historique de ma base sur une longue période.
Lorsque je me connecte en SSH, je fait ensuite une commande source .bashrc, et ça fonctionne sur un web cloud OVH. Par contre, lorsque je vérifie mes logs les nuits suivantes, ça n'a pas fonctionné et j'ai une erreur. Comme si ma variable d'environnement avait été "effacée" entre temps.
Le fichier .bashrc est lu lors de l'ouverture de nouvelle session SSH.
C'est bien ce que je pensais… Du coup ma solution ne marche pas vraiment.
Par contre le framework PHP symfony préconise de stoker ses mots de passe dans des variables d'environnement. Et c'est ce que le framework fait par défaut. Pas commun comme question, mais utile à mon avis pour qui veut exécuter symfony sur un mutualisé OVH.
Il faudrait que je vérifie si symfony propose d'autres solutions.
Ok je vois, très intéressante approche.
Pas moyen de lire le .bashrc via PHP avant l'export avec un exe() ou shell_exe() ?
Si.
Ou tout simplement de faire une commande `system('export TEST="test"')`juste avant l'export.
Mais ça devient un peu le serpent qui se mord la queue, puisque le mot de passe, au lieu d'être en clair dans un fichier 'config.php' est en clair dans un autre script PHP… Le but étant de stoker le mot de passe en mémoire et non sur le système de fichier.
La solution propre serait d'exécuter une commande `export TEST="test"` à chaque redémarrage du serveur. Mais sur un mutualisé je ne maitrise pas quand le serveur est redémarré … D'où mon idée de mettre la variable dans le .bashrc, mais comme tu le dis, le .bashrc est rechargé à chaque connexion SSH et non lors du redémarrage du serveur.
Par contre, comme bidouille pour faire tourner symfony sur un mutualisé, ça peut peut être le faire. A tester.
>Ou tout simplement de faire une commande system('export TEST="test"')juste avant l'export.
je pensais à un shell_exe("source PATH_TO_HOME/.bashrc")
> Le but étant de stoker le mot de passe en mémoire et non sur le système de fichier.
Le pass est bien dans un fichier (.bashrc), par contre, il est normalement hors de porté d'Apache (ou Ngnix) ou de PHP-FPM (si open_basedir est configuré).
Je crois savoir qu'avec Synfony le document_root est sur un dossier supérieur 'public' ou justement les fichiers de config n'y sont pas…
En écrivant cela, je me rend compte qu'en modifiant via le manager le document_root Apache, si l'open_basedir PHP ne suis pas cette valeur, alors le pass situé en dessous sera accessible par PHP.
Je ne suis pas très calé dans ce genre de truc mais si tu veux un pass uniquement en RAM, à part le taper manuellement et le conserver le maximum de temps dans un cache persistant, je ne voie pas.
Peut être envisageable sur une machine dédié ou tu peux contrôler les timeout opcache et que tu sais qu'il faut retaper le pass à chaque reload PHP ou reboot. Ca me parait vraiment contraignant comme concept.
Merci pour cette idée.
Pour l'instant je ne l'ai pas implémentée et j'ai remis ma clé dans un fichier de paramètres.
Si je finis par installer symfony sur un mutualisé je ferais un retour sur ce forum.