Mise en place du site
- Activer le compte administrateur du poste, modifier le nom du compte pour plus de sécurité
- Connectez-vous une première fois dessus
L’intérêt du script est double,
- Il permet d’installer les logiciels depuis le site que l’on va mettre en place
- De pouvoir se connecter de façon sécurisée au poste via SSH plutôt que Winrm mais toujours avec powershell (v7 uniquement, utiliser -hostname plutôt que -computername)
Avant de lancez le script, pensez à activer le compte administrateur, ou tout autres comptes utilisés dans le script Connecter vous une premiere fois sur la session des comptes defini dans le script afin de créer l’arborescence des profiles
https://github.com/Yoyox78/Deploy_OpenSSH_Powershell/blob/main/Install_powershell-openssh.ps1 Voici les modifications à effectuer dans le script avant son execution sur les postes
Ligne 7 et 22 : mettre à jour l’URL par la nouvelle version au besoin
Ligne 81 : Décommenter et modifiez si vous souhaitez autoriser les accès à la machine via un groupe du domaine (par mot de passe)
Ligne 145 : permet d’ajouter une règle firewall pour le SSH, si vous êtes sur un AD, faites plutôt une GPO qui regroupe les règles firewall de vos ordinateurs, adaptez le profil suivant si le poste est sur un domaine, public ou privé
Ligne 152 : modifier le chemin ‘C:\Users\Adminrenommer’ par le compte admin que vous avez renommer (si t-elle est le cas), si vous n’avez pas renommé le compte, supprimer cette partie ,'C:\Users\Adminrenommer'
Ligne 169 : Remplacer cela (ssh-rsa ACLEPUB) par le contenu de votre fichier id_rsa.pub (clé publique générée plus haut)
Vous pouvez modifier d’autres options au besoin dans la partie variable $sshd Puis tester la connexion avec votre Linux ou Mobaxterm
Exécuter le script via un système déploiement t-elle que OCS inventory. Si vous le lancez à la main, lancez powershell ISE en administrateur
- Il vous faudra une VM avec un debian déjà en place
- Toutes les commandes sont à exécuter avec le compte root (pas biennn) Commençons par installer les package necessaire
Mettre à jour le système
apt update && apt upgrade -y
Installez les modules requis
apt install python3 python3-pip ansible python3-ansible-runner python3-flask unzip gunicorn3
Copier la clé privée sur le serveur linux id_rsa
scp ~/.ssh/id_rsa root@IPSRV:/.ssh/
Sur le serveur modifier les droits de la clé (pour la protéger, mais aussi pour éviter les erreurs par la suite)
chmod 600 ~/.ssh/id_rsa
Téléchargez le zip du site https://github.com/Yoyox78/Site_Deploiement_Logiciels
Cliquez à droite sur code puis download zip
Transférer le dossier contenant tous les fichiers Full_independant
scp ./Site_Deploiement_Logiciels-main.zip root@IPSRVDEBIAN:/
Connectez-vous sur le serveur
ssh root@IPSRVDEBIAN
Extraire le package
mkdir /etc/Deploiement_Logiciel ;unzip -f Site_Deploiement_Logiciels-main.zip && cp -fr Site_Deploiement_Logiciels-main/Full_independant/* /etc/Deploiement_Logiciel/
Modifier le fichier app.py
nano /etc/Deploiement_Logiciel/app.py
Modifier la ligne suivante en remplaçant USRADM par le nom de l’administrateur de vos postes (par défaut administrateur) :
useradm = "USRADM"
- Testons le site avant de le mettre en prod
cd /etc/Deploiement_Logiciel/
export FLASK_APP=app.py
flask run -h 0.0.0.0
- Vous devriez avoir ce retour
* Serving Flask app 'app.py'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://IPSRV:5000
- Sur le poste sous Windows, allez sur le site via l’ip http://IPSRV:5000 avec edge par exemple
- Cliquez sur installer, d’un des trois logiciels présents, Firefox par exemple
- Vous devriez voir le mode verbeux sur le serveur qui s’affiche, si tout se passe bien vous devriez avoir cela
192.168.122.238 - - [24/May/2024 12:25:34] "GET / HTTP/1.1" 200 -
192.168.122.238 - - [24/May/2024 12:25:34] "GET /static/css/main.css HTTP/1.1" 304 -
192.168.122.238 - - [24/May/2024 12:25:34] "GET /static/css/blog.css HTTP/1.1" 304 -
192.168.122.238 - - [24/May/2024 12:25:34] "GET /static/js/jquery.min.js HTTP/1.1" 304 -
192.168.122.238 - - [24/May/2024 12:25:34] "GET /static/js/chart.js HTTP/1.1" 304 -
PLAY [Installation du logiciel] ************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.122.238]
TASK [include_tasks] ***********************************************************
included: /etc/Deploiement_Logiciel/ansible/logiciel.yaml for 192.168.122.238
TASK [Download firefox] ********************************************************
changed: [192.168.122.238]
TASK [Install firefox] *********************************************************
changed: [192.168.122.238]
TASK [Supression de l'executable firefox.exe] **********************************
changed: [192.168.122.238]
PLAY RECAP *********************************************************************
192.168.122.238 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.122.238 - - [24/May/2024 12:26:43] "GET /deploy?logiciel=firefox HTTP/1.1" 200 -
- Voici le resultat après l’installation reussi
- Verifier que le logiciel est bien installer sur le poste en verifiant les programme dans ajout supression de programme
Flask n’est pas fait pour la production, nous allons donc utiliser gunicorn
Nous allons procéder en deux étapes
- Créer un service systemd avec gunicorn pour le site
- Créer un reverse proxy pour permettre l’accès en http, vous pouvez aussi le faire en https
Création du service nano /etc/systemd/system/SiteLogiciel.service
[Unit]
Description=Sert pour le déploiement des logiciels
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
WorkingDirectory=/etc/Deploiement_Logiciel/
Environment=FLASK_CONFIG=production
ExecStart=/usr/bin/gunicorn -w 1 -b 127.0.0.1:5000 --timeout 600 app:app
Restart=on-failure
TimeoutSec=60
-Execstart j’indique d’utiliser gunicorn, le timeout permet de ne pas retourner une erreur dans le cas ou l’installation du logiciel serait trop longue, J’explique cela dans les erreurs
- -w permet de choisir le nombre de worker qui travaille en simultanée
Si vous ne souhaitez pas monter un reverse proxy, il vous suffit de mettre cette ligne, vous pourrez sauter la partie d’installation et de configuration apache il est aussi possible de mettre gunicorn en ssl si vous préférez : https://docs.gunicorn.org/en/stable/settings.html
#Remplacer 0.0.0.0 par l'ip souhaitez si vous avez plusieurs carte reseau avec plusieurs IP
ExecStart=/usr/bin/gunicorn -w 1 -b 0.0.0.0:80 --timeout 600 app:app
Entrez les commandes suivantes pour l’activer
# Active le service créé
systemctl enable SiteLogiciel.service
# démarre le service
systemctl start SiteLogiciel.service
Vérifier que le service à bien démarré
systemctl status SiteLogiciel.service
Nous allons mettre en place le reverse proxy en HTTP, il serait préférable de le mettre en SSL (443)
A savoir : l’extension .local utilisée par pal mal d’entreprise pour leur domaine local, appartient à apple. Logiquement on devrait éviter de l’utiliser surtout si vous utilisez du materiel apple
Installation de apache2
apt install apache2
Activation du module pour faire le reverse proxy
a2enmod proxy_http
<VirtualHost *:80>
ServerName deploiement.TONDOMAINE.LOCAL
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog ${APACHE_LOG_DIR}/deploiement-error.log
CustomLog ${APACHE_LOG_DIR}/deploiement-access.log combined
</VirtualHost>
- App.py
- Je liste les fichiers présents dans /etc/Deploiement_Logiciel/ansible/logiciels/
- J’enlève l’extension
- je mets le tout en variable
- 7zip.yaml deviens 7zip
- J’envoie la variable dans l’index.html
- Index.html
- Une boucle affiche tous les logiciels présent dans la variable avec deux boutons
- 1 pour l’installation et la mise à jour
- l’autre pour la suppression
- Chaque bouton a un identifiant unique (le nom du logiciel)
- Quand une personne clique sur installation
- Le playbook d’installation se lance via le app.py qui est apellé avec le /deploy
- il télécharge le logiciel présent dans l’URL importé via des variables ansible
- Il installe le logiciel
- il supprime l’executable
- Quand il clique sur la suppression
- Le playbook d’installation se lance via le app.py qui est apellé avec le /remove
- Cela récupère la variable ansible contenant le nom du logiciel via les variables ansible, puis recherche le nom du logiciel dans la partie uninstall 32 et 64bits du registre Windows
- Si il la trouve, il lance la suppression
- Dans tous les cas un retour est fait à l’utilisateur, si vous n’avez pas le logiciel et que vous le supprimer vous aurez quand même un retour positif
Allez dans /etc/Deploiement_Logiciel/ansible/logiciels/ Copier un des fichiers présents
cp 7zip.yaml notepadpp.yaml
Ouvrez le fichier et modifiez les lignes
nano notepadpp.yaml
Attention à n’utiliser que des chiffres et lettres pour le nom des fichiers Exemple du fichier notepadpp.yaml:
url: 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.5.2/npp.8.5.2.Installer.x64.exe'
arg: '/S /noUpdater'
argunin: '/S'
product: Notepad\+\+
-
url mettre l’URL de téléchargement du logiciel, peut être une latest (donc toujours à jour pas besoin de mettre à jour l’URL)
- url n’accepte que des URL HTTP ou FTP
-
arg indiquer les arguments d’installation
-
argunin Indiquer les arguments de désinstallation
-
product il faut indiquer le nom de la clé présente dans le registre, il faudra donc installer le logiciel une premier fois sur le poste pour avoir l’information
- 32 bits : HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
- 64 bits : HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
-
product : le nom à donner est au format regex (c’est quoi ça ? :p, pas d’inquiétude je vais expliquer)
-
Les regex c’est des règles mathématiques pour retrouver du texte, par exemple dans le registre, sans savoir exactement ce que l’on recherche :)
-
Pourquoi tu as fait ça ?
- Parce que les petits malins de certains logiciels tels que Firefox mettent la version à la suite de Mozilla Firefox dans le registre, ce qui donne: Mozilla Firefox 123.2.35 Du coup vous remarquez le foutoir avec le temps, donc on fait de la regex basique pour vous promis
Deux cas possibles :
- Votre logiciel contient que le nom comme 7zip ou notepad++
vous mettez le nom du logiciel, attention si vous avez des caractères spéciaux
+*?.(){}[]
faut les annuler avec des antislash\
Doncnotepad++
donnenotepad\+\+
- Votre logiciel contient un numéro de version
Prenont Firefox comme exemple Mozilla Firefox 123.0.2.5
Il va donc falloir rendre générique la version pour que ansible puisse récupérer la clé
Nous allons faire une chose super simple mais imprudente, on va utiliser un wildcard
.*
le point indique n’importe quel caractère même les espaces ou tabulations, l’étoile signifie que ce caractère se répète 0 fois ou un nombre de fois illlimitée Donc le.
signifie n’importe quel caractère mais une seule fois, l’étoile va répéter n’importe quel caractère autant de fois qu’il sera nécessaire Le.*
va donc substituer 123.0.2.5 ou 123.0.2.6 etc.. - Récapitulatif: indique le nom du logiciel et le reste qui peut changer, vous mettez
.*
, je ne vais pas faire un cours sur les regex et cela suffira dans 90% des cas
Deux possibilités d’executable, l’exemple sera sur 7zip
- MSI Voici le yaml de 7zip pour du msi
url: 'https://www.7-zip.org/a/7z2405-x64.msi'
arg: '/qn'
argunin: '/qn'
product: \{23170F69-40C1-2702-2405-000001000000\}
ne pas oublier les regex d’ou l’antislash avant l’accolade ouvrante et fermante
- EXE le fichier yaml du même 7zip mais en exe
url: 'https://www.7-zip.org/a/7z2401-x64.exe'
arg: '/S'
argunin: '/S'
product: 7-Zip
Résumé
- Comme vous avez remarqué les msi n’ont pas les nom des logiciel mais des UID, il faudra donc l’indiqué
- Pareil pour les argument d’installation et de desinstallation, il peuvent différer
Pour gunicorn
journalctl -u SiteLogiciel.service
pour apache2
journalctl -u apache2.service
Pour voir les logs d’accès
tail -f /var/log/apache2/deploiement-access.log
Pour voir les logs d’erreurs
tail -f /var/log/apache2/deploiement-error.log
- Pour que l’installation soit plus sécurisée, il faudrait :
- Mettre en place un pare-feu sous Linux (UFW)
- Changement d’utilisateur pour le lancement de gunicorn qui est par defaut root
- Passer le site apache2 en HTTPS avec un certificat autosigné avec une autorité de certification que vous aurez créé et déployer sur tous les postes de votre entreprise