Aujourd'hui il est assez compliqué de déployer des logiciels sur des postes non admin sans mettre la main à la poche, ou que les solutions existantes ne conviennent pas
Je vais donc vous montrer toutes les étapes pour mettre en place un système de déploiements de logiciels via un site
Un dockerfile est présent en bas de page, lisez quand même toutes la documentation, ca vous servira
Pour cela il vous faudra :
Sur les postes Windows, il faudra :
Tout cela se fera via un script, sauf la création du certificat
Toutes les sociétés qui ont un besoin de restreindre les droits des utilisateurs, tout en leur laissant la possibilité d'installer les logiciels autorisé par le SI ou RSSI
J'ai fait en sorte que la maintenance soit minimale
Allez sur un Linux, sinon mobaxterm devrait faire l'affaire, entrer la commande suivante :
Dans notre documentation, les fichiers se nomment id_rsa et id_rsa.pub, mais ils peuvent avoir un nom différent suivant le chiffrement utilisé
Exemple : id_ed25519, ce type de clé est apparemment plus performante que le RSA
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:ktByASokdWIAgCc6OZJ9V8fEAjMxlxE9iNL5HCMBzUg root@MiniPC
The key's randomart image is:
+---[RSA 3072]----+
|O++.EBO*+X. |
|=..+o.B*B * |
|o*. o.o= = . |
|B.. .+..o |
|.o . .o S |
| . |
| |
| |
| |
+----[SHA256]-----+
Vous allez avoir deux clés sous ~/.ssh
~ signifie le chemin du répertoire home de l'utilisateur, exemple pour root
/root/
L'intérêt du script est double,
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
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"
cd /etc/Deploiement_Logiciel/
export FLASK_APP=app.py
flask run -h 0.0.0.0
* 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
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 -
Flask n'est pas fait pour la production, nous allons donc utiliser gunicorn
Nous allons procéder en deux étapes
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
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>
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)
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
product : le nom à donner est au format regex (c'est quoi ça ? :p, pas d'inquiétude je vais expliquer)
Deux cas possibles :
+*?.(){}[]
faut les annuler avec des antislash \
notepad++
donne notepad\+\+
.*
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.
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.*
va donc substituer 123.0.2.5 ou 123.0.2.6 etc...*
, je ne vais pas faire un cours sur les regex et cela suffira dans 90% des casDeux possibilités d'executable, l'exemple sera sur 7zip
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
url: 'https://www.7-zip.org/a/7z2401-x64.exe'
arg: '/S'
argunin: '/S'
product: 7-Zip
Résumé
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
Désolé si ce n'est pas très propre, je viens tout juste de me mettre à docker
Vous aurez besoin de docker pour le lancer
apt install docker.io
Il faudra téléchargez tout le dossier
https://github.com/Yoyox78/Site_Deploiement_Logiciels/tree/main/dockerfile
Si vous avez git :
git clone https://github.com/Yoyox78/Site_Deploiement_Logiciels
id_
pour qu'elle soit copiée dans le répertoire .ssh du container dockerToujours dans le dossier téléchargé
La commande suivante va permettre de build le dockerfile, cela peut prendre un peu de temps suivant les performances de la machine
docker build -t deploiement .
-t sert à tagger l'image crée
Une fois le build terminé, cette commande va permettre de lancer le container
docker run --name site -d -p 80:80 -v /root/docker/logiciels:/etc/Deploiement_Logiciel/ansible/logiciels:ro -e USER=administrateur deploiement
--name site nom que vous souhaitez donner au container
-p 80:80 sera utilisé sur le port 80, vous pouvez modifier
-v /root/docker/logiciels:/etc/Deploiement_Logiciel/ansible/logiciels:ro Remplacer /root/docker/logiciels, par le chemin complet d'accès au répertoire logiciels présent à coté du fichier dockerfile
-e USER=administrateur n'indiquer ce paramètre que si l'utilisateur administrateur des machines a été modifié, la valeur indiqué dans la ligne de commande RUN surpasse la variable présente dans le dockerfile
Ne pas oublier de faire la partie mise en place (partie Windows) au début de la page
ChatGPT m'a pas mal aidé sur le squelette des parties flask et js.
Si des dev y voit des abérrations, ne pas hésiter à apporter des modifications sur le git ou à me faire un retour
ENTRYPOINT /usr/bin/gunicorn -w 1 -b 0.0.0.0:80 --timeout 30 app:app
https://learn.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallrule?view=windowsserver2022-ps
https://learn.microsoft.com/fr-fr/windows-server/administration/openssh/openssh_install_firstuse
https://learn.microsoft.com/fr-fr/powershell/scripting/learn/remoting/ssh-remoting-in-powershell-core?view=powershell-7.3
https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/ssh-remoting-in-powershell-core?view=powershell-7.3
https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_server_configuration
https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/disable-psremoting?view=powershell-7.3
https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement