# Project BTC24.1 #### Hamza Azarhoun & Mina Arafat ### Installation lxc et lxd Nous allons utiliser lxc/lxd pour la création ainsi que la manipulation des différents conteneurs. Pour cela, nous allons utiliser les commandes suivantes sudo apt install lxc ensuite snap lxd pour terminer avec lxd init pour initialiser le package . Mais avant cela, nous allons mettre à jour nos systèmes d'installation des paquets grâce à la commande qui suit : apt-get update && apt-upgrade ### Partie I ### Creation et configuration de conteneurs (Ansible) Dans cette partie, nous allons utiliser divers conteneurs .... Un playbook sera ensuite utlise afin de garantir la mise en place de la configuration. Ce dernier nous permettra d assurer le bon fonctionnement de toute la configuration...... #### Mise en Place Ansible * Installation Nous allons .... - apt update - apt install software-properties-common - add-apt-repository --yes --update ppa:ansible/ansible - apt install ansible ` #### Premiere étape : création d" un utilisateur et configuration du réseau** Dans cette partie, nous allons commencer par créer un réseau dans le playbook. Tous les réseau qui ont été crée seront ensuite connectés au divers conteneurs, ce qui nous permettera d"obtenir une certaine architecture (voir partie :: pour schema) ### - Créer un fichier avec une extention (.yml) que vous nommerez comme vous voulez. Ex: setup.yml - Indiquer les informations comme sur cette image - création de notre utilisateur btc - création de deux réseaux différents (réseau-A1 et réseau-B1) ### ![](https://i.imgur.com/OcJDTLB.png) Création des différents conteneurs à l'aide du fichier playbook avec ansible Playbook: Nous continuons à alimenté notre fichier playbook en procedant désormais à la création des conteneurs. On indique le type de distribution utilisé (dans notre cas , il nous était imposé d"utiliser ubuntu:22.04) puis indiquer l"etat du conteneurs, le nom ...etc/ Container_command: Nous permet d executer des commandes dans les differents conteneurs. Les commandes que nous lancons dans les conteneurs nous permettent de mettre en place le DNS et l"environnement du réseau. ![](https://i.imgur.com/XE8Ouei.png) - Creation de la cle / mise en place de la connexion ssh entre nos divers conteneurs et notre machine virtuelle contenant (ansible) ![](https://i.imgur.com/MB2SCYc.png) ### Lancement des conteneurs / mise en place pour une connexion au réseau Maintenant que le réseau et les conteneurs sont créés , nous allons connecter les divers conteneurs au reseaux: - Server1 et Server2 seront dans le reseu-A1 et en meme temps dans le réseau-B1 - Cluster dans le reseau-A1 - server_backup et serverBDD dans le reseau-B1 Les conteneurs seront donc lancer de cette maniere et seront grace a cette configuration reseau rattaches au reseau prealablement cree. NB: rehiter cette operation pour le lancement des autre conteneurs , attention au different reseaux. Utiliser le bon conteneur pour le bon le reseau , suiver l architecture de base (voir schemq partie 6) ![](https://i.imgur.com/BpXjOOC.png) ![](https://i.imgur.com/nDM6gRw.png) Apres avoir creer et s etre connecter au conteneurs, nous allons continuer la mise en place de lq configuration ssh entre notre machine virtuelle qui contient ansible et nos conteneurs. Pour cela : - acceder au fichier /etc/hosts puis inscrire les addresses ips des differents conteneurs en leurs attribuant un nom d'hote. - acceder au fichier /etc/ansible/hosts ajouter une nouvelle categorie, dans notre exemple [webservers]: nom-de-votre-serveur (comme indiquer dans le fichier etc/hosts) Ensuite de retour dans notre playbook: incrire les informations suivantes sans oublie de redemarrer les services. ![](https://i.imgur.com/JdCgY7t.png) **PREMIER TEST!** Dans le repertoire ou se trouve le playbook. ansible-playbook nom-du-playbook.yml ![](https://i.imgur.com/j9f9oBc.png) ### Installations des paquets dans les conteneurs Afin de pouvoir continuer à mettre en place la configuration demandée , nous allons proceder à l"installation des divers outils necessaire. Suivre l¨énonce afin d'installer les bon paquets aux bons contenenurs sans oublie d installer python3 sur chaque machine pour que ansible puisse communiquer avec nos conteneurs. ![](https://i.imgur.com/EXuipDt.png) **TEST !** Dans le repertoire ou se trouve le playbook. ansible-playbook nom-du-playbook.yml ![](https://i.imgur.com/SRvOoKM.png) Nous pouvons en profiter pour faire la configuration du loadbalancer dans notre conteneur cluster avec nos deux autres serveurs. ![](https://i.imgur.com/Lww0SMz.png) ### Synchronisation (serverBackup / servers-Web) Dans cette partie notre objectif principal est de pouvoir synchroniser un fichier entre nos serveurs web et notre server-backup. Cette synchronisation sera automatiser avec cron que nous avons installer plus haut dans le serveur-backup. Premierement pour obtenir cette synchronisation il faut d´abord mettre en place une connexion ssh securise entre ces trois containeurs. Cette procedure ce fera sur differentes etapes: * Creation de la cle dans notre conteneur (server-Backup) * Transfere de la cle (publique et non prive)vers notre machine que l on placera dans un emplacement bien specifique ![](https://i.imgur.com/niX72cZ.png) * Envoyer cette cle publique stoquer en locale vers nos autres servers que l on placera dans le dossier ~/.ssh/ * Placer cette clee dans un dossier authorized_keys (toujours dans nos serveurs) ![](https://i.imgur.com/lgDbCSY.png) Maintenant que la synchronisation est en place nous pouvons configurer notre crontab afin d automatiser cette tache. Ici on specifie bien d executer cette tache toutes les 5 minutes. ![](https://i.imgur.com/YKaqztA.png) ### MISE EN PLACE DU FAIL2BAN Ici nous avons comme objectif d¨utiliser le paquet fail2ban dans notre conteneur (serveur-backup). Comme l installation est deja faite nous pouvons directement commencer par la configuration de ce dernier. Toujours dans ce conteneur (dans votre playbook) : Nous allons copier le ficher jail.conf et le copier afin de proceder a sa configuration. - name: update configuration file - /etc/fail2ban/jail.local template: src: etc/fail2ban/jail.conf dest: /etc/fail2ban/jail.local owner: root group: root mode: 0644 notify: restart fail2ban ``` - name: Configure fail2ban ssh section fail2ban: ssh_enabled: true ssh_port: ssh ssh_filter: sshd ssh_logpath: /var/log/auth.log ssh_maxretry: 5 become: true ``` Ne pas oublier de redemarrer le service - name: Restart fail2ban service service: name: fail2ban state: restarted become: true Maintenant que toutes les parties sont faites, il nous suffi d'executer le playbook avec la commande suivante: Dans le repertoire ou se trouve le playbook. ansible-playbook nom-du-playbook.yml # Partie 2 : Orchestration Jenkins ### Définition : Jenkins est un outil logiciel d'intégration continu. Il s'agit d'un logiciel open source, développé à l'aide du langage de programmation Java. Il permet de tester et de rapporter les changements effectués sur une large base de code en temps réel. ### Installation #### on commence par installé les outils qui fonctionné Jenkins : Java on vérifie bien si on l'a déjà d'installé ![](https://i.imgur.com/wD82lJH.png) on met à jour nos packages, puis on installe OpenJDK 11 : ![](https://i.imgur.com/xxVN3tZ.png) #### Ensuite, on rajoute le repository Jenkins dans nos source.list : ##### Récupère la clé avec : `wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | apt-key add -` ##### on la met sur notre fichier sources.list.d : `sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ /etc/apt/sources.list.d/jenkins.list'` ![](https://i.imgur.com/nyhWMl8.png) Cepandant notre clé pkg n'etait pas bien signé car le repository utilisé n'est pas à jour. 1. on peut soit rajouter la clé manuellment : `sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <La clé>` ![](https://i.imgur.com/ZTodK8Y.png) 2. changer le repository utilisé: `sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list' ` ![](https://i.imgur.com/Lb2pkuo.png) il suffit de mettre à jour le repository `apt update` et installer jenkins. ![](https://i.imgur.com/MWC3BqI.png) En suite, on active le port 8080 ![](https://i.imgur.com/LfzB7t7.png) #### on se connecte sur notre navigateur http://localhost:8080/ ![](https://i.imgur.com/lYsmoPH.png) En suivant les étapes d'installation, on peut utiliser Jenkins. ![](https://i.imgur.com/gWKyIbm.png) ![](https://i.imgur.com/CjTkSpx.png) #### install suggested plugins ![](https://i.imgur.com/YvhOyjP.png) #### on attend que l'initialisation se termine ![](https://i.imgur.com/QxTdXDn.png) #### on crée un utilisateur admin ![](https://i.imgur.com/iy9JzwW.png) #### on configure l'url Jenkins ![](https://i.imgur.com/G1Su3rg.png) ### on peut maintenant commencer à utiliser Jenkins ![](https://i.imgur.com/rBLTfAN.png) #### interface Jenkins: ![](https://i.imgur.com/DDwPlYk.png) Pourqoi créer un agent pour gérer les jobs ? ------------------------------ mis en place d'un agent avec une connexion SSH : Dashboard>Nodes> New Node : ![](https://i.imgur.com/lpvMM8c.png) root directory : l'emplacement de jenkins labels : ![](https://i.imgur.com/5INXw6R.png) Création d'un "credential" : on crée une clé ssh `ssh-keygen` on copie colle la clé privée dans le jenkins. ![](https://i.imgur.com/IGKANVd.png) ![](https://i.imgur.com/NLDoBxh.png) ensuite, on met la clé publique dans l'authorized_keys. ![](https://i.imgur.com/gdPOcN6.png) puis, on ajoute ce "credential" sur la configuration de l'agent : ![](https://i.imgur.com/32ghssu.png) ### on lance l'agent : Si tous fonctionne bien on aura ça dans les logs: ![](https://i.imgur.com/jDmzrJt.png) ### Connexion et lancement des jobs a l'agent : on connecte le job a travers le 'label' qu'on a donner a l'agent : ![](https://i.imgur.com/TlS4NDE.png) ### on rajoute le script qu'on veut dans la partie 'build steps' : ###### on a choisi 'execute shell' : ![](https://i.imgur.com/cy0MiyF.png) ## Création du job "Demo" : #### Ce job consiste à créer un conteneur et installer SSH : ![](https://i.imgur.com/DVYBx6o.png) ![](https://i.imgur.com/0bwOaIM.png) ## Création du job "static" : #### -- créer un conteneur et lancer un playbook ansible. ![](https://i.imgur.com/HtAVg0U.png) ![](https://i.imgur.com/ftvRJJ4.png) ## Création du "parametered" : ![](https://i.imgur.com/cqmFXYA.png) ![](https://i.imgur.com/1kLcf6e.png) ## Partie 3 - Gestions des événements. Dans cette partie, on crée : - une bdd avec un utlisateur 'ProfDeMath' dedans avec un mdp hashé. #### Mise en place de la Base de donnée sur PhpMyAdmin. ![](https://i.imgur.com/XDeFenh.png) #### Avec un utilisateur 'ProfDeMath' et un mdp hashé: ![](https://i.imgur.com/7ixljjz.png) ### Mise en place de l'application PHP et la déployer sur GitHub. - Une application PHP 'login'. Ou l'utilisateur se connecte en avec le nom d'utilisateur 'ProfDeMath' et le MdP '12345' : * Page Welcome.php ![](https://i.imgur.com/Xb9NJv7.png) * Page index.php : (on récupère les entrées des utilisateurs et on les valide avec les données de la BDD) ![](https://i.imgur.com/cqSkTn0.png) ![](https://i.imgur.com/kTIFd16.png) ## la page d'accueil : ![](https://i.imgur.com/LMxfxPu.png) ## Après connexion : ![](https://i.imgur.com/Dym1Hvr.png) ## Test Unitaire : #### - Vérifier qu'on ne récupère pas d'input vide #### - Vérifier que les valeurs entrées sont bien 'ProfDeMath' et '12345' : #### - Vérifier la connexion avec la BDD : ![](https://i.imgur.com/48ZBa86.png) #### on met l'application sur un repo git: ![](https://i.imgur.com/uKsYo7d.png) ## Création du job traceur de repo git : on coche la case 'GitHub projet' et on rajoute le lien de notre repo git : ![](https://i.imgur.com/zZSGLrK.png) Ou on peut juste cloner le git directement: ![](https://i.imgur.com/jt1NkJm.png) ![](https://i.imgur.com/ZniThqJ.png) ## Partie 4 : Docker - JOB ## Partie 4 – Docker - Dockerfiles Dans cette partie notre objectif est de creer une certaines architecture semblable a celle du ansible mais cette desormais nous utiliserons Docker (dockerfiles et docker compose). Docker est une technologie innovante nous permettant de creer des conteneurs tres leges. Ces differents conteneurs sont bases sur des images elles meme crees a l aide d'un Dockerfile. Toute cette architecture sera dans notre cas orchestre par un docker-compose. Celui-ci permet de creer des images avec les dockerfile et en meme temps de creer des conteneurs base sur ces images. Nous pouvons egalement connecter directement nos conteneurs au reseau avec le docker-compose , ces reseau eux meme creer avec le dokcer-copompose. Toute une architecture et une configuration orchestrer par le docker-compose, ce qui est un reel avanatage. Nous allons utiliser cette technologie dans cette partie. #### Creation des Dockerfiles pour chaque conteneurs Pour obtenir une bonne organisation. nous allons creer dans notre repertoire des dossier specifique pour chaque dockerfile de chaque conteneurs. De maniere generale la nomenclature d un Dockerfile est assez simple. Nous commencons toujours par definir sur qu elle autre image sera base '(from ubuntu:latest)'. La commande RUN nous permet tout simplement d executer des commande dans notre conteneurs. ![](https://i.imgur.com/1ivEhWN.png) Dockerfile : servers ##### petite configuration ssh pour la synchronisation en ssh. ![](https://i.imgur.com/Z5W4wNc.png) Dockerfile: server-backup mise en place egalement de la synchronisation ![](https://i.imgur.com/oWycmQg.png) Dockerfile: server-bdd Definir les variable d environnement (mot de passe- nom d utilisateur ), ici nous allons meme creer une base de donnees dans notre dockerfile. ![](https://i.imgur.com/v5TmCTt.png) Dockerfile: cluster(proxy) ![](https://i.imgur.com/ji7gctZ.png) Une fois que les Dockerfiles sont creer, il nous suffit maintenant de creer notre orchestrateur (docker-compose.yml). y acceder avec nano docker-compose.yml - Nous commencons par lui donner la versions ensuite nous allons directement creer les differents reseaux comme ceci. ![](https://i.imgur.com/t4dMXJR.png) ### NOMENCLATURE DU DOCKER-COMPOSE - variables - image: donner le nom de l'image - build: indiquer l'emplacement du fichier Dockerfile qui permettra la creation du conteneur - container_name: nom-du-conteneur - volumes (ils permettent d´envoyer des donnees d'un conteneurs vers un autres ou sinon depuis l'hote vers le conteneur ou inversement) : Nous les utiliserons pour transferer la cle publique depuis le conteneur backup vers les conteneurs serveursweb. - ports: definir le port sur lequel ecouter (du conteneurs) - networks : permet de connecter le conteneur au reseau prealablement creer. - Creation des servers 1 et deux avec le docker-compose. ![](https://i.imgur.com/7P2fCSc.png) - Creation du conteneur (proxy) Afin de mettre en place le loadbalancing least-conn; nous avons creer un fichier de configuration (loadbalancing) que nous allon transferer vers /etc/nginx/conf.d/defaut.conf ((dans le conteneur)), tous cela sera envoyer grace au Volumes disponible dans docker-compose. ![](https://i.imgur.com/Re784Vi.png) - Creation conteneur BDD ![](https://i.imgur.com/jURWSqM.png) ! ATTENTION : ne pas oublie de definir les volumes tout en bas de votre fichier comme ici ![](https://i.imgur.com/6Mz0SGv.png) ### Test Afin d'executer notre docker-compose il nous suffit d'utiliser la commande suivante dans le repertoire dans lequel se trouve le docker-compose.yml ``` docker-compose up -d ``` ![](https://i.imgur.com/ECceYkz.png) Tout nos conteneurs sont maintenant bien crees et lances. si nous utilisons l adress ip des servers ou tout simplement avec localhost:le-port-declare-dans-docker-compose sur notre navigateur nous pouvons voir le conteneu du serveur. ![](https://i.imgur.com/jyVmGAK.png) - loadbalancing fonctionnel: Toujours avec l'adresse ip du conteneut proxy ou juste avec localhots:ports-proy nous voyons le conteneur des premiers serveurs. ![](https://i.imgur.com/Ls0RpKL.png) - Synchronisation ssh (serveur-backup/serveurs) fonctionnel depuis le conteneurs serveur-backup il nous suffit de faire un curl sur l adresse ip des serveurs. ![](https://i.imgur.com/4weapw1.png) - Contenurs base de donnees fonctionnel Pour verifier , il nous suffit de pouvoir se connecter au conteneur-bdd avec la commande suivante (docker exec -it server_bdd bash) ensuite avec la commande : mysql -u root -p , nous pourrons acceder a la base de donnee. nous indiquerons alors, le nom d utilisateur et le mot de passe comme indiquer dans le dockerfile. ![](https://i.imgur.com/koxY1n5.png) Nous voyon ici , la base de donnee (test) que nous avons creer a l aide du dockerfile grace au variable d environnement. ![](https://i.imgur.com/Nl8Dclz.png) ![](https://i.imgur.com/lOuozH9.png) ### TEST FAIL2BAN Afin de tester le fail2ban il nous suffit de lancer cette commande depuis un conteneurs extern : ssh root@ip-cnt-server-backup puis verifier en vous rendant dans votre conteneur contenant le fail2ban : - fail2ban-client status sshd ## Partie 5 : Mutualisation.