# **Exam DevSecOps Enzo Croci, Dorian Danin, Florian Millet** # Setup de l'env de travail ``` mkdir Exam cd Exam git clone -b master https://gitlab.com/soufien_abdessadeq/ecommerce-flask.git git clone -b master https://gitlab.com/soufien_abdessadeq/web-backend-flask.git ``` ## Test dans un environnement virtuel en local ![](https://i.imgur.com/MQOVm0W.png) ![](https://i.imgur.com/9uNhVLm.png) on run l'app a la main dans le virtualenv `flask run -h 0.0.0.0 -p 5000` ![](https://i.imgur.com/dPVyQ0D.png) ![](https://i.imgur.com/44GoUEC.png) ### docker file ![](https://i.imgur.com/jPdqQid.png) #### back ``` FROM python:3.9 COPY requirements.txt . RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN export FLASKAPP=run.py RUN export FLASKENV=development CMD ["flask", "run", "-h", "0.0.0.0", "-p", "5005"] ``` #### front ``` FROM python:3.9 COPY requirements.txt . RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN export FLASK_APP=run.py RUN export FLASK_ENV=development CMD ["flask", "run", "-h", "0.0.0.0", "-p", "5000"] ``` #### Build image ![](https://i.imgur.com/od0vifZ.png) ### Docker-compose #### Back ``` version: '3.9' services: back: container_name: back restart: always build: . ports: - "5005:5005" networks: - back_network networks: back_network: driver: bridge ``` #### Front ``` version: '3.9' services: front: container_name: front restart: always build: . ports: - "5000:5000" networks: - front_network networks: front_network: driver: bridge ``` ### Docker compose concaténé ``` version: '3.9' services: back: container_name: back restart: always build: web-backend-flask ports: - "5005:5005" networks: - back_network front: container_name: front restart: always build: ecommerce-flask ports: - "5000:5000" networks: - front_network networks: back_network: driver: bridge front_network: driver: bridge ``` ## Optimiser les images Pour Diminuer la taille des images, retirer le superflux des requirements comme gunicorn et les dépendances inutiles, utiliser une image slim ou alpine, limiter au strict nécéssaire les sources et les imports. ## Ajout de produit Nous allons dans les src de l'app et nous ajoutons le produit voulu, ici nous faisons une paire de gant supplémentaire. ![](https://i.imgur.com/PHucNqP.png) Nous ajoutons les images et couverture pour nous produit ![](https://i.imgur.com/pVHM0lV.png) ## App scaling ### Docker-compose.yml ``` version: "3" services: app: build: app nginx: container_name: nginx build: nginx ports: - "3000:3000" depends_on: - app ``` ### nginx.conf ``` events {} http { # Define the group of servers available upstream app { server projetcursusdev2022-app-1:5000; server projetcursusdev2022-app-2:5000; server projetcursusdev2022-app-3:5000; server projetcursusdev2022-app-4:5000; server projetcursusdev2022-app-5:5000; } server { # Server group will respond to port 3000 listen 3000; server_name app.com; location / { proxy_pass http://app; } } } ``` ### Shell `docker compose up --build -d --scale app=5` ### Docker ps on voit bien les conteneurs tourner ![](https://i.imgur.com/2yyrvAY.png) ## diagramme de l'architecture ![](https://i.imgur.com/ZgmfNKi.png) # Questions ###### • En quoi Docker s'inscrit dans la méthodologie DevOps ? Les conteneurs préviennent les conflits d’applications entre les différents environnements. Les conteneurs proposés par la solution Docker rapprochent les développeurs et l'IT, en facilitant la collaboration. Docker va également nous permettre de lancer des app très rapidement afin de pouvoir les tester dans un environnement qui va ressembler a la prod final et d'allier le dev et l'ops ###### • Quel autre élément auriez-vous pu ajouter afin de tester votre application avec la méthodologie CICD de manière automatisée ? Nous aurions pu utiliser des outils comme sonarQB ou autre outils de tests automatisés ###### • Quel autre moyen choisiriez-vous si on vous demandait un déploiement en production "le plus rapide possible" dans le cloud ? Nous pourrions passer par des services serverless ou des fonctions pour servir des sites statics. AWS permet également de servir des sites static via les service de stockage S3 ###### • Quel élément auriez-vous pu ajouter afin de protéger les machines d'internet ? Afin de protéger les machines d'internet nous pouvons mettre en place un firewall ainsi qu'un proxy en front, différents réseaux. On peut également modifier les ports par default entre containers et proxy et les fichiers .conf afin de pas garder les configurations par défault. ###### • Quel élément auriez-vous pu ajouter afin de stopper les attaques avant qu'elles ne parviennent à votreinfra ? Nous pouvons ajouter un CDN comme CloudFlare, ou bien encore des services comme AppArmor, SELinux, GRSEC… ###### • À partir de quelle étape la culture DevSecOps intègre la sécurité ? Le DevSecOps intervient et intègre les solutions de sécurité pendant les étapes de développement et de déploiement d’une application. Cette approche doit se faire dès la génèse du projet afin d'être éfficace.